Servlet API中包装类装饰模式的应用
来源:互联网 发布:vb语言基本代码 编辑:程序博客网 时间:2024/06/06 19:17
一、什么是Decorator模式
Decorator模式和Wrapper模式都允许装饰和包装某一个对象的行为,说白了,就是对某个对象进行修改
唯一必须满足的条件:被修饰对象的类要实现一个接口,并且要包装的方法必须从这个接口中继承
在修饰类中,被装饰的方法是指其行为要在子类中进行修改的方法。无论是否装饰,所有方法都要在Component中调用
修饰类它为其中的每一个方法都提供默认的实现,行为的具体改变由子类实现
必须记住:装饰类与被装饰的对象必须实现同一个接口
以下为装饰类的实现:
(通过接口来传入构造函数,实现与被装饰的对象的对接)
public class Decorator implements Component{private Component decorator;public Decorator (Component component){this.decorator=component;}@Overridepublic void methodA(args){decorator.methodA(args);}@Overridepublic void methodB(args){decorator.methodB(args);}}
二、Servlet Wrapper类
Servlet API中有四个包装(修饰类)类,分别是:
ServletRequestWrapper ,ServletResponseWrapper,HttpServletRequestWrapper,HttpServletResponseWrapper
他们分别通过实现httpServletRequest等接口,实现对装饰对象请求或者响应的装饰
我们可以通过继承他们,覆盖需要修改的方法即可
三、实例:AutoCorrect过滤器
在web程序中,用户经常会在输入值的时候,在其前面或者后面加入空格,甚至在词与词之间会加入一些多余的空格
该AutoCorrect过滤器可以自动去掉前后的空格,并将词与词之间的空格控制在一位,删除掉多余的空格
AutoCorrectFilter类
import java.io.IOException;import java.util.Collection;import java.util.Map;import java.util.Set;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;@WebFilter(urlPatterns={"/*"},filterName="AutoCorrectFilter")public class AutoCorrectFilter implements Filter {@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest httpServletRequest=(HttpServletRequest) arg0;AutoCorrectHttpServletRequest wrapper=new AutoCorrectHttpServletRequest(httpServletRequest);arg2.doFilter(wrapper, arg1);}class AutoCorrectHttpServletRequest extends HttpServletRequestWrapper{private HttpServletRequest httpServletRequest;public AutoCorrectHttpServletRequest(HttpServletRequest request) {super(request);this.httpServletRequest=request;}@Overridepublic String getParameter(String name) {// TODO Auto-generated method stubreturn autoCorrect(httpServletRequest.getParameter(name));}@Overridepublic String[] getParameterValues(String name) {// TODO Auto-generated method stubreturn autoCorrect(httpServletRequest.getParameterValues(name));}@Overridepublic Map<String, String[]> getParameterMap() {// TODO Auto-generated method stubfinal Map<String, String[]> parameterMap=httpServletRequest.getParameterMap();Map<String, String[]> newMap=new Map<String, String[]>(){@Overridepublic int size() {// TODO Auto-generated method stubreturn parameterMap.size();}@Overridepublic boolean isEmpty() {// TODO Auto-generated method stubreturn parameterMap.isEmpty();}@Overridepublic boolean containsKey(Object key) {// TODO Auto-generated method stubreturn parameterMap.containsKey(key);}@Overridepublic boolean containsValue(Object value) {// TODO Auto-generated method stubreturn parameterMap.containsValue(value);}@Overridepublic String[] get(Object key) {// TODO Auto-generated method stubreturn autoCorrect(parameterMap.get(key));}@Overridepublic String[] put(String key, String[] value) {// TODO Auto-generated method stubreturn parameterMap.put(key, value);}@Overridepublic String[] remove(Object key) {// TODO Auto-generated method stubreturn parameterMap.remove(key);}@Overridepublic void putAll(Map<? extends String, ? extends String[]> m) {// TODO Auto-generated method stubparameterMap.putAll(m);}@Overridepublic void clear() {// TODO Auto-generated method stubparameterMap.clear();}@Overridepublic Set<String> keySet() {// TODO Auto-generated method stubreturn parameterMap.keySet();}@Overridepublic Collection<String[]> values() {// TODO Auto-generated method stubreturn null;}@Overridepublic Set<java.util.Map.Entry<String, String[]>> entrySet() {// TODO Auto-generated method stubreturn null;}};return super.getParameterMap();}private String autoCorrect(String value) {// TODO Auto-generated method stubif(value==null){return null;}value=value.trim();int length=value.length();StringBuilder temp=new StringBuilder();boolean lastCharWasSpace=false;for(int i=0;i<length;i++){char c=value.charAt(i);if(c==' '){if(!lastCharWasSpace){temp.append(c);}lastCharWasSpace=true;}else{temp.append(c);lastCharWasSpace=false;}}return temp.toString();}private String[] autoCorrect(String[] strings) {// TODO Auto-generated method stubreturn null;}}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}
AutoCorrectHttpServletRequest通过继承HttpServletRequestWrapper实现了HttpServletRequest接口
在AutoCorrectHttpServletRequest类中修改HttpServletRequest接口的方法并将修饰过的对象传给doFilter方法
test1.jsp页面
<body> <form action="test2.jsp" method="post"> <table> <tr> <td>Name:</td> <td><input name="name" ></td></tr> <tr> <td>Address:</td> <td><input name="address"></td></tr> <tr> <td colspan="2"> <input type="submit" value="login"></td></tr></table></form> </body>test2.jsp页面
<body> <table><tr><td>Name:</td> <td>${param.name}</td></tr> <tr><td>Address:</td> <td>${param.address}</td></tr></table> <br> </body>
实现结果
0 0
- Servlet API中包装类装饰模式的应用
- 装饰模式的应用
- 装饰模式的应用
- 装饰模式(包装模式)
- 包装设计模式(装饰设计模式)的使用
- 浅谈装饰(包装)模式
- 装饰者模式---包装,展现最好的自己
- API 包装类的用法
- 过滤器和包装类设计模式的应用
- 装饰者模式的应用
- Java 装饰模式的应用
- Java实际应用中经常遇到的"装饰模式"总结
- 装饰者模式(包装模式)
- Cocos2d-x中应用装饰者模式
- Java 装饰模式在 IO 中应用
- Servlet API中类的关系
- 装饰设计模式之DataSource包装
- 装饰(包装)设计模式学习笔记
- 用java做导出excel的万能方法
- spark常用的transformation
- Java安全之消息摘要
- 学习OpenCV——KeyPoint Matching 优化方式
- 棋盘覆盖问题
- Servlet API中包装类装饰模式的应用
- rediskey的辅助类备忘
- LeetCode 257. Binary Tree Paths
- solvepnp详解
- Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
- java中“或”(||)条件的执行次序
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
- spring boot 单元测试
- quick框架之MyApp详解