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}就可以直接获取数据了!