使用Filter技术来配合开发会使得开发变得简单起来。简单的一个例子就表现在“乱码问题”上。不使用Filter的话,我们有可能需要为每一个网页设置字符编码集,如request.setCharacterEncoding("charsetname");response.setCharacterEncoding("charset")以及response.setContentType("text/html;charset="+targetCharset);这确实是一件繁琐而且费时费力的工作。而且更重要的是这种方式违背了java的编码原则,即消除重复代码。所以要进行改进和优化的话。Filter就登上了舞台。使用Filter我们可以轻松的对乱码问题进行解决。下面就一起来看一个小小的实例吧。


什么是Filter


官方文档上对Filter是这样解释的:



大致的意思就是说,我们要自定义一个实现了javax.servlet.Filter接口的类的实例,然后重写相关的业务逻辑方法就可以完成相关的操作了。其中最主要的方法就是doFilter方法了,也是最为关键的一个方法。前两个参数也是比较容易理解,而第三个FilterChain是什么呢?

。从官方的解释上我们可以发现,它是一个“链”。顾名思义就是在一个连续的操作上执行有效的对象的实例。它会按照在web.xml生命的filter-mapping的顺序来进行顺序的移动,直到最后一个filter完毕。


怎么创建一个自定义的Filter呢?


步骤如下:

  • 创建一个实现了javax.servlet.Filter接口的类,并重写内部方法。
  • 在web.xml进行声明,web.xml意义就好比android中清单文件的作用,保存着项目的全局信息。
  • 然后发布工程就可以实现调用咯

请看CharacterEncoding.java:

package web.filter.example;

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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 此类用于解决全站乱码问题
 * @author Summer
 *
 */
public class CharacterEncoding implements Filter {

    //用于获取网站初始化参数的配置信息载体
    private FilterConfig filterConfig;
    //为了防止未设置初始化参数引起的空指针错误,我们采用一个默认的字符编码集
    String defaultCharset = "UTF-8";

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest req , ServletResponse resp ,
            FilterChain chain) throws IOException, ServletException {
        //获得所需要的字符编码集
        String charset = this.filterConfig.getInitParameter("charset");
        if(charset==null){
            charset = defaultCharset;
        }

        //将request和response强制转换为http类型的
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        //开始设置码表
        request.setCharacterEncoding(charset);
        response.setCharacterEncoding(charset);
        response.setContentType("text/html;charset="+charset);

        chain.doFilter(request, response);

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
    }

}

