Tomcat

常用的配置:

  • 虚拟路径映射,在conf/server.xml文件中<Host>节点下添加 :
 <!-- 将地址栏的路径映射到硬盘上的对应路径 -->
 <Context path="/mldn" docBase="e:\mldn"></Context>
  • 修改默认端口,在server.xml文件中的<Connector>节点中设置 :
 <!-- 设置为80端口 -->
 <Connector port="80" protocol="HTTP/1.1"
  connectionTimeout="20000" redirectPort="8443" />
  • 启用文件索引功能,便于测试,在conf/web.xml中添加 :
 <param-name>listings</param-name> 
 <param-value>true</param-value>

## JSP 三种注释 :

  • <?-- 显式注释 --> 会发送客户端
  • JAVA注释
  • JSP自有注释 <%-- JSP注释--%>

三种Scriptlet,与类的结构相比较是一一对应的 :

  • <% %> 定义局部变量
  • <%! %> 定义全局变量,常量,方法,类
  • <%= expression %> 输出结果

例如 :

 <%
 //定义局部变量,在当前JSP页面中有效
 String path = request.getContextPath();
 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 %>
 
 // 在HTML的head中添加此行,则HTML中资源文件的路径定位都相对于根目录
 <base href="<%=basePath%>">

page指令,在JSP页面的开头设置当前页面的一些属性,以<%@ page attr="value" %>形式,常用属性 : pageEncoding(页面编码) contentType (MIME type,默认即为text/html) import 导包;

 //MyEclipse中自动生成的page指令
 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

将JSP页面导入到其他JSP页面中的两种方式(用于将形成一个可以复用的组件页面):

  • 静态包含指令<%@ include %>,用于导入静态的HTML : <%@ include file="filepath"%>,包含发生在JSP转化为Servlet时.
  • 动态包含标签<jsp:include>,用于导入动态的JSP : 对于静态页面:<jsp:include page="filepath"/>,包含发生在提交request请求时.
    • 动态包含标签可通过子标签传递request属性参数: ` ..... ` ## 内置对象 JSP中提供有9个内置对象,可以JSP页面中通过对象名称直接引用.常用的6个内置对象、对应的类以及用法如下:
  • pageContext : javax.servlet.jsp.PageContext,指的是当前页面范围内的操作
  • request : javax.servlet.http.HttpServletRequest,服务器端接收客户端请求内容
  • response : javax.servlet.http.HttpServletResponse,服务器端回应客户端的请求操作
  • session : java.servlet.http.HttpSession,描述一个用户连接的范围
  • application : javax.servlet.ServletContext,描述整个当前项目的上下文
  • config : javax.servlet.ServletConfig,取得默认的配置信息

属性的三种操作方法:

  • 设置属性:public void setAttribute( String name ,Object value)
  • 取得属性:public Object getAttribute (String name)
  • 删除属性:public void removeAttribute(String name)

拥有以上方法的四种内置对象的作用范围:

  • pageContext: 在当前页面有效
  • request: 服务器端跳转(地址栏不变),可以传递request,其中属性可以一直保留. 客户端跳转(地址栏改变)将失去属性
  • session: 描述的是一个用户的信息,随浏览器关闭失去属性
  • application: 保存在服务器上,服务器关闭失去属性

