上篇已经介绍过滤器的概念,现在我们写在WEB开发中是如何编写和部署过滤器。
在此我们编写一个编码过滤器。
在JSP页面中,为了防止写入数据库和显示乱码,通常我们一般情况调用request的方法request.setCharacterEncoding("GB18030");这种办法的确可行,但是每个页面都涉及到编码问题,因为我们不得不每个页面都写这句话。重复的代码肯定有弊端,所以我们要进一步改进。此时使用编码过滤器来进行改造,统一设置字符集问题。
编码过滤器要实现javax.servlet.Filter接口。
package com.bjpowernode.drp.util.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * 统一设置字符集 * @author: 梁焕月 * 文件名:CharsetEncodingFilter.java * 时间:2011-12-20下午8:29:56 */ public class CharsetEncodingFilter implements Filter { public void destroy() {} public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException { //设置字符集 servletRequest.setCharacterEncoding("GB18030"); filterChain.doFilter(servletRequest, servletResponse);} public void init(FilterConfig filterConfig) throws ServletException {} }
其中要重写init方法,doFilter方法,destroy方法。其中init方法只执行一次,跟servlet一样。但是servlet执行是在在地址栏输入url时生成,而Filter则是在tomcat一启动则生成。
编写filter后,需要在配置文件web.xml中部署,这个filter类不是我们人为调用执行,而是由tomcat执行,跟servlet一样。
其中在WEB开发运行jsp页面执行的顺序是:
在客户端请求传递到servlet之前,过滤器可以修改该请求request。
在用户的响应从servlet返回到客户端之前,过滤器可以修改该响应Response
(jsp其实就是sevlet)

然后部署过滤器,在web.xml中:
<filter> <filter-name>CharsetEncodingFilter</filter-name> <filter-class> com.bjpowernode.drp.util.filter.CharsetEncodingFilter </filter-class> </filter> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
在过滤器中的doFilter方法中设置编码方式不妥,servletRequest.setCharacterEncoding("GB18030");若是编码改成GB2312,则会修改这个过滤器类,这样违背了开闭原则。进一步改造中……
把变量设置放在web.xml文件中,部署时设置初始参数,则web.xml中:
<filter> <filter-name>CharsetEncodingFilter</filter-name> <filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GB18030</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>然后再过滤器类CharsetEncodingFilter中获得初始化参数的值,通过FilterConfig对象获得初始化参数的值。则过滤器类CharsetEncodingFilter类的改进如下:
public class CharsetEncodingFilter implements Filter { //设置成员变量用来获得字符集变量 private String encoding; public void destroy() {} public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException { //设置字符集 //servletRequest.setCharacterEncoding("GB18030"); servletRequest.setCharacterEncoding(encoding); filterChain.doFilter(servletRequest, servletResponse); } public void init(FilterConfig filterConfig) throws ServletException { //取得配置文件中的初始化参数 this.encoding= filterConfig.getInitParameter("encoding"); System.out.println(encoding); } }
通过过滤器来解决统一字符集的问题。并且通过这个例子也讲述了如何编写过滤器和部署过滤器。过滤器的功能已经知道,那么如何解决应该是没问题了。
本文详细介绍了如何在Web开发中利用编码过滤器解决字符集问题,通过实现Filter接口并配置web.xml文件,实现统一设置字符集,避免了每个页面重复设置编码的弊端。同时,通过在Filter类中获取初始化参数值,进一步增强了代码的灵活性和可维护性。
2246

被折叠的 条评论
为什么被折叠?



