在解决jsp页面中文乱码的时候,往往可以在页面头部加上request.setCharacterEncoding("gb2312")来解决,如果jsp页面多的话,就不适合在每个页面都加上这么一句。这时就可以用filter来解决,这也符合面向对象的原则。
filter使用户可以改变一个request和修改一个response。Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,filter其实是一个“servlet chaining“(servlet 链),包括:
1. 在servlet被调用之前截获;
2. 在servlet被调用之前检查servletrequest;
3. 根据需要修改request头和request数据;
4. 根据需要修改response头和response数据;
5. 在servlet被调用之后截获.
你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用。tomcat一启动就new一个filter,并且只new一次
用法:
1.建立一个实现接口javax.servlet.Filter的类CharsetEncodingFilter
2.在web.xml中进行filter配置
<span style="font-size:18px;"><filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
//初始化的时候可以传递参数
<init-param>
<param-name>encoding</param-name>
<span style="white-space:pre"> </span><param-value>GBK</param-value>
</init-param>
</filter>
//映射—设置进行过滤的条件,如:类、页面或者某一目录
<filter-mapping>
<span style="white-space:pre"> </span><filter-name>CharsetEncodingFilter</filter-name>
<span style="white-space:pre"> </span><url-pattern>*.jsp</url-pattern>
</filter-mapping>
</span>
<filter>标签说明使用了filter技术,并说明filter的具体类。<init-param>表示filter初始的参数,这里指初始的编码格式
请求映射filter-mapping和servlet-mapping都是将对应的filter或servlet映射到某个uyl-pattern上,当客户发起某一请求时,服务器先将此请求与web.xml中定义的所有url-pattern进行匹配,然后执行匹配通过的filter和servlet。
3.CharsetEncodingFilter类里面进行一些设置
public class CharsetEncodingFilter implements Filter {
private String endCoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
<span style="white-space:pre"> </span>//获取web.xml中设置的编码格式
this.endCoding = filterConfig.getInitParameter("encoding");
}
<span style="white-space:pre"> </span>
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("setCharacterEncoding");
//设置字符集
request.setCharacterEncoding(endCoding);
//继续执行
chain.doFilter(request, response);
System.out.println("setCharacterEncoding-->end");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
filter中匹配方式
a.精确匹配,不用任何修饰符,如:/servlet/TestServlet
b.扩展匹配,由星号“*”和扩展名组成,如:*.jsp
c.路径前缀匹配,包含一个目录和一个*,如/sysmgr/*
d.全部匹配,一般使用/*,<url-pattern>/*</url-pattern>
这样就配置了所有jsp页面的编码格式。Filter可以批量设置请求的编码,也可以用它控制用户的访问权限,正如它的汉语解释“过滤器”一样,过滤掉不需要的,留下需要的...