亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

關于裝飾Servlet Request對象簡介圖

2019-11-18 12:32:12
字體:
來源:轉載
供稿:網友

  摘要
  
  裝飾模式是Erich Gamma等人所著的《設計模式:可利用面向對象軟件的基礎》一書中眾多模式之一。一般來說,此模式在設計Swing的程序員中比較流行,他們用它來改進軟件。今天,即使有許多程序是基于Web應用的,裝飾模式仍有用武之地,在J2EE的環境下也有使用的價值。
  
  本文說明了如何將裝飾模式應用到servlet request對象上。首先,提出了一個與servlet filter有關的問題,并解釋了隨之而引入的裝飾模式。然后,討論了如何在servlet環境下使用此模式,并列出了使用此模式的幾個比較有名的基于servlet的項目。最后,文章通過實現一個刪除空白符的filter例子,演示了裝飾模式在servlet中的使用。
  
  簡介
  
  Servlet規范中所引入的filter令人心動不已,因為它引入了一個功能強大的攔截模式。Filter是這樣一種java對象,它能在request到達servlet的服務方法之前攔截HttpServletRequest對象,而在服務方法轉移控制后又能攔截HttpServletResponse對象。你可以使用filter來實現特定的任務,比如驗證用戶輸入,以及壓縮web內容。但你擬富有成效地使用過濾器的念頭卻被你不能改變HttpServletRequest對象的參數的現實掃了興,因為java.util.Map所包裝的HttpServletRequest對象的參數是不可改變的。這極大地縮減了filter的應用范圍。至少在一半的時間里,你希望可以改變預備傳送給filter的對象。假如在HttpServletRequest對象到達Struts的action servlet之前,我們可以通過一個filter將用戶輸入的多余空格去掉,難道不是更美妙嗎?這樣的話,你就不必等到在Struts的action表單驗證方法中才進行這項工作了。
  
  幸運的是,盡管你不能改變不變對象本身,但你卻可以通過使用裝飾模式來改變其狀態。
  
  裝飾模式
  
  在繼續中,你可以通過繼續一個父類并覆蓋你希望改變的方法來改變對象狀態。然而,假如這個對象是由程序的另一個子模塊,例如對象工廠 (這里所說的工廠是工廠模式中的術語,下同。譯者注) 或是servlet容器所產生的,繼續就無能為力了。
  
  裝飾模式可用來增加一個現有對象的功能,或是改變其狀態。與其使用繼續方式來擴展此類,這個模式將一個對象包裝成另外一個對象。圖1是裝飾模式的UML類圖。
  
 關于裝飾Servlet Request對象簡介圖(圖一)

  
圖1:裝飾模式

  
  在圖1中,Component是一個接口,其具體實現是ConcreteComponent。要改變Component的狀態,你可以修改ConcreteComponent或是擴展它 (通過繼續或實現接口的方式,譯者注)。然而,假如ConcreteComponent來自于一個工廠,你卻無計可施。你所能做的,就是創建一個同為實現了Component接口的裝飾類。在圖1中,這個裝飾類的角色就由Decorator來扮演,在程序中通常表現為接口或抽象類。Decorator類的一個特性就是,它有一個接收Component對象的構造方法。你將擬裝飾的對象傳遞給這個構造方法。在本例中,這個對象就是從工廠獲得的ConcreteComponent對象。通過將此裝飾對象傳遞給Decorator的一個類變量,你可以訪問Decorator中的任何方法。這就使你得以改變對象的狀態了。
  
  圖1中的Decorator類不一定是接口或抽象類。假如你的程序不是很復雜,你可以將其轉化為一個具體的Decorator類。
  
  舉個例子,考慮這樣一個簡單的消息傳遞程序,其主要部分是Messenger接口及其實現類MessengerImpl。讓我們假設MessengerImpl對象來自于一個工廠,因此你不能改變其狀態。假如你預備增加或改變Messenger對象的功能,你可以創建一個MessengerDecorator類。圖2是此例子的類圖。
  
 關于裝飾Servlet Request對象簡介圖(圖二)

  