pageContext 对应的类 javax.servlet.jsp.PageContext 提供有各种范围的属性操作方法

  • 设置属性 public abstract void setAttribute(String name, Object value, int scope)
  • 取得属性 public abstract Object getAttribute(String name, int scope)
  • 删除属性 public abstract void removeAttribute(String name, int scope)
  • scope 由PageContext 中的常量设置 分别为 PAGE_SCOPE ,REQUEST_SCOPE, SESSION_SCOPE, APPLICATION_SCOPE. ### request对象api
  • 取得参数的方法:request对象的 public String getParameter( String name).参数的来源有 :
    • 表单提交
    • 标签传递,如<jsp:include ><jsp:forward>中可以添加<jsp:param name=value>标签传递参数
    • URL中的查询字符串
  • getParameter()对于同名属性仅能接收一个值, 通过public String[] getParameterValues(),得到同名的所有的值.
  • 乱码问题:在调用getParameter()前调用 public void setCharacterEncoding(String env)方法设置Encoding.
  • public Enumeration getParameterNames();返回所有的参数名,从而迭代出所有的参数.
  • 取得header信息 : public Enumeration getHeaderNames(); public String getHeader(String name);
  • public String getContextPath (),获取项目虚拟根目录,即在Tomcat的server.xml 中配置的<Context path=".."/> path属性 ### response对象api
  • 设置回应编码 : public void setCharacterEncoding( String charset);
  • 设置页面MIME类型 : public void setContentType(String type); 与page 指令中的contenttype属性对应
  • 设置头信息: public void setHeader(String name, String value);
  • 自动刷新:setHeader("refresh","time interval") 指定时间自动刷新
  • 自动跳转:setHeader(“refresh”,”2;URL=path”) 指定2秒时间后跳转(客户端跳转)
  • 页面重定向: public void sendRedirect(String location) throws IOException (客户端跳转) ### Cookie(javax.servlet.http.Cookie) Cookie是在通过response对象保存在客户端上的数据,每次会随着头信息发往服务器 (服务器端跳转时操作的Cookie将不能立即生效,程序没有运行到response阶段)
  • public Cookie(String name,String value);
  • public String getName();
  • public String getValue();
  • public void setMaxAge(int expiry) 设置Cookie 过期时间(timescale : s)秒
  • public void setPath(String url),设置Cookie的保存路径,一定要设置,不然将无法保存,一般设置到根目录即可,用 “/” 表示根目录 ( 如果”/” 出现问题,尝试request.getContextPath()路径)
  • response保存Cookie: public void addCookie(Cookie cookie) ### session 对象 (javax.servlet.http.HttpSession)
  • 取得SessionID:public String getId(); 保存在Cookie 中的 JSESSIONID
  • 让当前的Session失效 : public void invalidate();(注销)
  • 判断是否为新用户: public boolean isNew()
  • 登录验证:判断session.getAttribute("ID")是否为null验证是否登录, 登录后setAttribute("ID","value") ### application 对象(javax.servlet.ServletContext) 在servlet中通过getServletContext()方法得到 application对象
  • public String getRealPath(String path); 取得虚拟映射对应的真实路径,配置虚拟目录时指定的两个属性
    • path属性: request.getContextPath() 取得
    • docBase属性 :application.getRealPath() 取得; ### config 对象(javas.servlet.ServletConfig) 在WEB-INF目录下的文件是默认不可访问,可以在web.xml中进行映射配置而后可以访问.以达到更高的安全性
  • 取得初始化参数内容 : public String getInitParameter(String name)
  • 取得所有初始化参数名字 : public Enumeration getInitParameterNames() ## Servlet 继承javax.servlet.http.HttpServlet类,按照规则覆写其中的方法,主要是doGet(),doPost()方法.然后在web.xml文件中配置定义的Servlet,<servlet>节点配置的是servlet程序类信息,而<servlet-mapping>配置的是映射路径.
 <servlet>
     <servlet-name>hello</servlet-name>
     <servlet-class>cn.mldn.demo.HelloServlet</servlet-class>
     <init-param>  <!-- 设置初始化参数,可以通过config对象得到 -->
        <param-name>data</param-data>
        <param-value>HELLO</param-value>
     </init-param>      
     <load-on-startup>1</load-on-startup>   <!--设置Tomcat启动时自动初始化Servlet-->
 </servlet>
 <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello.do</url-pattern>
 </servlet-mapping>

Servlet类中取得常用内置对象的方法

  • request,response : 通过doGet(),doPost()方法参数取得
  • config : 通过HttpServlet中的public ServletConfig getServletConfig()对象取得
  • application : 通过 HttpServlet中的public ServletContext getServletContext()方法取得
  • session : 通过 HttpServletRequest 中的 public HttpSession getSession()方法取得

Servlet实现跳转

  • 客户端跳转: HttpServletResponse.sendRedirect(String location);location可以相对当前请求的路径,如果使用”/”表示当前容器的根目录(域名层).
  • 服务器端跳转:
    • 通过 HttpServlet中的public ServletContext getServletContext()方法取得 ServletContext 对象; ServletContext对象方法 public RequestDispatcher getRequestDispatcher(String path); 这个路径必须使用”/”开头,表示相对于根目录.
    • 通过HttpServletRequest中的public RequestDispatcher getRequestDispatcher(String path),此处的路径可以是相对路径(相对于当前的servlet),也可以是用”/”表示根路径
  • RequestDispatcher 中两个方法:
    • 跳转: public void forward(ServletRequest request, ServletResponse response)
    • 包含: public void include(ServletRequest request, ServletResponse response) ## EL表达式语言 EL用于简化JSP<%= %>标签,基本的使用方式如下:
  • ${属性名称} : 取出四种属性范围中设置的内容,如果属性不存在,则会使用空字符串( “” ),而不是使用<%= %>标签时输出的NULL .可以指定属性范围取出内容: ${pageScope.属性名} , ${requestScope.属性名} , ${sessionScope.属性名} , ${applicationScope.属性名}.
  • ${param.参数名称} 取出请求参数
  • EL中可以使用 == 直接判断 基本类型包装类、String 的相等关系,例 : ${param.msg == 'hello' ? "true" : "false"}; ${param.msg == 10 ? "true" : "false"}
  • EL对象: ${pageContext.request.contextPath}; 与Java代码pageContext.getRequest().getContextPath()对应,用反射完成,调用相应的getter()方法.相应的,EL可以调用VO类中的getter()方法,例如 : ${emp.empno},${emp.dept.deptno}
  • EL表达式对于集合的操作都是以数组的形式,例如List集合可以使用 ${listName[index]} 取出其中元素,而Map集合可以使用 ${mapName["key"]} 取得指定value ## JSTL标签编程 配置c标签 :解压 JSTL.jar找到其中的c.tld文件,JSTL.jar放在WEB-INF的lib目录下,c.tld放在WEB-INF目录下,在web.xml文件中配置jstl的映射路径
 <jsp-config>
     <taglib>
         <taglib-uri>http://www.xxx.cn/c</taglib-uri>       
         <taglib-location>/WEB-INF/c.tld</taglib-location>
     </taglib>
 </jsp-config>

