J2EE (三) Filter详解
- 简介
- Filter这个词第一个看到时以为是化学里面的漏斗呢,因为所学专业经常在实验室里面做一些实验,对于这个印象也比较深刻,作为常识大家也知道利用沙子/漏斗/纱布,可以将浑浊的水过滤为很干净的水,看下面如:
- 计算机中这样定义:Filter 技术是servlet 2.3 新增加的功能。servlet2.3是sun公司于2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则。在众多参与者的共同努力下,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高。
- Filter这个词第一个看到时以为是化学里面的漏斗呢,因为所学专业经常在实验室里面做一些实验,对于这个印象也比较深刻,作为常识大家也知道利用沙子/漏斗/纱布,可以将浑浊的水过滤为很干净的水,看下面如:
- 原理
- Web开发中HttpServletRequest和HttpServletReponse是两个重要的对象,当Request/Reponse在客户端与服务器端进行传输的过程中,filter对这两个对象进行过滤,这里不仅仅是单纯的过滤掉一些东西,更主要的是增加一些功能/服务。
- 我们做的只是在Web.xml配置文件中声明一下,也可以称filter为声明式服务。
- filter也是让Tomcat容器管理,Tomcat对其进行初始化和赋值
- 例子:设置字符集
- 在没有提出filter概念之前,我们需要往每一个编辑的页面上添加一句设置编码方式的代码如
- 代码
request.setCharacterEncoding("GB18030");
- 如果我们的系统需要几千个页面那么每个页面都要写上这个功能,会很麻烦,倘若需要改动编码方式时会更麻烦,filter给我们解决了这个问题。下面为具体实现
-
Filter class
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 LLS * */ public class CharSetEncodingFilter implements Filter { //保存编码 方式 private String encoding=null; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse reponse, FilterChain chain) throws IOException, ServletException { //统一设置字符集 request.setCharacterEncoding("GB18030"); //向下传递 chain.doFilter(request, reponse); } @Override public void init(FilterConfig filterConfig) throws ServletException { //通过 配置 文件取得初始化参数 this.encoding=filterConfig.getInitParameter("encoding"); } }
-
Web.xml
</welcome-file-list> <!--过滤器配置--> <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>
-
Filter class
- 在没有提出filter概念之前,我们需要往每一个编辑的页面上添加一句设置编码方式的代码如
- 应用广泛
- 它的功能并不是只有这些,它给我们提供了一种思想让我们可以自由选择增加和删除一些功能功能,在程序调用过程中横向向程序里面注入代码段,注入新功能,提高了可扩展的灵活性。