JSPFilter和Listener。
Filter:
可以在web.xml中配置,在用户请求到达网页前和服务器的响应到达客户端之前执行的程序。
filter在web.xml中的配置的各节点大致如下:
<filter>
<filter-name>filterTest</filter-name>
<filter-class>test.FilterTest</filter-class>
<init-param>
<param-name>token</param-name>
<param-value>param-value</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filterTest</filter-name>
<url-pattern>/*</url-pattern>
<url-pattern>/test.jsp</url-pattern>
<servlet-name>Test</servlet-name>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
init-param中定义初始化的参数,可以在实现javax.servlet.Filter接口的init方法时通过它的参数 FilterConfig来取得这些初始参数的值。
url-pattern和servlet-name是定义当请求何种网页资源或servlet的时候使用此filter,可以使用通配符,如/*表示所有资源,/abc/*表示为abc目录下的所有资源。一个filter-mapping可以含有多个url-pattern和servlet-name
dispatcher指定对资源的请求方式,一共有四种方式。一个filter-mapping也可以有多个dispatcher
REQUEST是指普通的直接对资源做出请求。
FORWARD是指请求是通过使用RequestDispatcher的forward方法
INCLUDE是指请求是通过使用RequestDispatcher的include方法
ERROR是指请求是通过错误处理机制
错误处理机制是指通过web.xml中使用如下的配置来进行错误处理:
<error-page>
<error-code>1</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/exception.jsp</location>
</error-page>
创建filter首先要建立一个实现javax.servlet.Filter接口的类。要实现三个方法:
init:用来初始化filter的,可以在这个方法中通过其参数FilterConfig取得web.xml配置中的init-param的值。
doFilter:这个是主要的处理方法,过滤处理工作在此进行,最后可以调用其第三个参数FilterChain的doFilter方法,继续调用过滤链上的下一个过滤器,如果没有过滤器了就将调用请求的资源,或者根据其他需要调用 servletRequest.getRequestDispatcher(“/fileupload.html”).forward或.include 方法将请求转到其他的网页上去而不继续执行filterchain。如果在FilterChain上有多个Filter,比如对b.jsp网页需要执行两个甚至更多的过滤器,其调用顺序和web.xml中的<filter-mapping>定义顺序一致,最先定义的<filter- mapping>会先执行,下面定义的<filter-mapping>依次执行。还有一点要注意的是,当执行了 FilterChain的doFilter方法或使用RequestDispatcher的方法对请求继续处理后,比如生成了对客户端的 response,还将返回Filter的这个doFilter方法中,所以可以在FilterChain或RequestDispatcher处理后,对response等做出一些响应客户端前的处理。
destroy:在filter销毁的时候调用。
—ServletRequest和ServletResponse的Wrapper类
javax.servlet.ServletRequestWrapper
javax.servlet.ServletResponseWrapper
javax.servlet.http.HttpServletRequestWrapper
javax.servlet.http.HttpServletResponseWrapper
为了修改request和response对像的内容,Wrapper类的原理就是继承或实现 ServletRequest,ServletResponse接口,然后在构造函数中传入原始的request和response,Wrapper类的所有request和response的方法,全部调用从构造函数传入的request和response的相应的方法。如果需要修改request和 response对像的方法返回的内容,就自建一个类继承Wrapper类,然后重写相应的方法来覆盖原始方法的调用,这样就实现了其内容的修改。这是利用了设计模式的Decorator模式。
可以使用filter来解决中文编码的问题。以前的解决方法是
request.setCharacterEncoding(“GB2312″)
或者<fmt:requestEncoding value=”GB2312″/>
这种方法必须每个网页都加,使用filter,只需要在Filter类里用 request.setCharacterEncoding(“GB2312″)来设置一次就行了,然后在web.xml让相应的网页使用这个 filter就ok了。
—Listener接口
Listener接口 对应的Event类
ServletContextListener ServletContextEvent
ServletContextAttributeListener ServletContextAttributeEvent
HttpSessionListener HttpSessionEvent
HttpSessionActivationListener 同上
HttpSessionAttributeListener HttpSessionBindingEvent
HttpSessionBindingListener 同上
ServletRequestListener ServletRequestEvent
ServletRequestAttributeListener ServletRequestAttributeEvent
Listener接口在web.xml文件中配置,使用如下节点配置:
<listener>
<listener-class>package.classname</listener-class>
</listener>
整个网站的资源都共享一个javax.servlet.ServletContext类。相当于jsp的application对像。它的生命周期是从 container启动到其关闭。application的初始参数是指在web.xml中的context-param节点设置的参数。这些参数的范围是全局的。
可以使用application.getInitParameter(),${initParam.name}或者在Servlet中使用 ServletContext.getInitParameter()来取得它们。
ServletContextListener:此接口有两个方法,分别会在服务器启动的时候和服务器关闭的时候调用。其参数 ServletContextEvent可以取得ServletContext对像。
ServletContextAttributeListener:此接口有三个方法,分别会在向application中添加对像,移除或修改其中的对像的时候调用。ServletContextAttributeEvent可以取得正被操作的属性的名称以及属性的值,在取代对像的时候,它取得的属性和值是取代之前的。
HttpSessionBindingListener接口是唯一一个不需要在web.xml中设置的接口。
HttpSessionAttributeListener:跟ServletContextAttributeListener功能完全一样,只是范围不同,它监视的是服务器所有的session。和HttpSessionBindingListener比,功能也类似,但是 HttpSessionBindingListener只是在session添加和移除实现它的对像的时候才会被调用,而 HttpSessionAttributeListener是对session在操作所有对像的时候调用。
HttpSessionListener:和ServletContextListener类似,是在session产生和销毁的时候调用它。
HttpSessionActivationListener:此接口是在session转移至不同的jvm的时候被调用,比如负载平衡机制,这些jvm 可以在同一台机器上或是分散在网络中的多台机器上。当session被存储起来,等待转移到另一个jvm的时候,称为失效状态。当session被转移到其他jvm之后,又变为了有效状态。此接口有两个方法分别在session变为失效和从失效再变回有效的时候调用。
ServletRequestListener:这个也和ServletContextListener类似,当有请求产生或销毁的时候就会调用其相应的方法。
ServletRequestAttributeListener:此接口和session与context的Attribute接口类似,都是在操作属性的时候被调用,只是范围不同,此接口的范围是request。