在JSP页面引用配置好的标签 : <%@ taglib prefix="c" uri="http://www.xxx.cn/c" %>,用taglib指令将标签引入到jsp文件中,prefix表示在使用标签时是<c:xx>这样的形式.

  • <c:if test="${EL表达式}" var="变量名" scope="request/..." ></c:if>标签
    • test:主要是使用EL编写判断,结果为真,则标签体执行.
    • var: 将EL判断的结果(true or false)保存在var声明的变量中
    • scope:设置判断结果的保存范围,默认是pageContext范围,可以设置为request,session,application
  • <c:forEach items="${保存集合的属性名}" var="每次取出的对象属性名称" begin="开始的索引" end="结束的索引" step="步长">
    • items:描述的是整个集合,这个集合保存在属性范围之内,用EL取出,注意标签的每一项属性的value都是以双引号引用的
    • var:集合的输出一定要迭代取出,而后还需要将每一个取出的元素保存在属性范围内,var设置的就是属性的名字.相当于pageContext.setAttribute("emp",obj);Map集合中取出的是一个个 Map.Entry对象(包含一对key,value) ## Filter 子类实现javax.servlet.Filter接口,并覆写三个方法
  • 初始化: public void init(FilterConfig filterConfig)
    • 通过FilterConfig中的public String getInitParameter(String name)等方法取得在web.xml中配置的初始参数
  • 执行过滤:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    • FilterChain 接口中提供 public void doFilter(ServletRequest request, ServletResponse response)方法,用于将请求继续发给目的地,或者是后续的filter.
  • 销毁 : public void destroy()
 public class EncodingFilter implements Filter {
 
    @Override
    public void destroy() {
    }
 
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        arg0.setCharacterEncoding("UTF-8");
        arg1.setCharacterEncoding("UTF-8");
        arg2.doFilter(arg0, arg1);
    }
 
    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
 
 }

定义好Filter实现子类后,需要在web.xml文件中配置filter(与Servlet配置相似)

 <filter>
     <filter-name>EncodingFilter</filter-name>
     <filter-class>cn.mldn.filter.EncodingFilter</filter-class>
 </filter>
 <filter-mapping>
     <filter-name>EncodingFilter</filter-name>
     <url-pattern>/*</url-pattern>  <!-- /* 表示对所有路径进行过滤 -->
 </filter-mapping>

## Listener 关于session的监听

  • 对session 的状态监听:HttpSessionListener
    • session 创建: public void sessionCreated(HttpSessionEvent se);
    • session 销毁: public void sessionDestroyed(HttpSessionEvent se)
      • HttpSessionEvent 中提供 public HttpSession getSession();获取事件来源的session对象
  • 对session的属性监听: HttpSessionAttributeListener
    • 增加属性: public void attributeAdded(HttpSessionBindingEvent se)
    • 替换属性: public void attributeReplaced(HttpSessionBindingEvent se)
    • 删除属性: public void attributeRemoved(HttpSessionBindingEvent se)
      • HttpSessionBindingEvent 提供有 : public String getName(),public Object getValue(),public HttpSession getSession()
  • 销毁一个session只有两个方法
    • 调用 session.invalidate()
    • session 超时时间一到,自动销毁(并不精确),默认的超时时间是30分钟,可以在web.xml文件中配置.

## Annotation 配置

  • 配置Servlet
 @WebServlet(
     name = "hello",    //<servlet-name>hello</servlet-name>
     urlPatterns = {"/servlet/HelloServlet",....},    // 以字符数组形式,可以设置多个<url-pattern>/servlet/HelloServlet</url-pattern>
     initParams = {      //配置初始化参数
    @WebInitParam(value = "hello" , name="paramA"),
    @WebInitParam(value = "world" , name="paramB"),
     })
  • 配置Filter
 @WebFilter(
    filterName = "EncodingFilter",
    urlPatterns = {"/*"} )