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