【正文】
今天,大部分 servlet容器都支持這個(gè)約定 ,即使 servlet規(guī)范中并沒有正式的定義。如果你以前曾經(jīng)使用過(guò) servlet,那么你可能習(xí)慣于用以/myApp/servlet開頭的 URI來(lái)調(diào)用 servlet。 將應(yīng)用程序請(qǐng)求映射到 servlet 使用控制器 servlet的第一個(gè)要求是所有請(qǐng)求必須都經(jīng)過(guò)該 servlet。 ? 在不修改代碼的情況下改變應(yīng)用程序頁(yè)面流的機(jī)制。 ? Servlet必須能夠區(qū)分請(qǐng)求,以便進(jìn)行不同類型的處理。在某些使用程序類的 幫助下, servlet 還可以提供諸如輸入驗(yàn)證、 J18N 準(zhǔn)備之類的服務(wù),而且通常會(huì)鼓勵(lì)使用更有效率的方法來(lái)請(qǐng)求處理。 使用 servlet集中處理請(qǐng)求 將 servlet 作為所有應(yīng)用程序請(qǐng)求的公共入口時(shí),可以獲得對(duì)應(yīng)用程序頁(yè)面流的整體控制。 將 servlet、監(jiān)聽器和過(guò)濾器混合起來(lái),就將 JSP頁(yè)面對(duì)復(fù)雜邏輯的需求降到了最低。 ? 用 Java代碼進(jìn)行請(qǐng)求處理效果最佳: servlet作為控制器正符合需要。 18 ? 數(shù)據(jù)庫(kù)訪問(wèn) bean 必須在應(yīng)用程序啟動(dòng)時(shí)可用于所有其他的部分:應(yīng)用程序生命周期時(shí)間監(jiān)聽器是用了該任務(wù)的完美的組件類型。 很明顯,這種應(yīng)用程序可以從使用 JSP頁(yè)面與組件類型的組合中受益,其中組件類型由 用于 MVC角色的 servlet規(guī)范所定義。由于應(yīng)用程序在不斷地發(fā)展變化,因此可能變得很難作為純 JSP應(yīng)用程序來(lái)維護(hù)。頁(yè)面的一般都是純粹的控制器和商務(wù)邏輯處理,它訪問(wèn)數(shù)據(jù)庫(kù)以對(duì)用戶進(jìn)行身份驗(yàn)證,而且多數(shù)頁(yè)面都需要訪問(wèn)控制。此類監(jiān)聽器實(shí)現(xiàn)了 接口,當(dāng)應(yīng)用程序啟動(dòng)和關(guān)閉時(shí)會(huì) 由容器調(diào)用該接口的方法 。可以在需要共享資源的 servlet 和 JSP 頁(yè)面中包含初始化共享資源的代碼,但是更標(biāo)準(zhǔn)的方法是在一個(gè)位置放置所有這些代碼,并在假設(shè)資源已經(jīng)初始化和可用的情況下,使應(yīng)用程序的其他部分可以正常工作。 使用監(jiān)聽器初始化共享資源 Bean 一般都有需要在使用 之前進(jìn)行初始化。接口定義的是事件相應(yīng)的方法。 新類型的監(jiān)聽器遵循的是標(biāo)準(zhǔn) Java 事件模型。隨著 Servlet 規(guī)范的 版本中新接口的引 入,可以為 servlet 環(huán)境和會(huì)話生命周 17 期事件以及激活和鈍化事件(容器用來(lái)暫時(shí)將會(huì)話狀態(tài)保存在磁盤上或?qū)?huì)話移植到另一個(gè)服務(wù)器上)創(chuàng)建監(jiān)聽器。 Servlet ,只能處理會(huì)話屬性綁定事件(在添加對(duì)象或從會(huì)話中刪除對(duì)象時(shí))。 過(guò)濾器可以應(yīng)用在特定 servlet上,或匹配某種 URL模式的所有請(qǐng)求上,例如以相同的路徑元素開頭或具有相同擴(kuò)展名的 URL。過(guò)濾器對(duì)請(qǐng)求與應(yīng)答的行為體和首部具有完全訪問(wèn)權(quán)限,因此還可以執(zhí)行各種轉(zhuǎn)換。 過(guò)濾器 過(guò)濾器是一種組件,可以解釋對(duì) servlet、 JSP頁(yè)面或靜態(tài)頁(yè)面的請(qǐng)求以及發(fā)送給客戶端之前的應(yīng)答。 使用過(guò)濾器和監(jiān)聽器 Servlet 規(guī)范 servlet 內(nèi)定義了兩種組件類型:過(guò)濾器和監(jiān)聽器。該接口定義了為應(yīng)答行為體獲取數(shù)序程序或流的方法。該接口定義的方法可提供對(duì)關(guān)于請(qǐng)求的許多信息的訪問(wèn)。在 Windows 平臺(tái)中,應(yīng)在 16 CLASSPATH中包含 JAR文件。該 JAR文件將隨所有的 Web容器一起發(fā)布。如果只在 init()和 destroy()方法中修改參考的對(duì)象,而且只在請(qǐng)求處理方法中讀取他們,那么不用喪失任何細(xì)節(jié)就可以滿足關(guān)于實(shí)例變量的這個(gè)要求。 容器只為每個(gè) Servlet 創(chuàng)建一個(gè)實(shí)例非常重要。 除了 doGet()和 doPost()方法之外,還有一些對(duì)應(yīng)于其他 HTTP方法的方法:doDelete()、 doHead()、 doOptiongs()、 doPut()和 doTrace()。它根據(jù)需要?jiǎng)?chuàng)建 servlet 類的實(shí)例、將請(qǐng)求傳遞給實(shí)例進(jìn)行處理,最終刪除實(shí)例。該類實(shí)現(xiàn)了 Servlet接口,并提供了使用 HTTP處理的附加方法。該接口定義了 Web容器用來(lái)管理 servlet和與之交互的方法。 API由兩個(gè)程序包組成: 包包含獨(dú)立于協(xié)議的類和接口,而 程序包則提供 HTTP 特定的擴(kuò)展的實(shí)用程序類。 15 Servlet、過(guò)濾器和監(jiān)聽器 Servlet 是一種 Java 類,它使得服務(wù)器的功能可擴(kuò)展至處理請(qǐng)求和生成應(yīng)答。 Java servlet提供了一種強(qiáng)有力的 API,用這個(gè) API可以訪問(wèn)關(guān)于請(qǐng)求、會(huì)話和應(yīng)用程序的所有信息。其實(shí)這就是所謂的“第一人懲罰”。 以后再有客戶訪問(wèn)這個(gè)頁(yè)面的時(shí)候,只要該文件沒有發(fā)生過(guò)更改, JSP 引擎就直接調(diào)用已經(jīng)裝載的 Servlet。當(dāng)我們?cè)L問(wèn)一個(gè)JSP頁(yè)面的時(shí)候,這個(gè)文件首先會(huì)被 JSP引擎翻譯為一個(gè) Java源文件,其實(shí)就是一個(gè)Servlet,并進(jìn)行編譯,然后像其他 Servlet一樣,由 Servlet引擎來(lái)處理。 JSP 文件看起來(lái)就像一個(gè)普通靜態(tài) HTML 文件,只不過(guò)里面包含了一些 Java 代碼。使用 JSP 比用 Servlet 更簡(jiǎn)單。它可以讓常規(guī)靜態(tài) HTML 與動(dòng)態(tài)產(chǎn)生的內(nèi)容相結(jié)合,看起來(lái)像一個(gè) HTML 網(wǎng)頁(yè),卻作為Servlet來(lái)運(yùn)行。而且, Servlet使用線程,因而可以開發(fā)出效率更高的 Web應(yīng)用。與一般類的不同之處是,這個(gè)類運(yùn)行在一個(gè) Servlet容器內(nèi),可以提供 session管理和對(duì)象生命周期管理。 Servlet處理請(qǐng)求的過(guò)程是這樣的:當(dāng)收到來(lái)自客戶端的請(qǐng)求后,調(diào)用 service 方法,該方法中 Servlet先判斷到來(lái)的請(qǐng) 求是什么類型的( GET/POST/HEAD?),然后調(diào)用相應(yīng)的處理方法( doGet/doPost/doHead?)并生成響應(yīng)。與 CGI 不同的是, Servlet 沒有生成新的進(jìn)程,而是與 HTTP Server 處于同一進(jìn)程中。 與 CGI相似, Servlet支持請(qǐng)求 /響應(yīng)模型。雖然 CGI技術(shù)發(fā)展成熟且功能強(qiáng)大,但由于編程困難、效率低下、修改復(fù)雜等缺點(diǎn),所以有逐漸被取代的趨勢(shì)。這就是隨意開發(fā)的弊端。比方說(shuō),在 HTML 文檔中如果嵌入過(guò)多的 Java 代碼( scriptlet),就會(huì)導(dǎo)致開發(fā)出來(lái)的應(yīng)用非常復(fù)雜、難以閱讀、不容易復(fù)用,而且對(duì)以后的維護(hù)和修改也會(huì)造成困難。 Java 開發(fā)者喜歡使用它有多種原因,其一是對(duì)于已經(jīng)熟悉 Java 語(yǔ)言的開發(fā)者來(lái)說(shuō)這個(gè)技術(shù)容易學(xué)習(xí);其二是 Java 把“一次編寫,到處運(yùn)行”的理念帶入到 Web應(yīng)用中,實(shí)現(xiàn)了“一次編寫,到處實(shí)現(xiàn)”。re probably used to invoking a servlet with a URI that starts with 12 /myApp/servlet. This is a convention introduced by Suns Java Web Server (JWS), the first product to support servlets before the API was standardized. Most servlet containers support this convention today, even though it39。s easy to fet to include the access control code in new pages. 10 This is clearly an application that can benefit from using a bination of JSP pages and the ponent types defined by the servlet specification for the MVC roles. Let39。re out of luck. Filters A filter is a ponent that can intercept a request targeted for a servlet, JSP page, or static page, as well as the response before it39。t yet support this version of the specification, I39。s important to realize that the container creates only one instance of each servlet. This means that the servlet must be thread safe able to handle multiple requests at the same time, each executing as a separate thread through the servlet code. Without getting lost in details, you satisfy this requirement with regards to instance variables if you modify the referenced objects only in the init( ) and destroy( ) methods, and just read them in the request processing methods. Compiling and Installing a Servlet To pile a servlet, you must first ensure that you have the JAR file containing all Servlet API classes in the CLASSPATH environment variable. The JAR file is distributed with all web containers