Servlet API中包装类装饰模式的应用

一、什么是Decorator模式


Decorator模式和Wrapper模式都允许装饰和包装某一个对象的行为,说白了,就是对某个对象进行修改


唯一必须满足的条件:被修饰对象的类要实现一个接口,并且要包装的方法必须从这个接口中继承

在修饰类中,被装饰的方法是指其行为要在子类中进行修改的方法。无论是否装饰,所有方法都要在Component中调用

修饰类它为其中的每一个方法都提供默认的实现,行为的具体改变由子类实现


必须记住:装饰类与被装饰的对象必须实现同一个接口


以下为装饰类的实现:

(通过接口来传入构造函数,实现与被装饰的对象的对接)

public class Decorator implements Component{
	private Component decorator;
	
	public Decorator (Component component){
		this.decorator=component;
	}
	
	@Override
	public void methodA(args){
		decorator.methodA(args);
	}
	@Override
	public 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 {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest 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;
		}
		
		@Override
		public String getParameter(String name) {
			// TODO Auto-generated method stub
			return autoCorrect(httpServletRequest.getParameter(name));
		}
		@Override
		public String[] getParameterValues(String name) {
			// TODO Auto-generated method stub
			return autoCorrect(httpServletRequest.getParameterValues(name));
		}
		
		@Override
		public Map<String, String[]> getParameterMap() {
			// TODO Auto-generated method stub
			final Map<String, String[]> parameterMap=httpServletRequest.getParameterMap();
			
			Map<String, String[]> newMap=new Map<String, String[]>(){

				@Override
				public int size() {
					// TODO Auto-generated method stub
					return parameterMap.size();
				}

				@Override
				public boolean isEmpty() {
					// TODO Auto-generated method stub
					return parameterMap.isEmpty();
				}

				@Override
				public boolean containsKey(Object key) {
					// TODO Auto-generated method stub
					return parameterMap.containsKey(key);
				}

				@Override
				public boolean containsValue(Object value) {
					// TODO Auto-generated method stub
					return parameterMap.containsValue(value);
				}

				@Override
				public String[] get(Object key) {
					// TODO Auto-generated method stub
					return autoCorrect(parameterMap.get(key));
				}

				@Override
				public String[] put(String key, String[] value) {
					// TODO Auto-generated method stub
					return parameterMap.put(key, value);
				}

				@Override
				public String[] remove(Object key) {
					// TODO Auto-generated method stub
					return parameterMap.remove(key);
				}

				@Override
				public void putAll(Map<? extends String, ? extends String[]> m) {
					// TODO Auto-generated method stub
					parameterMap.putAll(m);
				}

				@Override
				public void clear() {
					// TODO Auto-generated method stub
					parameterMap.clear();
				}

				@Override
				public Set<String> keySet() {
					// TODO Auto-generated method stub
					return parameterMap.keySet();
				}

				@Override
				public Collection<String[]> values() {
					// TODO Auto-generated method stub
					return null;
				}

				@Override
				public Set<java.util.Map.Entry<String, String[]>> entrySet() {
					// TODO Auto-generated method stub
					return null;
				}
				
			};
			return super.getParameterMap();
		}
		private String autoCorrect(String value) {
			// TODO Auto-generated method stub
			if(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 stub
			return null;
		}
		
	}	
	@Override
	public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值