日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
HttpServletRequest對(duì)象介紹

簡(jiǎn)介

創(chuàng)新互聯(lián)建站成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都網(wǎng)站建設(shè)、網(wǎng)站制作網(wǎng)站開(kāi)發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),成都響應(yīng)式網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:18980820575

Servlet規(guī)范中所引入的filter令人心動(dòng)不已,因?yàn)樗肓艘粋€(gè)功能強(qiáng)大的攔截模式。Filter是這樣一種Java對(duì)象,它能在request到達(dá)servlet的服務(wù)方法之前攔截Http Servlet Request對(duì)象,而在服務(wù)方法轉(zhuǎn)移控制后又能攔截HttpServletResponse對(duì)象。你可以使用filter來(lái)實(shí)現(xiàn)特定的任務(wù),比如驗(yàn)證用戶輸入,以及壓縮web內(nèi)容。但你擬富有成效地使用過(guò)濾器的念頭卻被你不能改變Http Servlet Request對(duì)象的參數(shù)的現(xiàn)實(shí)掃了興,因?yàn)閖ava.util.Map所包裝的Http Servlet Request對(duì)象的參數(shù)是不可改變的。這極大地縮減了filter的應(yīng)用范圍。至少在一半的時(shí)間里,你希望可以改變準(zhǔn)備傳送給filter的對(duì)象。如果在Http Servlet Request對(duì)象到達(dá)Struts的action servlet之前,我們可以通過(guò)一個(gè)filter將用戶輸入的多余空格去掉,難道不是更美妙嗎?這樣的話,你就不必等到在Struts的action表單驗(yàn)證方法中才進(jìn)行這項(xiàng)工作了。

幸運(yùn)的是,盡管你不能改變不變對(duì)象本身,但你卻可以通過(guò)使用裝飾模式來(lái)改變其狀態(tài)。

裝飾模式

在繼承中,你可以通過(guò)繼承一個(gè)父類并覆蓋你希望改變的方法來(lái)改變對(duì)象狀態(tài)。然而,如果這個(gè)對(duì)象是由程序的另一個(gè)子模塊,例如對(duì)象工廠 (這里所說(shuō)的工廠是工廠模式中的術(shù)語(yǔ),下同。譯者注) 或是servlet容器所產(chǎn)生的,繼承就無(wú)能為力了。

裝飾模式可用來(lái)增加一個(gè)現(xiàn)有對(duì)象的功能,或是改變其狀態(tài)。與其使用繼承方式來(lái)擴(kuò)展此類,這個(gè)模式將一個(gè)對(duì)象包裝成另外一個(gè)對(duì)象。裝飾模式的UML類圖。

裝飾模式

Component是一個(gè)接口,其具體實(shí)現(xiàn)是ConcreteComponent。要改變Component的狀態(tài),你可以修改 ConcreteComponent或是擴(kuò)展它 (通過(guò)繼承或?qū)崿F(xiàn)接口的方式,譯者注)。然而,如果ConcreteComponent來(lái)自于一個(gè)工廠,你卻無(wú)計(jì)可施。你所能做的,就是創(chuàng)建一個(gè)同為實(shí)現(xiàn)了Component接口的裝飾類。這個(gè)裝飾類的角色就由Decorator來(lái)扮演,在程序中通常表現(xiàn)為接口或抽象類。Decorator類的一個(gè)特性就是,它有一個(gè)接收Component對(duì)象的構(gòu)造方法。你將擬裝飾的對(duì)象傳遞給這個(gè)構(gòu)造方法。在本例中,這個(gè)對(duì)象就是從工廠獲得的 ConcreteComponent對(duì)象。通過(guò)將此裝飾對(duì)象傳遞給Decorator的一個(gè)類變量,你可以訪問(wèn)Decorator中的任何方法。這就使你得以改變對(duì)象的狀態(tài)了。

Decorator類不一定是接口或抽象類。如果你的程序不是很復(fù)雜,你可以將其轉(zhuǎn)化為一個(gè)具體的Decorator類。

舉個(gè)例子,考慮這樣一個(gè)簡(jiǎn)單的消息傳遞程序,其主要部分是Messenger接口及其實(shí)現(xiàn)類MessengerImpl。讓我們假設(shè) MessengerImpl對(duì)象來(lái)自于一個(gè)工廠,因此你不能改變其狀態(tài)。如果你準(zhǔn)備增加或改變Messenger對(duì)象的功能,你可以創(chuàng)建一個(gè) MessengerDecorator類。此例子的類圖。

Messenger裝飾類

我們來(lái)看程序的代碼。給出了Messenger接口的代碼,MessengerImpl類的代碼。