圖2:Messenger裝飾類

  
  我們來看程序的代碼。列表1給出了Messenger接口的代碼,列表2是MessengerImpl類的代碼。
  
  列表1:Messenger接口
  
  public interface Messenger { public String getMessage();}
  
  列表2:MessengerImpl類
  
  public class MessengerImpl implements Messenger { PRivate String message;
  public MessengerImpl(String message) {  this.message = message;
  } public String getMessage() {  return message;
  }
  }
  
  Messenger對象由一個名為MessengerFactory的工廠創建,如列表3所示。
  
  列表3:MessengerFactory類
  
  public class MessengerFactory {
  public static Messenger getMessenger()
  {
  return new MessengerImpl("secrets");
  }
  }
  
  對每一個所創建的Messenger對象,此工廠通過某個未知的操作,初始化了getMessage()方法所返回的字符串。換句話說,你不能自己創建Messenger對象。
  
  在程序中,Messenger對象的主要用途是被傳遞給一個名為Util的類中的broadcast()靜態方法。列表4是Util類的代碼。
  
  列表4:Util類
  
  public class Util {
  public static void broadcast(Messenger messenger) {
  System.out.print(messenger.getMessage());
  }
  // other methods here}
  
  在你自己的類中,你可能會有這樣的代碼:
  
  Messenger messenger = MessengerFactory.getMessenger();
  Util.broadcast(messenger);
  
  假設你希望對broadcast()方法所打印出的消息做一小改動。你擬將其轉為大寫,怎么做?表面上看,你可以繼續Messenger,實例化其子類,并將返回的對象傳給Util.broadcast()。但是,這種做法毫無意義,因為只有工廠才知道如何初始化Messenger對象,并通過其getMessage()方法返回正確的值。
  
  使用裝飾模式,你可以創建一個MessengerDecorator類,如列表5所示。
  
  列表5:MessengerDecorator類
  
  public class MessengerDecorator implements Messenger { private Messenger messenger;
  public MessengerDecorator(Messenger messenger) {  this.messenger = messenger;
  } public String getMessage() {  return messenger.getMessage().toUpperCase();
  }
  }
  
  因為MessengerDecorator實現了Messenger,Util.broadcast()將接受一個MessengerDecorator的實例。然而,MessengerDecorator不僅僅是一個接口的實現,它還是一個MessengerImpl對象的裝飾器。正因如此,MessengerDecorator就必須有一個接收擬被裝飾的Messenger對象的構造方法。
  
  如列表5所示,這個構造方法將參數傳給變量。你現在可以覆蓋MessengerDecorator中的getMessage()方法,以便將消息轉為大寫后再打印出來。因為你持有原來Messenger對象的引用,你可以這樣寫getMessage()方法:
  
  public String getMessage() {
  return this.messenger.getMessage().toUpperCase();
  }
  
  MessengerDecorator中的getMessage()方法返回原始消息的大寫版本。
  
  在你的類中,就像往常一樣,你得到一個Messenger對象,并將Decorator傳給Util.broadcast()。
  
  Messenger messenger = factory.getMessenger();
  Util.broadcast(new MessengerDecorator(messenger));
  
  你并不將原始對象傳給原先的目標,相反,你將其傳給了該對象的裝飾器。
  
  應用裝飾模式于Servlet
  
  以上Messenger類的例子與servlet容器所構造的ServletRequest對象是一樣的。當收到一個HTTP請求時,servlet容器就會創建ServletRequest對象及ServletResponse對象(分別是ServletRequestImpl及ServletResponseImpl的實例),并將這兩個對象傳遞給特定的servlet服務方法?,F在,假如你為ServletRequest創建一個裝飾角色,并將其傳給servlet服務方法,你就應用了裝飾模式。
  
  對ServletRequest很輕易應用裝飾模式,因為servlet API已經為其提供了一個包裝類:ServletRequestWrapper。圖3是一個servlet裝飾模式的類圖。
  
 關于裝飾Servlet Request對象簡介圖(圖三)

  
圖3:Servlet API中的裝飾模式

  
  圖3中的HTTP版本的類圖如圖4所示。別為過多的類搞暈了頭,只管注重虛線框中的三個類就行了:HttpServletRequest, HttpServletRequestImpl, HttpServletRequestWrapper。
  
關于裝飾Servlet Request對象簡介圖(圖四)

  
圖4:Servlet API (HTTP)的裝飾模式

  
  情況與前面所舉例子類似。你擁有一個ServletRequest的實現,而它是由servlet容器產生的。你可以使用所提供的ServletRequestWrapper來裝飾這些ServletRequest對象。
  
  這個模式很簡單,在實際應用中可以派上用場。實際上,一些很有名的應用就使用了此模式。這些應用包括:
  
  Struts - Struts是當前開發Java Web應用最受歡迎的基于MVC(模型-視圖-控制)模式的框架。Struts提供了相當于ServletRequest包裝類的org.apache.struts.upload.MultipartRequestWrapper類。 MultipartRequestWrapper覆蓋了getParameter(),getParameterNames(),及getParameterValues()等方法來實現文件上傳。
  
  Apache Beehive ?C 這個源于BEA的WebLogic專題小組的開源項目,構建于Struts之上,并簡化了web應用及web服務的開發。與ServletRequest包裝類一樣,org.apache.beehive.netui.pageflow.internal包中的PageFlowRequestW

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
7m第一福利500精品视频| 欧美成人亚洲成人日韩成人| 国产精品爽爽ⅴa在线观看| 日韩电视剧在线观看免费网站| 久久国产精品影视| 91久久久久久久一区二区| 日韩激情第一页| 在线观看国产成人av片| 国产精品jizz在线观看麻豆| 亚洲精品日韩丝袜精品| 欧美香蕉大胸在线视频观看| 亚洲高清av在线| 欧美激情视频在线观看| 不卡av电影在线观看| 国产日韩精品在线观看| 欧美国产精品va在线观看| 亚洲情综合五月天| 欧美大片免费观看| 国产精品中文字幕久久久| 亚洲欧美日韩天堂| 久久久精品一区二区| 成人美女av在线直播| 亚洲成人亚洲激情| 最近中文字幕mv在线一区二区三区四区| 亚洲激情电影中文字幕| 国内成人精品视频| 亚洲精品国产精品国产自| 奇米成人av国产一区二区三区| 日韩美女激情视频| 中文字幕亚洲情99在线| 亚洲视频777| 国产精品九九九| 91中文精品字幕在线视频| www国产精品视频| 8050国产精品久久久久久| 日日狠狠久久偷偷四色综合免费| 亚洲自拍另类欧美丝袜| 亚洲成年人在线播放| 在线观看欧美视频| 亚洲xxxx妇黄裸体| 日韩免费观看高清| 欧美视频一区二区三区…| 国产精品视频26uuu| 欧美电影在线观看网站| 欧美在线视频播放| 国产精品96久久久久久又黄又硬| 国产成人精品午夜| 亚洲精品按摩视频| 中文字幕精品久久| 日韩av手机在线看| 精品日本美女福利在线观看| 欧美激情亚洲综合一区| 久久久精品中文字幕| 国模精品视频一区二区| 91九色单男在线观看| 高清一区二区三区四区五区| 欧美国产在线视频| 精品丝袜一区二区三区| 成人国产亚洲精品a区天堂华泰| 国产亚洲精品久久久久久牛牛| 国产精品视频白浆免费视频| 一本久久综合亚洲鲁鲁| 亚洲美女中文字幕| xxxxxxxxx欧美| 668精品在线视频| 91精品久久久久久久久不口人| 午夜精品一区二区三区视频免费看| 国产一区二区丝袜高跟鞋图片| 欧美一区二区三区免费观看| 精品亚洲一区二区| 91九色国产视频| 亚洲精品免费在线视频| 97超碰国产精品女人人人爽| 欧美精品videos| 亚洲精品国产suv| 久久精品久久久久| 中文日韩电影网站| 91欧美日韩一区| 成人疯狂猛交xxx| 国产视频观看一区| 久久综合伊人77777尤物| 国产成人久久久精品一区| 日韩成人在线网站| 国产日韩在线播放| 国产91av在线| 久久国产视频网站| 亚洲一区二区三区sesese| 久久人人爽人人爽人人片av高清| 日韩av电影院| 日韩女优在线播放| 亚洲第一国产精品| 亚洲国产日韩欧美在线动漫| 欧美综合激情网| 欧美成人国产va精品日本一级| 欧美性猛交xxxx免费看漫画| 亚洲午夜未删减在线观看| 美女精品视频一区| 欧美日韩一区二区在线| 亚洲成色777777在线观看影院| 欧美寡妇偷汉性猛交| 欧美大成色www永久网站婷| 日韩av免费在线看| 97人洗澡人人免费公开视频碰碰碰| 国产精品香蕉国产| 91精品国产免费久久久久久| 国产婷婷97碰碰久久人人蜜臀| 在线精品91av| 久久夜精品va视频免费观看| 亚洲激情在线观看| 国产69精品久久久久久| 亚洲欧洲偷拍精品| 亚洲人成网7777777国产| 91av在线播放| 成人免费观看a| 国产亚洲欧洲黄色| 午夜剧场成人观在线视频免费观看| 69久久夜色精品国产69乱青草| 91视频免费在线| 亚洲最大福利视频网站| 国产美女主播一区| 欧美在线激情网| 国产精品无码专区在线观看| 欧美精品在线第一页| 久久久噜噜噜久久久| 色婷婷亚洲mv天堂mv在影片| 欧美亚洲另类激情另类| 日韩在线免费高清视频| 亚洲美女又黄又爽在线观看| 91丨九色丨国产在线| 久久人人爽亚洲精品天堂| 国产日韩换脸av一区在线观看| 亚洲男人天天操| 91理论片午午论夜理片久久| 97成人在线视频| 亚洲欧洲一区二区三区久久| 午夜精品99久久免费| 久久久精品2019中文字幕神马| 日韩精品免费在线| 欧美午夜丰满在线18影院| 欧美一级bbbbb性bbbb喷潮片| 亚洲国产精品系列| 亚洲精品视频中文字幕| 在线一区二区日韩| 久久久久久有精品国产| 精品露脸国产偷人在视频| 亚洲女人天堂色在线7777| 日本国产一区二区三区| 亚洲成人黄色网址| www.xxxx精品| 国产精品女主播| 91精品国产91久久久| 国产91露脸中文字幕在线| 国内精久久久久久久久久人| 国产精品日韩欧美综合| 国产精品久久久久久久久久久不卡| 亚洲精品欧美极品| 精品国产91久久久| 国产专区欧美专区| 久久99精品久久久久久青青91| 亚洲精品在线不卡| 欧美一区在线直播| 亚洲国产精品福利| 成人黄色午夜影院| 狠狠躁夜夜躁人人爽天天天天97|