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

使用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);方法中”放行“即可。

时间: 2024-09-29 08:24:05

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

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

今天就对使用Filter技术能做什么来个小小的归纳.也为了方便今后的复习. 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest request = (HttpServletRequest )req; HttpServletResponse response = (HttpServletResponse )resp; response.setDateHeader("Expires",-1); response.setHea

Java EE应用程序入门

本文将详细介绍使用 EJB 3.0 技术开发企业应用程序的基础知识,而 EJB 3.0 是 Java EE 5 平台的组成部分.本文还将阐述如何通过 EJB 3.0 技术简化开发企业应用程序的流程.本文使用的是 NetBeans IDE 6.0 发行版. 先决条件 本文假定您在以下方面拥有基本知识和编程经验: Java 编程 NetBeans IDE 教程所需软件 对于本教程,您需要在计算机上安装以下软件: "Web & Java EE" 或 "All" 下

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

[前言] JSP本身是JavaWeb中的知识,但是在学习Android网络时,必然要涉及到与服务器之间的交互,所以学一下JSP以及其他JavaWeb的内容还是很有必要的,至少能明白程序在访问服务器时,整个过程的原理. 其实,在学习Android之前,Java和JavaWeb的知识都是要先学习的.本人是在2014年7月正式开始Android方向的研究学习,在这之前没有接触任何和计算机软件相关的知识(唯一相关的是,本科学过一门C语言课程,不过现在已经忘光了). 我们来看下面的这张图就知道了: 两张图

Java Web Filter 过滤器学习教程(推荐)_java

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过F

针对Java EE 7三个特性进行详细的剖析

Java EE 7 使得开发人员可以写更少的样板代码,通过丰富的组件来提供一个完整.全面.集成的堆栈来支持和构建最新的 Web 应用程序和框架,同时提供更具扩展性.丰富性和简易的功能.企业将会从便捷式批处理.改进的扩展性等新功能中获益.本文将通过对这个版本中新增组件 WebSocket 1.0.JSON Processing 1.0.JAX-RS 2.0.JSF 2.2 和 JMS 2.0 的介绍及若干示例的展示,来对以上三个特性进行详细的剖析. Java EE 作为一个企业应用的部署平台,具有

EJB入门学习代码实例

对于一个Java开发人员来说,EJB入门是一个小的关口,因为它比单纯的开发java.servlet.JSP更多 了几分系统设置上的麻烦,同时需要你更先要去了解更为广泛的知识后才能好的利用它.好了,我们就开 始我们的又一次EJB学习品罢. 本程序使用了Sun的J2EE系统(如果你在使用J2EE设置上有什么问题,可以去参见本人的代码人生之学 习品中的<J2EE使用指南>的文章).使用的例程也是J2EE中的一个最简单的例子.使用的编辑和make工 具是JBuilder.不过你也可以使用手动来用jav

最重要的Java EE最佳实践

引言 在过去的几乎整整十年中,人们编写了很多有关 Java Platform, Enterprise Edition (Java EE) 最佳实践的内容.现在有十多本书籍 和数以百计(可能更多)的文章,提供了关于应该如何编写 Java EE 应用程序的 见解.事实上,这方面的参考资料如此之多,并且这些参考资料之间往往还存在 着一些矛盾的建议,以至于在这些混杂的内容中进行学习本身也成为了采用 Java EE 的障碍.因此,为了给刚进入这个领域的客户提供一些简单的指导,我们汇编 了这个最重要的最佳实

Java EE 5技术简介

NetBeans IDE 6.0 的开发是在 Java EE 和 Glassfish 工作组的密切合作下完成的,它实现了与新的 Java EE 5 规范的完美集成,从而可以在此 IDE 中轻松地使用新规范.NetBeans IDE 6.0 是您快速学习 Java EE 5 编程并使用它高效工作的最佳途径. 本文档介绍了 Java EE 5 规范的一些重要概念,以及它们如何与您目前的编程项目相关联的.本文将 介绍以下主题: 标注取代部署描述符 简化的 EJB 软件开发 使用依赖关系注入来访问资源

Java EE 5

简介 Java EE 技术是 Java 语言平台的扩展,支持开发人员创建可伸缩的强大的可移植企业应用程序.它为应用程序组件定义了四种容器:Web.Enterprise JavaBean(EJB).应用程序客户机和 applet.一个应用服务器规范详细描述了这些容器和它们必须支持的 Java API,这促使 Java EE 产品相互竞争,同时保证符合这个规范的应用程序可以在服务器之间移植. 这个平台的最新版本 Java EE 5 已经于 2006 年 5 月发布.Java EE 5 主要关注提高开