Messenger接口

 
 
 
 
  1. public interface Messenger {   
  2. public String getMessage()  

MessengerImpl類

 
 
 
 
  1. public class MessengerImpl   
  2. implements Messenger {  
  3. private String message  
  4. public MessengerImpl(String message) {  
  5. this.message = message  
  6. }  
  7. public String getMessage() {  
  8. return message  
  9. }  

Messenger對(duì)象由一個(gè)名為MessengerFactory的工廠創(chuàng)建。

MessengerFactory類

 
 
 
 
  1. public class MessengerFactory {  
  2. public static Messenger getMessenger()  
  3. {  
  4. return new MessengerImpl("secrets")  
  5. }  

對(duì)每一個(gè)所創(chuàng)建的Messenger對(duì)象,此工廠通過(guò)某個(gè)未知的操作,初始化了getMessage()方法所返回的字符串。換句話說(shuō),你不能自己創(chuàng)建Messenger對(duì)象。

在程序中,Messenger對(duì)象的主要用途是被傳遞給一個(gè)名為Util的類中的broadcast()靜態(tài)方法。

Util類

 
 
 
 
  1. public class Util {  
  2. public static void broadcast(Messenger messenger) {  
  3. System.out.print(messenger.getMessage());  
  4. }  
  5. // other methods here  

在你自己的類中,你可能會(huì)有這樣的代碼:

 
 
 
 
  1. Messenger messenger = MessengerFactory.getMessenger();  
  2. Util.broadcast(messenger); 

假設(shè)你希望對(duì)broadcast()方法所打印出的消息做一小改動(dòng)。你擬將其轉(zhuǎn)為大寫,怎么做?表面上看,你可以繼承Messenger,實(shí)例化其子類,并將返回的對(duì)象傳給Util.broadcast()。但是,這種做法毫無(wú)意義,因?yàn)橹挥泄S才知道如何初始化Messenger對(duì)象,并通過(guò)其 getMessage()方法返回正確的值。

使用裝飾模式,你可以創(chuàng)建一個(gè)MessengerDecorator類。

MessengerDecorator類

 
 
 
 
  1. public class MessengerDecorator implements Messenger {   
  2. private Messenger messenger;  
  3. public MessengerDecorator(Messenger messenger) {  
  4. this.messenger = messenger;  
  5. }  
  6. public String getMessage() {  
  7. return messenger.getMessage().toUpperCase();  
  8. }  

因?yàn)镸essengerDecorator實(shí)現(xiàn)了Messenger,Util.broadcast()將接受一個(gè)MessengerDecorator 的實(shí)例。然而,MessengerDecorator不僅僅是一個(gè)接口的實(shí)現(xiàn),它還是一個(gè)MessengerImpl對(duì)象的裝飾器。正因如此,MessengerDecorator就必須有一個(gè)接收擬被裝飾的Messenger對(duì)象的構(gòu)造方法。

這個(gè)構(gòu)造方法將參數(shù)傳給變量。你現(xiàn)在可以覆蓋MessengerDecorator中的getMessage()方法,以便將消息轉(zhuǎn)為大寫后再打印出來(lái)。因?yàn)槟愠钟性瓉?lái)Messenger對(duì)象的引用,你可以這樣寫getMessage()方法:

 
 
 
 
  1. public String getMessage() {  
  2. return this.messenger.getMessage().toUpperCase()  

MessengerDecorator中的getMessage()方法返回原始消息的大寫版本。

在你的類中,就像往常一樣,你得到一個(gè)Messenger對(duì)象,并將Decorator傳給Util.broadcast()。

Messenger messenger = factory.getMessenger();
Util.broadcast(new MessengerDecorator(messenger));

你并不將原始對(duì)象傳給原先的目標(biāo),相反,你將其傳給了該對(duì)象的裝飾器。

應(yīng)用裝飾模式于Servlet

以上Messenger類的例子與servlet容器所構(gòu)造的ServletRequest對(duì)象是一樣的。當(dāng)收到一個(gè)HTTP請(qǐng)求時(shí),servlet容器就會(huì)創(chuàng)建ServletRequest對(duì)象及ServletResponse對(duì)象(分別是ServletRequestImpl及ServletResponseImpl的實(shí)例),并將這兩個(gè)對(duì)象傳遞給特定的servlet服務(wù)方法?,F(xiàn)在,如果你為ServletRequest創(chuàng)建一個(gè)裝飾角色,并將其傳給servlet服務(wù)方法,你就應(yīng)用了裝飾模式。

對(duì)ServletRequest很容易應(yīng)用裝飾模式,因?yàn)閟ervlet API已經(jīng)為其提供了一個(gè)包裝類:ServletRequestWrapper。servlet裝飾模式的類圖。

Servlet API中的裝飾模式

別為過(guò)多的類搞暈了頭,只管注意虛線框中的三個(gè)類就行了:Http Servlet Request, Http Servlet RequestImpl, Http Servlet RequestWrapper。

Servlet API (HTTP)的裝飾模式

情況與前面所舉例子類似。你擁有一個(gè)ServletRequest的實(shí)現(xiàn),而它是由servlet容器產(chǎn)生的。你可以使用所提供的ServletRequestWrapper來(lái)裝飾這些ServletRequest對(duì)象。

這個(gè)模式很簡(jiǎn)單,在實(shí)際應(yīng)用中可以派上用場(chǎng)。實(shí)際上,一些很有名的應(yīng)用就使用了此模式。這些應(yīng)用包括:

Struts - Struts是當(dāng)前開(kāi)發(fā)Java Web應(yīng)用最受歡迎的基于MVC(模型-視圖-控制)模式的框架。Struts提供了相當(dāng)于ServletRequest 包裝類的org.apache.struts.upload.MultipartRequestWrapper類。 MultipartRequestWrapper覆蓋了getParameter(),getParameterNames(),及 getParameterValues()等方法來(lái)實(shí)現(xiàn)文件上傳。

Apache Beehive ?C 這個(gè)源于BEA的WebLogic專題小組的開(kāi)源項(xiàng)目,構(gòu)建于Struts之上,并簡(jiǎn)化了web應(yīng)用及web服務(wù)的開(kāi)發(fā)。與ServletRequest包裝類一樣,org.apache.beehive.netui.pageflow.internal包中的PageFlowRequestW


分享標(biāo)題:HttpServletRequest對(duì)象介紹
分享URL:http://www.dlmjj.cn/article/dpiepop.html