struts2原理图:
下面根据Struts原理图,写一个简单的过滤器实现:
假设现在有一个form表单被提交,发送如下请求到服务器:
POST http://127.0.0.1/login.do HTTP/1.0 Accept: image/gif, image/jpeg, image/pjpeg, */* Accept-Language: en-us,zh-cn;q=0.5 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Content-Length: 28 \r\n username=admin&password=1234
当服务器接收到这个请求,会经过一系列的过滤器。
1,定义一个过滤器
我们这里定义一个叫:SetCharacterEncoding的过滤器,用来设置请求中文字编码。
在web.xml中添加如下代码:
<filter> <filter-name>SetCharacterEncoding</filter-name> <filter-class>com.bjzfy.zfzj.gg.util.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter>过滤器的位置应在<filter-mapping>前面。
2,使用这个过滤器:
<filter-mapping> <filter-name>SetCharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
将这个过滤器放在其他过滤器之前。就可以在其他过滤器处理请求之前把请求的编码转换成想要的编码。最典型的是放在struts过滤器之前。
如下顺序:
<filter-mapping>//先调用 <filter-name>SetCharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping>//后调用 <filter-name>FilterDispatcher</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
所有过滤器的实现都要实现 Filter 接口:
public class SetCharacterEncodingFilter implements FilterFilter接口中doFilter函数是入口函数,前面的http请求内容将传入这个函数:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
在这个函数里面,我们可以对接收到的http请求进行处理。这里是做字符集转换,如下实现
request.setCharacterEncoding(encoding);
处理完毕后,需要将内容教给下一个过滤器处理。
chain.doFilter(request, response);
下面说一下过滤器其他处理细节:
1,参数初始化
<init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param>
在定义SetCharacterEncodingFilter过滤器时候,有上面两个初始化参数。
这两个参数用来配置转换的目标字符集GBK。这里也可以定义其他的,如UTF-8。
类中实现:
public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); }
其中FilterConfig用来读取初始化参数。
2,对象结束需调用destroy函数。