然后是在web.xml中进行相关项的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>FilterStudy</display-name>
    <servlet>
        <description>JAX-RS Tools Generated - Do not modify</description>
        <servlet-name>JAX-RS Servlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>ServletTest</servlet-name>
    <servlet-class>web.servlet.ServletTest</servlet-class>
  </servlet>

    <servlet-mapping>
        <servlet-name>JAX-RS Servlet</servlet-name>
        <url-pattern>/jaxrs/*</url-pattern>
    </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ServletTest</servlet-name>
    <url-pattern>/servlet/ServletTest</url-pattern>
  </servlet-mapping>

<!--没错,下面的就是配合的信息。是不是很熟悉呢?就和servlet的配置声明的原理是一样滴-->
    <filter>
        <filter-name>CharacterEncoding</filter-name>
        <filter-class>web.filter.example.CharacterEncoding</filter-class>
        <init-param>
            <param-name>charset</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <!--使用*号的作用是对所有的文件适用,也可以自定义为对某一个文件有效-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

测试代码


ServletTest.java:

package web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletTest extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.getWriter().write("Summer:夏天");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}

实现的效果



总结


对于Filter技术,应用的场景很是广泛。现讨论一下本文的优缺点吧。

优点:

  • 可以方便的处理页面的乱码问题。不用一个一个的进行设置
  • 可以方便的对各种复杂的重复性强的工作进行简化

    缺点:
  • 不够灵活。

真正的解决全站乱码问题


上面的代码是关于post请求方式的乱码问题的解决的,然而这并不能够真正的解决实际开发状态下的乱码问题。比如使用get请求提交数据的时候就不能够采用那种方式进行解决。下面就来看一下使用解决get方式引起的乱码问题。

关键在于将get方式获取的parameter进行转换即可。这里我们可以采用包装模式增强request的功能。

//主要的思路是将使用get方式的编码进行转换。
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest request = null;

public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
}

@Override
public String getParameter(String name) {
String value_name = this.request.getParameter(name);
if(!request.getMethod().equalsIgnoreCase("get")){
return value_name;//即采用的是post的方式
}

if(value_name==null){
return null;
}

try{
value_name = new String(value_name.getBytes("iso859-1"),"UTF-8");
}catch(Exception e ){
throw new RuntimeException(e);
}
return super.getParameter(name);

}

然后,将这个自定义的增强过得request对象传至chain.doFilter(myRequest,response);方法中”放行“即可。

Java EE 之 过滤器入门学习与总结(1)的更多相关文章

  1. Java EE 之 过滤器入门学习与总结(2)

    今天就对使用Filter技术能做什么来个小小的归纳.也为了方便今后的复习. 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest req ...

  2. 老鸟谈谈JAVA EE的学习

    老鸟谈谈JAVA EE的学习 因为出差和项目的原因,有将近一个月的时间没有更新博客了,今天终于得闲,和兄弟们分享一下JAVA EE的学习心得.书中带过,直入主题,下面我们首先看看什么是JAVA EE. ...

  3. JavaWeb学习----JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  4. java EE 新手入门了解

    郑重申明:本文转载至https://blog.csdn.net/Neuf_Soleil/article/details/80962686,在此深表感谢! 为什么选择java? 想必有很多初学者会像我一 ...

  5. Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring

    参考:https://my.oschina.net/gaussik/blog/513353 注:此文承接上一文:Java EE 学习(5):IDEA + maven + spring 搭建 web(1 ...

  6. Java入门学习路线目录索引

    原创 Java入门学习路线目录索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/One_ ...

  7. 【Java EE 学习 80 上】【WebService】

    一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...

  8. 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】

    之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...

  9. 【Java EE 学习 69 中】【数据采集系统第一天】【SSH框架搭建】

    经过23天的艰苦斗争,终于搞定了数据采集系统~徐培成老师很厉害啊,明明只是用了10天就搞定的项目我却做了23天,还是模仿的...呵呵,算了,总之最后总算是完成了,现在该好好整理该项目了. 第一天的内容 ...

随机推荐

  1. ml-agent:Win10下环境安装

    这是我看到的最全面最详细的ml-agent讲解.(只用于学习与知识分享,如有侵权,联系删除.谢谢!) 来自CodeGize的个人博客 .源链接:https://www.cnblogs.com/Code ...

  2. Redis Sentinel主从高可用方案

    Redis Sentinel主从高可用方案 本文介绍一种通过Jed和Sentinel实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上 ...

  3. TCP/IP学习笔记__mbuf

    Socket发送和接收数据都是写入和读取mbuf(存储器缓存)来完成的.下面着重介绍下Sendto函数与mbuf的关系: 以UDP协议为例: 1.UDP的输出执行过程: UDP的输出执行过程 2.协议 ...

  4. 我与android的缘分

    android的开始 本人是一名大三的学生,大一大二主要学习的是php后台开发,在大一的时候做过一些小的网站系统,也参加过一些大学生计算机相关的比赛.这次开始着手于安卓开发,也是一时的兴起.因为跟我们 ...

  5. WUOJ-ACM :1003: 零起点学算法78——牛牛

    武汉科技大学ACM :1003: 零起点学算法78--牛牛Problem Description牛牛是一种纸牌游戏,总共5张牌,规则如下: 如果找不到3张牌的点数之和是10的倍数,则为没牛: 如果其中 ...

  6. exp和imp的工作原理

    --1.exp和imp的输入都是名字和值对: 如:exp parameter_name=value 或exp parameter_name=(value1,value2,value3..) --2.e ...

  7. python的IDE(pycharm)安装以及简单配置

    使用IDE的好处 界面更友好,看起来更舒服 智能提示功能很赞,大大提高开发效率 pycharm的安装过程 去pycharm官网下载安装包,请下载专业版,建议不要去网上下载汉化版 点击安装包一直下一步即 ...

  8. Java面试19|过于深入的问题

    1.synchronized关键字的实现原理 可以参考:http://www.jianshu.com/p/c5058b6fe8e5 2.CAS是由Unsafe类的compareAndSwap()方法实 ...

  9. 剑指架构师系列-MySQL调优

    介绍MySQL的调优手段,主要包括慢日志查询分析与Explain查询分析SQL执行计划 1.MySQL优化 1.慢日志查询分析 首先需要对慢日志进行一些设置,如下: SHOW VARIABLES LI ...

  10. 克拉默法则(Cramer's Rule)的证明

    克拉默法则: 先说一下为什么要写这个,作为一个大一新生,必须要学的就包括了线性代数,而且线性代数等数学知识对计算机专业也有很大帮助.但是在学习过程中遇到一个讲解的不清楚的知识点(Cramer's Ru ...