Java Web
来源:互联网 发布:mac用minila 编辑:程序博客网 时间:2024/06/03 20:38
设计模式是:装饰(包装)设计模式
装饰(包装)设计模式:
①定义一个类,实现被装饰对象的接口
②定义一个成员变量,作为被装饰对象的引用
③定义构造方法,传入被装饰对象的实例
④改写要修改的方法
⑤不需要改写的方法,调用被装饰对象的原来的方法什么时候使用装饰设计模式
当我们需要对一个类进行增强的时候,增强后的类不再当前类的范畴
如:现在有一个 Animal 类 Cat 和 Dog 都属于动物类型,因此可以直接继承,现在新来一个 “玩具狗”,不属于动物的范围,但是有需要用其中的方法,这时候我们选择使用装饰(包装)设计模式
1. 编写 MyRequestPlus 类让其继承 HttpServletRequestWrapper
import java.io.UnsupportedEncodingException;import java.util.Map;import java.util.Set;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class MyRequestPlus extends HttpServletRequestWrapper { private HttpServletRequest request = null; //标记,当前requset,是否已经编码过了 private boolean flag = false; public MyRequestPlus(HttpServletRequest request) { super(request); System.out.println("encoding by MyRequestPlus"); this.request = request; } @Override public Map<String, String[]> getParameterMap() { String method = this.request.getMethod(); if ("post".equalsIgnoreCase(method)) { try { request.setCharacterEncoding("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } Map<String, String[]> map = this.request.getParameterMap(); return map; } else if ("get".equalsIgnoreCase(method)) { Map<String, String[]> map = this.request.getParameterMap(); //第一次获取请求参数,flag==false,执行后面的额乱码处理动作 //请求参数已修改,第二次获取请求参数的时候,,直接返回已经编码过的map集合 if (flag) { return map; } if (map == null) { return super.getParameterMap(); } else { // 获得map集合的key Set<String> key = map.keySet(); // 通过key将map中的元素取出来 for (String string : key) { String[] value = map.get(string); // 遍历value,转换参数 for (int i = 0; i < value.length; i++) { try { String string2 = new String( value[i].getBytes("iso-8859-1"), "utf-8"); value[i] = string2; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } flag = true; return map; } } else { //其它请求方式 return super.getParameterMap(); } } @Override public String[] getParameterValues(String name) { // 通过map集合获取参数 Map<String, String[]> map = this.getParameterMap(); if (map == null) { return super.getParameterValues(name); } else { String[] strings = map.get(name); return strings; } } @Override public String getParameter(String name) { // 通过values获取参数 String[] values = this.getParameterValues(name); if (values == null) { return super.getParameter(name); } else { return values[0]; } }}
2. EncodeFilter 过滤器 传 request 和 response 对象给 MyRequestPlus 进行修饰,以修改编码:
public class EncodeFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp; MyRequestPlus myRequestPlus = new MyRequestPlus(request); chain.doFilter(myRequestPlus, response); }
3. 配置XML:
编码过滤器需要放在所有过滤器的上面
filter> <filter-name>encodeFilter</filter-name> <filter-class>com.chinasoft.day09.filters.EncodeFilter</filter-class> </filter> <filter-mapping> <filter-name>encodeFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
阅读全文
1 0
- WEB和JAVA WEB
- JAVA WEB
- java web
- JAVA WEB
- java web
- java web
- Java web
- JAVA WEB
- java Web
- Java web
- Java web
- Java Web
- Java Web
- java web
- java web
- java web
- java web
- java web
- Maven依赖
- Spring:Bean的全生命周期
- OSG3.4.0+VS2010+WIN10编译及二次开发环境搭建
- Css选择器
- 从源码理解LinkedMap和HashMap的区别
- Java Web
- 第五章 使用形态学滤波对图像进行边缘及角点检测
- JAVA作业
- 对python中对象的理解
- linux 进程的管理、子进程创建、进程资源的回收
- Android屏幕适配基础(1)
- python基本数据类型总结
- 2017中国开源年会(COSCon'17) 正式开启-逐浪字库倾力支持
- 解决阿里云ECS 8080端口无法访问的问题