zoukankan      html  css  js  c++  java
  • Java Web 过滤器的典型应用

      在 Java Web 项目的开发中,过滤器的应用十分广泛,其中比较典型的应用就是字符编码过滤器。由于 Java 程序可以在多种平台下运行,其内部使用 Unicode 字符集来表示字符,所以处理中文数据会产生乱码情况,需要对其进行编码转换才可以正常显示。

      (1)创建字符编码过滤器类 CharacterEncodingFilter,此类实现了 Filter 接口,并对其3个方法进行了实现。代码如下:

    /**
     * 这是一个字符编码的过滤器
     * @author ph
     */
    public class CharacterEncodingFilter implements Filter {
        //字符编码初始化
        protected String encoding = null;
        //FilterConfig 对象
        protected FilterConfig filterConfig = null;
        //初始化方法
        public void init(FilterConfig filterconfig) throws ServletException {
            //对 filterConfig 赋值
            this.filterConfig = filterconfig;
            //对初始化参数赋值
            this.encoding = filterconfig.getInitParameter("encoding");
        }
        //过滤器处理方法
        public void doFilter(ServletRequest servletrequest,
                ServletResponse servletresponse, FilterChain filterchain)
                throws IOException, ServletException {
            //判断字符编码是否有效
            if(encoding != null) {
                //设置 request 字符编码
                servletrequest.setCharacterEncoding(encoding);
                //设置 response 字符编码
                servletresponse.setContentType("text/html;charset=" + encoding);
            }
            //传递给下一个过过滤器
            filterchain.doFilter(servletrequest, servletresponse);
        }
        //销毁方法
        public void destroy() {
            //释放资源
            this.encoding = null;
            this.filterConfig = null;
        }
    }

      CharacterEncodingFilter 类的 init() 方法用于读取过滤器的初始化参数,这个参数(encoding)为此例中所用到的字符编码;在 doFilter() 方法中,分别将 request 对象及 response 对象中的编码格式设置为读取到的编码格式;最后在destroy() 方法中将其属性设置为 null,将被 Java 垃圾回收器回收。

      (2)在 web.xml 文件中,对过滤器进行配置。代码如下:

        <!-- 声明字符编码过滤器 -->
        <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>com.ph.util.CharacterEncodingFilter</filter-class>
            <!-- 设置初始化 -->
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
        </filter>
        <!-- 映射字符编码过滤器 -->
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <!-- 与所有请求进行关联 -->
            <url-pattern>/*</url-pattern>
            <!-- dispatcher用于指定过滤器对应的请求方式  -->
            <dispatcher>REQUEST</dispatcher>
            <dispatcher>FORWARD</dispatcher>
        </filter-mapping>

      附上 dispatcher 的可选值及说明

    dispatcher 的可选值及说明
    可选值 说明
    REQUEST 当客户端直接请求时,通过过滤器进行处理
    INCLUDE 当客户端通过 RequestDispatcher 对象的 include() 方法请求时,通过过滤器处理
    FORWARD 当客户端通过 RequestDispatcher 对象的 forward() 方法请求时,通过过滤器进行处理
    ERROR 当声明式异常产生时,通过过滤器进行处理

      (3)通过请求对过滤器进行验证,使用表单向 Servlet 发送中文信息进行测试,其中表单信息放置在 index.jsp 页面中。代码如下:

      <p>请输入您的姓名:<input type="text" name="name"/></p>
      <input type="submit" value="提交"/>

      这一请求由 Servlet 对象 MyServlet 类进行处理,此类使用 doPost() 方法接收表单请求,并将表单中的 name 属性输出到页面中。代码如下:

        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            PrintWriter out = resp.getWriter();
            //获取表单参数
            String name = req.getParameter("name");
            if(name!=null && !name.isEmpty()) {
                out.print("您好 " + name);
                out.print(",<br/>欢迎来到我的主页。");
            } else {
                out.print("请输入您的中文名字!");
            }
            out.print("<br/><a href='index.jsp'>返回</a>");
            out.flush();
            out.close();
        }

      实例运行结果:

    1、输入前  输入前

    2、过滤后效果过滤

    3、未过滤效果未过滤

  • 相关阅读:
    peerdroid:JXTA peers running on Android platform.
    关于2.7版中对等组任务管理器
    关于java获取操作系统信息
    Failed to login to this group: xxx. Error=0
    jxsev2.5源代码
    PropertyBeanUtils.copyProperties(dest, orig)
    发现两个有关Netbeans RCP开发的项目
    关于AdvertisementFactory废弃的几个方法
    在vs2008中,根据系统引用64和32位的动态库
    vc练习总结1
  • 原文地址:https://www.cnblogs.com/tinypeng/p/3404448.html
Copyright © 2011-2022 走看看