JAVA中的使用Filter过滤器设置字符集
Filter是什么?
Filter不是一个Servlet,它可以叫做Servlet链,它可以用来改变一个request,修改一个response。它虽然不能产生一个response,但可以在一个request到大Servlet之前预处理request,也可以在response离开Servlet时处理response。
具体的调用关系如下图所示。
也可以说,Filter是对Request和Response请求进行了拦截。
注意:
只对post请求有效。
新建一个TestFilter类,继承Filter类后,我们可以看到主要的几个方法。
package com.bjpowermode.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; public class TestFilter implements Filter { @Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub } @Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub } }
1)init()
用来设置filter的配置对象,只调用一次。
2)doFilter()
是最重要最核心的方法,执行Filter的工作。每一个filter从doFilter()方法中得到当前的request及response
3)destory()
返回配置对象。
Filter的生命周期
在应用启动的时候就进行装载Filter类。容器创建好Filter对象实例后,调用init()方法。接着保存进集合容器中去了等待着,用户访问资源。当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。
注意:init方法与destroy方法只会直接一次。
在实例中,我们用Filter主要是来设置字符集,防止jsp出现中文乱码现象。
如果不使用Filter,我们需要在每个jsp页面中添加如下语句:
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
那么,使用Filter之后呢?
package com.bjpowermode.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统一处理字符集
*/
public class CharSetEncodingFilter implements Filter { private String encoding; @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException { //System.out.println("CharsetEncoding--->>>begin");
//设置字符集
arg0.setCharacterEncoding("GB18030"); //继续执行
//如果还有filter,继续调,如果没有,就调jsp
chain.doFilter(arg0,arg1);
//System.out.println("CharsetEncoding--->>>end");
} @Override
public void init(FilterConfig arg0) throws ServletException { //System.out.println("CharsetEncoding--->>>init");
this.encoding=arg0.getInitParameter("encoding");
//System.out.println("CharsetEncoding--->>>init"+encoding);
} }
在配置文件中进行配置。
注意:
CharSetEncodingFilter方法名和与配置文件中要一致,
类的路径com.bjpowermode.drp.util.filter.CharSetEncodingFilter。
<filter>
<filter-name>CharSetEncodingFilter</filter-name>
<filter-class>com.bjpowermode.drp.util.filter.CharSetEncodingFilter</filter-class>
<init-param>
<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>
总结:
Filter提高了代码的灵活性,将变动移到了配置文件中而不是在页面上。
Filter除了可以设置字符集,解决乱码问题外,还可以用在验证用户权限,对网站进行压缩等方面。
JAVA中的使用Filter过滤器设置字符集的更多相关文章
- Java中的class为什么要设置访问控制?和C++比较的感悟
Java中的class为什么要设置访问控制?和C++比较的感悟 在Java中package解决了class的名字空间问题,class的成员都有各自的访问控制符,而class还有两种访问控制符,分别是p ...
- java中拦截器与过滤器之间的区别
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法u ...
- javaweb的Filter过滤器设置全站编码
FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...
- C#的Winform中OpenFileDialog对话框Filter属性设置包含特定字符,使用正则表达式
OpenFileDialog对话框的Filter属性说明: 首先观察Filter属性的组成部分:“Word文件|*.doc ”,前面的“Word文件”成为标签,是一个可读的字符串,可以自定定义,“|* ...
- java项目中通过添加filter过滤器解决ajax跨域问题
1.在web.xml添加filter <filter> <filter-name>contextfilter</filter-name> <filter-cl ...
- java中拦截器与过滤器
注:文摘自网络,仅供自己参考 1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之 ...
- Java中HashMap的初始容量设置
根据阿里巴巴Java开发手册上建议HashMap初始化时设置已知的大小,如果不超过16个,那么设置成默认大小16: 集合初始化时, 指定集合初始值大小. 说明: HashMap使用HashMap(in ...
- Django模板语言中的自定义方法filter过滤器实现web网页的瀑布流
模板语言自定义方法介绍 自定义方法注意事项 Django中有simple_tag 和 filter 两种自定义方法,之前也提到过,需要注意的是 扩展目录名称必须是templatetags templa ...
- java中如何给控件设置颜色
1. tv.setTextColor(Color.parseColor("#000000"));2. tv.setTextColor(getResources().getCo ...
随机推荐
- 9、SpringBoot+Mybatis整合------动态sql
开发工具:STS 前言: mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活. 动态sql中的语法: where标签 if标签 trim标签 set标签 s ...
- HDU.3177Crixalis's Equipment(贪心)
题目来源:3177 题目分析:一只蝎子要搬动一堆装备到一个容量为V的洞里面,每个装备有两个属性,一个是固有体积A,放置之后洞的剩余空间就会减少A,一个是移动体积B,只有当体积B小于等于当前洞的剩余体积 ...
- 【赛时总结】 ◇赛时·I◇ AtCoder ARC-098
◆赛时I◆ ARC-098 ■试题&解析■ ◆本场最水◆ C-Attention 长点儿信心吧-- [AtCoder ARC-098 C] [解析] 既然只存在左右(东西)两个朝向,那么领导右 ...
- python__标准库 : 正则表达式(re)
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. re.search 扫描整个字符串并返回第一个成功的匹配. 替换: re.sub(p ...
- linux通用GPIO驱动,写GPIO文件不立即生效问题解决
Linux开发平台实现了通用GPIO的驱动,用户通过,SHell或者系统调用能控制GPIO的输出和读取其输入值.其属性文件均在/sys/class/gpio/目录下,该目录下有export和unexp ...
- 2016 ACM-ICPC Asia China-Final D 二分
题意:一共有N个冰淇淋球,做一个冰淇淋需要K个球,并且由于稳定性,这K个球还必须满足上下相邻的下面比上面大至少两倍.先给出N个球的质量,问最多能做出多少个冰淇淋? 思路:二分答案并对其检验. 检验标准 ...
- [Bzoj3894]文理分科(最小割)
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位 ...
- Android 创建 SO 文件
创建工程,新建一个类,该类需要有一个static初始化块中调用System.loadLibrary("${soName}"),还需要有用native修饰的方法声明(无需实现),一个 ...
- Eclipse EE 运行 Myeclipse Web 应用
第一步:进入项目所在目录,打开.project文件,找到<natures>...</natures>标签,在中间添加如下子标签内容 <nature>org.ecli ...
- 世界未解之谜之----------Android Gradle
今天运行项目,运行的debug出来的包竟然是命名过的,但是我的buildTypes里面的debug 并没有执行重命名操作.很奇怪,我的猜测是: 执行buildTypes的时候,虽然是assermdeb ...