HttpServletRequestWrapper 用法(转) (

应用一:解决tomcat下中文乱码问题(先来个简单的) 

tomcat下,我们通常这样来解决中文乱码问题:

过滤器代码:

  1. package filter;  
  2.   
  3. import java.io.*;  
  4. import javax.servlet.*;  
  5. import javax.servlet.http.*;  
  6. import wrapper.GetHttpServletRequestWrapper;  
  7.   
  8. public class ContentTypeFilter implements Filter  
  9.   
  10.     private String charset "UTF-8" 
  11.     private FilterConfig config;  
  12.       
  13.     public void destroy()  
  14.         System.out.println(config.getFilterName()+"被销毁");  
  15.         charset null 
  16.         config null 
  17.      
  18.   
  19.     public void doFilter(ServletRequest request, ServletResponse response,  
  20.             FilterChain chain) throws IOException, ServletException  
  21.         //设置请求响应字符编码  
  22.         request.setCharacterEncoding(charset);  
  23.         response.setCharacterEncoding(charset);  
  24.           
  25.         HttpServletRequest req (HttpServletRequest)request;  
  26.           
  27.           
  28.         System.out.println("----请求被"+config.getFilterName()+"过滤");  
  29.         //执行下一个过滤器(如果有的话,否则执行目标servlet)  
  30.         chain.doFilter(req, response);  
  31.           
  32.         System.out.println("----响应被"+config.getFilterName()+"过滤");  
  33.   
  34.      
  35.   
  36.     public void init(FilterConfig config) throws ServletException  
  37.             this.config config;  
  38.             String charset config.getServletContext().getInitParameter("charset");    
  39.             ifcharset != null && charset.trim().length() != 0 
  40.              
  41.                 this.charset charset;  
  42.              
  43.      
  44.   
  45.  

web.xml中过滤器配置
<!--将采用的字符编码配置成应用初始化参数而不是过滤器私有的初始化参数是因为在JSP和其他地方也可能需要使用-->
 <context-param>
   <param-name>charset</param-name>
   <param-value>UTF-8</param-value>
 </context-param>

 <filter>
  <filter-name>ContentTypeFilter</filter-name>
  <filter-class>filter.ContentTypeFilter</filter-class>
 </filter>

 <filter-mapping>
  <filter-name>ContentTypeFilter</filter-name>
  <url-pattern>
    
public GetHttpServletRequestWrapper(HttpServletRequest request,
            String charset) 
{
        
super(request);
        
this.charset = charset;
    }


    

    
public String getParameter(String name) {
        String value 
= super.getParameter(name);
        value 
= value == null ? null convert(value);
        
return value;
    }


    
public String convert(String target) {
        System.out.println(
"编码转换之前:" + target);
        
try {
            
return new String(target.trim().getBytes("ISO-8859-1"), charset);
        }
 catch (UnsupportedEncodingException e) {
            
return target;
        }

    }

}


修改过滤器的doFilter方法 代码如下:

     public   void  doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) 
throws  IOException, ServletException  {
        
// 设置请求响应字符编码
        request.setCharacterEncoding(charset);
        response.setCharacterEncoding(charset);
        
// 新增加的代码
        HttpServletRequest req = (HttpServletRequest) request;

        
if (req.getMethod().equalsIgnoreCase("get")) {
            req 
= new GetHttpServletRequestWrapper(req, charset);
        }


        System.out.println(
"----请求被" + config.getFilterName() + "过滤");
        
// 传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象
        chain.doFilter(req, response);

        System.out.println(
"----响应被" + config.getFilterName() + "过滤");
    }

 

 

这样一来,在servlet中调用包装器的getParameters方法来获取参数,就已经完成了字符编码的转换过程,我们就不需要在每次获取参数时来进行字符编码转换了。
总结:自己写类继承HttpServletRequestWrapper,HttpServletRequestWrapper实现了HttpServletRequest接口。看tomcat的源代码可以发现,ServletRequest作为一个Component ,ServletRequestWrapper作为一个比较标准的Decorator ,实现ServletRequest接口并把ServletRequest当作成员变量,其他继承Decorator 的类(比如本例中的GetHttpServletRequestWrapper )就可以很好的操控ServletRequest及其子类(比如本例中的HttpServletRequest),HttpServletRequest的很多方法就可以根据我们的需求做改变,比如设置字符,去掉空格。
参考:
http://www.javaeye.com/topic/483158
http://fishhappy365.javaeye.com/blog/484185
http://www.javaeye.com/topic/220230
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值