filter的用法,的確是比較有擴展性的一種方法...可以通過filter結合讀取web.xml中的filter參數(shù)來完成一系列的動作,做法如下:
首先,實現(xiàn)javax.servlet.Filter接口,編寫一個處理request編碼的過濾器類...
package?tutorial.struts.filter;
import?javax.servlet.Filter;
import?javax.servlet.FilterConfig;
import?javax.servlet.ServletException;
import?javax.servlet.ServletRequest;
import?javax.servlet.ServletResponse;
import?javax.servlet.FilterChain;
import?java.io.IOException;
public?class?SetCharacterEncodingFilter?implements?Filter?{
??protected?FilterConfig?filterConfig;
??protected?String?encodingName;
??protected?boolean?enable;
??public?SetCharacterEncodingFilter()?{
????this.encodingName?=?"UTF-8";
????this.enable?=?false;
??}
??public?void?init(FilterConfig?filterConfig)?throws?ServletException?{
????this.filterConfig?=?filterConfig;
????loadConfigParams();
??}
??private?void?loadConfigParams()
?{
????//encoding
????this.encodingName?=?this.filterConfig.getInitParameter("encoding");
????//filter?enable?flag...
????String?strIgnoreFlag?=?this.filterConfig.getInitParameter("enable");
????if?(strIgnoreFlag.equalsIgnoreCase("true"))
?{
??????this.enable?=?true;
????}
?else
?{
??????this.enable?=?false;
????}
??}
??public?void?doFilter(ServletRequest?request,?ServletResponse?response,
???????????????????????FilterChain?chain)?throws?IOException,?ServletException
?{
????if(this.enable)?
{
??????request.setCharacterEncoding(this.encodingName);
????}
????chain.doFilter(request,?response);
??}
??public?void?destroy()
?{
??}
}
?
然后,需要在web.xml中注冊我們的過濾器類:
??<filter>
????<filter-name>Set?Character?Encoding</filter-name>
????<filter-class>tutorial.struts.filter.SetCharacterEncodingFilter</filter-class>
????<init-param>
??????<param-name>encoding</param-name>
??????<param-value>UTF-8</param-value>
????</init-param>
????<init-param>
??????<param-name>enable</param-name>
??????<param-value>true</param-value>
????</init-param>
??</filter>
??<filter-mapping>
????<filter-name>Set?Character?Encoding</filter-name>
????<servlet-name>Action?Servlet</servlet-name>
??</filter-mapping>
??<filter-mapping>
????<filter-name>Set?Character?Encoding</filter-name>
????<servlet-name>Faces?Servlet</servlet-name>
??</filter-mapping>
?
這樣,任何通過Struts,或是JSF的Controller?Servlet處理的request,都會在過濾器中先行處理,才把控制權交還給Struts或是JSF,而且Filter中有一個Process?Chain的概念,是一個很吸引人的東東~~!