在JSP中使用过滤器解决中文乱码问题
JSP中乱码产生的原因是web容器(Tomcat)默认使用ISO-8859-1进行编码的,而我们可能使用的是UTF-8,GBK,GB2312等编码方式进行jsp编写的,因此需要一个转换器进行转换或者修改默认编码方式,这里我主要用转换器+过滤器完成自动转换功能.
转换器的代码如下:
-
private
String encode=
"UTF-8"
;
-
private
String decode(String data){
-
try
{
-
return
new
String(data.getBytes(
"ISO-8859-1"
),encode);
-
} catch
(UnsupportedEncodingException e) {
-
return
""
;
-
}
-
}
使用过滤器可以完成自动转换功能,数据提交的对象是HttpRequest对象
1.通过request对象的getParameterMap().keySet()可以获取所有键值
2.通过getParameterValues(key)就可以获取提交的数据,结果是String[] 形式
3.使用转换器转换数据
4.通过request对象的setAttribute(k,v)方法将数据放回去
5.要获取数据时通过request的getAttribute(k)方法就可以获取数据.
为了支持多种编码,可以在过滤器中设计一个参数来控制转换的编码方式
代码如下:
-
public
class
EncodeFilter
implements
Filter {
-
-
private
String encode=
"UTF-8"
;
-
private
String decode(String data){
-
try
{
-
return
new
String(data.getBytes(
"ISO-8859-1"
),encode);
-
} catch
(UnsupportedEncodingException e) {
-
return
""
;
-
}
-
}
-
-
public
void
destroy() {
-
}
-
-
public
void
doFilter(ServletRequest req, ServletResponse res,
-
FilterChain fc) throws
IOException, ServletException {
-
HttpServletRequest hs=(HttpServletRequest) req;
-
for
(Object k :req.getParameterMap().keySet()){
-
String[] vals= req.getParameterValues(k.toString());
-
if
(vals.length>
1
){
-
for
(
int
i=
0
;i<vals.length;i++){
-
vals[i]=decode(vals[i]);
-
}
-
req.setAttribute(k.toString(), vals);
-
}
-
else
{
-
req.setAttribute(k.toString(), decode(vals[0
]));
-
}
-
-
}
-
fc.doFilter(req,res);
-
}
-
-
public
void
init(FilterConfig fc)
throws
ServletException {
-
if
(fc.getInitParameter(
"encode"
)!=
null
){
-
encode=fc.getInitParameter("encode"
);
-
}
-
-
}
-
-
}
使用过滤器就需要修改web.xml文件,web.xml文件中添加如下配置:
-
<
filter
>
-
<
filter-name
>
EncodeFilter
</
filter-name
>
-
<
filter-class
>
com.haha.common.EncodeFilter
</
filter-class
>
-
<
init-param
>
-
<
param-name
>
encode
</
param-name
>
-
<
param-value
>
UTF-8
</
param-value
>
-
</
init-param
>
-
</
filter
>
-
<
filter-mapping
>
-
<
filter-name
>
EncodeFilter
</
filter-name
>
-
<
url-pattern
>
*.jsp
</
url-pattern
>
-
</
filter-mapping
>
现在就可以使用request.getAttribute(k)来获取你的数据了,界面显示用${k}就可以直接获取数据了!