背景:最近项目不是很忙,学习了一下Filter,这个东东是个好东东,是灵活度和稳定性的完美化身。Filter和AOP相似,都是面向切面的编程,可以看作是一种横切性的技术,体现了“职责链模式”。下面具体的介绍一下Filter的强大之处。
一、简介
Filter 技术是servlet 2.3 新增加的功能。大部分的jsp/servlet容器都支持。
二、作用
1、其实是对request和response请求进行了拦截。
2、提供了一种声明式服务,具有可插拔的能力(用的时候放上去,不用的时候可以随时拿下来)。
3、Filter只对Post请求起作用。
三、举个栗子
栗子:采用Filter设置字符集,所有的JSP页面都使用GB18030。
第一步:时序图
第二步:建立filter包,添加一个新类,实现filter-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;
/**
* 采用filter统一处理字符集
* @author 丽杰
*
*/
public class CharsetEncodingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("CharsetEncodingFilter.init()--->>>begin");
//设置字符集
request.setCharacterEncoding("GB18030");
//继续执行,链条
chain.doFilter(request, response);
System.out.println("CharsetEncodingFilter.init()--->>>end");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
第四步:配置tomcat的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>CharsetEncodingFilter implements Filter.CharsetEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>
PS:<url-pattern>主要有四种匹配方式
a)精确匹配,不需要任何修饰符;
<url-pattern>/servlet/TestServlet</url-pattern>
b)扩展匹配,由“*”号和扩展名组成;
<url-pattern>*.jsp</url-pattern>
c)路径前缀匹配,包含一个目录和一个/*;
<url-pattern>/servlet/*</url-pattern>
d)全部匹配,一般使用/*;
<url-pattern>/*</url-pattern>
第五步:执行结果
四、可扩展
如果某天,需要使用字符集GBK,但是我们之前写的GB18030,是写在在方法中的,不容易变革,所以,使用一种新的方法来实现此设想。
第一步:编写设置字符集的方法
/**
* 采用filter统一处理字符集
* @author 丽杰
*
*/
public class CharsetEncodingFilter implements Filter {
private String endcoding;//设置一个成员变量
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//System.out.println("CharsetEncodingFilter.init()--->>>begin");
//设置字符集
request.setCharacterEncoding(<span style="font-family: KaiTi_GB2312;">endcoding</span>);
//继续执行,链条
chain.doFilter(request, response);
//System.out.println("CharsetEncodingFilter.init()--->>>end");
}
@Override //如果扩展GBK,取到filter的参数,tomcat回调,初始化一次
public void init(FilterConfig filterConfig) throws ServletException {
this.endcoding = filterConfig.getInitParameter("encoding");//拿到配置文件中的名字
System.out.println("CharsetEncodingFilter.init()-->>endcoding" + endcoding);
}
}
第二步:配置tomcat的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>CharsetEncodingFilter implements Filter.CharsetEncodingFilter</filter-class>
<init-param><!-- 如果扩展GBK,可以传递参数 -->
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>
第三步:查看结果
五、学习心得
1、高质量代码的三要素:可读性、可维护性、可扩展性。
2、多思考,思考得越多,代码的质量越高。
3、对待新事物,要怀有一颗好奇心,这样学习到的东西越多,