生活随笔
收集整理的這篇文章主要介紹了
第十二章_请求和响应的装饰
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
12.1、Decorator模式
即使沒有某一個對象的類的源代碼,甚至即便這個類是聲明為final的,Decorator模式和Wrapper模式都允許裝飾或包裝這個對象。
Decorator模式適用于無法使用繼承的情況(比如,所指對象的類為final),或者你不想親自創建對象,而是想從另一個子系統中獲取。例如,Servlet容器創建了一個ServletRequest和一個ServletResponse,并將他們傳給Servlet的service方法。改變ServletRequest和ServletResponse行為的唯一方法是將他們包在其他對象中。唯一必須滿足的條件是,被裝飾對象的類要實現一個接口,并且要包裝的方法必須從這個接口處繼承。
?
12.2、Servlet?Wrapper類
Servlet?API中提供了4個類,他們很少用到,但是功能非常強大,分別是:ServletRequestWrapper、ServletResponseWrapper,以及HttpServletRequestWrapper和HttpServletResponseWrapper。
ServletRequestWrapper使用起來非常方便,由于它為調用被包裝ServletRequest中的對等方法的每一個方法都提供了默認實現。通過繼承則只好直接實現ServletRequest,并為接口中的每一個方法都提供實現。
?
12.3、范例:AutoCorrect過濾器
在web應用程序中,用戶經常會在輸入值時,在其前面或者后面添加一些空格,甚至在詞與詞之間也會有多余空格。你又不想到應用程序的逐個Servlet中進行檢查并刪除多余的空格。那么本屆介紹的AutoCorrect過濾器的特性就可以幫你完成這些工作。這個過濾器中包含一個HttpServletRequestWrapper的子類,命名為AutoCorrectHttpServletRequestWrapper,并覆蓋返回一個或多個參數值的下列方法:getParameter、getParameterValues和getParameterMap。
AutoCorrectFilter.Java
[html]?view plaincopy print?
package?filter;????import?java.io.IOException;??import?java.util.ArrayList;??import?java.util.Collection;??import?java.util.HashSet;??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(filterName?=?"AutoCorrectFilter",?urlPatterns?=?{"/*"})??public?class?AutoCorrectFilter?implements?Filter{????????@Override??????public?void?destroy()?{??????????//?TODO?Auto-generated?method?stub????????????????}????????????@Override??????public?void?init(FilterConfig?arg0)?throws?ServletException?{??????????//?TODO?Auto-generated?method?stub????????????????}????????@Override??????public?void?doFilter(ServletRequest?request,?ServletResponse?response,??????????????FilterChain?filterChain)?throws?IOException,?ServletException?{??????????HttpServletRequest?httpServletRequest?=?(HttpServletRequest)request?;??????????AutoCorrectHttpServletRequestWrapper?wrapper?=?new???????????????????AutoCorrectHttpServletRequestWrapper(httpServletRequest)?;??????????filterChain.doFilter(wrapper,?response);??????}????????????class?AutoCorrectHttpServletRequestWrapper?extends?HttpServletRequestWrapper{??????????private?HttpServletRequest?httpServletRequest?;??????????public?AutoCorrectHttpServletRequestWrapper(HttpServletRequest?httpServletRequest)?{??????????????super(httpServletRequest);??????????????this.httpServletRequest?=?httpServletRequest?;??????????}??????????@Override??????????public?String?getParameter(String?name)?{??????????????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()?{??????????????????????return?parameterMap.size();??????????????????}????????????????????@Override??????????????????public?boolean?isEmpty()?{??????????????????????return?parameterMap.isEmpty();??????????????????}????????????????????@Override??????????????????public?boolean?containsKey(Object?key)?{??????????????????????return?parameterMap.containsKey(key);??????????????????}????????????????????@Override??????????????????public?boolean?containsValue(Object?value)?{??????????????????????return?parameterMap.containsValue(value);??????????????????}????????????????????@Override??????????????????public?String[]?get(Object?key)?{??????????????????????return?autoCorrect(parameterMap.get(key));??????????????????}????????????????????@Override??????????????????public?String[]?put(String?key,?String[]?value)?{??????????????????????return?parameterMap.put(key,?value);??????????????????}????????????????????@Override??????????????????public?String[]?remove(Object?key)?{??????????????????????return?parameterMap.remove(key);??????????????????}????????????????????@Override??????????????????public?void?putAll(Map<??extends?String,???extends?String[]>?m)?{??????????????????????parameterMap.putAll(m);??????????????????}????????????????????@Override??????????????????public?void?clear()?{??????????????????????parameterMap.clear();??????????????????}????????????????????@Override??????????????????public?Set<String>?keySet()?{??????????????????????return?parameterMap.keySet();??????????????????}????????????????????@Override??????????????????public?Collection<String[]>?values()?{??????????????????????return?autoCorrect(parameterMap.values());??????????????????}????????????????????@Override??????????????????public?Set<java.util.Map.Entry<String,?String[]>>?entrySet()?{??????????????????????return?autoCorrect(parameterMap.entrySet());??????????????????}????????????????????????????????}?;??????????????return?newMap?;??????????}????????????????}???????private?String?autoCorrect(String?value){??????????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[]?values){??????????if(values?!=?null){??????????????int?length?=?values.length?;??????????????for(int?i=0;?i<length;?i++){??????????????????values[i]?=?autoCorrect(values[i])?;??????????????}??????????????return?values?;??????????}??????????return?null?;??????}??????@SuppressWarnings("unused")??????private?Collection<String[]>?autoCorrect(Collection<String[]>?valueCollection){??????????Collection<String[]>?newCollection?=?new?ArrayList<String[]>()?;??????????for(String[]?values?:?valueCollection){??????????????newCollection.add(autoCorrect(values))?;??????????}??????????return?newCollection?;??????}??????private?Set<Map.Entry<String,?String[]>>?autoCorrect(Set<Map.Entry<String,?String[]>>?entrySet){??????????Set<Map.Entry<String,?String[]>>?newSet?=?new?HashSet<Map.Entry<String,?String[]>>()?;??????????for(final?Map.Entry<String,?String[]>?entry?:?entrySet){??????????????Map.Entry<String,?String[]>?newEntry?=?new?Map.Entry<String,?String[]>()?{??????????????????@Override??????????????????public?String?getKey()?{??????????????????????return?entry.getKey();??????????????????}??????????????????@Override??????????????????public?String[]?getValue()?{??????????????????????return?autoCorrect(entry.getValue());??????????????????}??????????????????@Override??????????????????public?String[]?setValue(String[]?value)?{??????????????????????return?entry.setValue(value);??????????????????}??????????????};??????????????newSet.add(newEntry)?;??????????}??????????return?newSet?;??????}??}?? test1.jsp [html]?view plaincopy print?
<%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%>??<%??String?path?=?request.getContextPath();??String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";??%>????<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">??<html>????<head>??????<base?href="<%=basePath%>">????????????<title>User?Form</title>????????????<meta?http-equiv="pragma"?content="no-cache">??????<meta?http-equiv="cache-control"?content="no-cache">??????<meta?http-equiv="expires"?content="0">??????????<meta?http-equiv="keywords"?content="keyword1,keyword2,keyword3">??????<meta?http-equiv="description"?content="This?is?my?page">??????????????</head>????????<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>??</html>?? test2.jsp
[html]?view plaincopy print?
<%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%>??<%@?taglib?prefix="fn"?uri="http://java.sun.com/jsp/jstl/functions"?%>??<%??String?path?=?request.getContextPath();??String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";??%>????<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">??<html>????<head>??????<base?href="<%=basePath%>">????????????<title>Form?Values</title>????????????<meta?http-equiv="pragma"?content="no-cache">??????<meta?http-equiv="cache-control"?content="no-cache">??????<meta?http-equiv="expires"?content="0">??????????<meta?http-equiv="keywords"?content="keyword1,keyword2,keyword3">??????<meta?http-equiv="description"?content="This?is?my?page">??????????????</head>????????<body>??????<table>??????????????<tr>??????????????????<td>Name:</td>??????????????????<td>??????????????????????${param.name}??????????????????????(length:${fn:length(param.name)})??????????????????</td>??????????????</tr>??????????????<tr>??????????????????<td>Address:</td>??????????????????<td>??????????????????????${param.address}??????????????????????(length:${fn:length(param.address)})??????????????????</td>??????????????</tr>??????????</table>????</body>??</html>?? 運行結果:
總結
以上是生活随笔為你收集整理的第十二章_请求和响应的装饰的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。