大可制作:QQ群:31564239(asp|jsp|php|mysql)

JSP/Servlet: Filter(2)

在实现Filter接口时必须实现init()方法,该方法传入一个FilterConfig对象作为参数,它包括了一些容器传递给Filter,有关于Filter的相关设定信息,您可以透过下面几个方法来取得这些信息:
public java.lang.String getFilterName()
public java.lang.String getInitParameter(java.lang.String name)
public java.util.Enumeration getInitParameterNames()
public ServletContext getServletContext()

其中getInitParameter()与getInitParameterNames()信息的取得来源,即web.xml中设定的参数讯息,使用方 法与之前设定Servlet时相同,一个例子如下:
  • web.xml
...
<filter>
<filter-name>SomeFilter</filter-name>
<filter-class>onlyfun.caterpillar.SomeFilter</filter-class>
<init-param>
<param-name>parameter1</param-name>
<param-value>paramValue</param-value>
</init-param>
</filter>
...

在Servlet 2.3之前,Filter的触发只能透过使用者的直接请求,而在Servlet 2.4之后,您可以透过几个可能的转发或包括等方式来触发Filter,这可以在web.xml中加以设定,触发Filter的方式有FORWARD、 INCLUDE、REQUEST与ERROR,即转发、包含、请求与错误网页请求时,默认的触发方式是REQUEST,您可以使用< dispatcher>标签来加以设定,例如:
  • web.xml
...
<filter-mapping>
<filter-name>SomeFilter</filter-name>
<url-pattern>/somePage.jsp</url-mapping>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
...

除了在doFilter()中撰写简单的过滤功能、添加request或response的信息之外,您也许还会想要直接的加强request与 response的处理方式,例如增加对请求资源的压缩功能,这种在原来的request与response功能之上,再添加额外的处理功能,可以采用 Decorator 模式, 在Servlet 2.4之后,提供了实现装饰模式的Wrapper类:ServletRequestWrapper、ServletResponseWrapper、 HttpServletRequestWrapper、HttpServletResponseWrapper,前两者分别实现了 ServletRequest与ServletResponse,后两者则分别又继承了前两者,您可以继承这些类,以装饰模式来添加request与 response的额外处理能力。