//HttpServletRequestWrapper:它实现了HttpServletRequest接口,继承当前对象之后,也是HttpServletRequest接口的实现类
//第一问题:增强request,可以直接实现接口,为什么要继承HttpServletRequestWrapper?
//因为HttpServletRequestWrapper,已经实现了接口的方法,我们只需继承就可以使用,
//如果需要对某些方法增强,只需要修改部分方法即可,其他,调用父类的方法就完成了
/**
* 补充(装饰(包装)设计模式心法):
1)定义一个类,实现被装饰对象的接口
2)定义一个成员变量,记住被装饰对象的引用
3)定义构造方法,传入被装饰对象的实例
4)改写要修改的方法
5)不需要改写的方法,调用被装饰对象的原来的方法
* */
//1)定义一个类,实现被装饰对象的接口
publicclass MyRequest extends HttpServletRequestWrapper{
//2)定义一个成员变量,记住被装饰对象的引用
private HttpServletRequest request = null;
//3)定义构造方法,传入被装饰对象的实例
//设置一个标记,用来防止,编码多次运行,要保证get方式编码,只运行一次
privatebooleanflag = false;
public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
//4)改写要修改的方法
//所有获取参数的方法,都需要改写
@Override
public Map<String, String[]> getParameterMap() {
//先判断请求的方式——每一次请求,只会有一种请求方式post get
String method = this.request.getMethod();
if("post".equalsIgnoreCase(method)){
//post请求方式
try {
this.request.setCharacterEncoding("utf-8");
returnthis.request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
returnsuper.getParameterMap();
}
}elseif("get".equalsIgnoreCase(method)){
//先获取所有的数
Map<String, String[]> map = this.request.getParameterMap();
if(map == null){
returnsuper.getParameterMap();
}
//如果flag是false,说明没有执行过,执行中文乱码处理
//如果flag是true,说明执行过乱码处理,不再重复
if(flag){
return map;
}
//遍历循环map集合,将每一个数据进行中文乱码处理
//循环map集合的时候,先获取所有key的Set集合,然后,根据key,获取value值
//当前循环结束,map集合中所有数据处理完成
for (String key : map.keySet()) {
//获取的数据是String数组
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shouji/article-47577-9.html
别随便说同志不合法