【正文】
objects only in the init( ) and destroy( ) methods, and just read them in the request processing methods. 6 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. Tomcat includes it in a file called , located in the mon/lib directory. On a Windows platform, you include the JAR file in the CLASSPATH. . Reading a Request One of the arguments passed to the doGet( ) and doPost( ) methods is an object that implements the HttpServletRequest interface. This interface defines methods that provide access to a wealth of information about the request. Generating a Response Besides the request object, the container passes an object that implements the HttpServletResponse interface as an argument to the doGet( ) and doPost( ) methods. This interface defines methods for getting a writer or stream for the response body. It also defines methods for setting the response status code and headers. Using Filters and Listeners The servlet specification defines two ponent types beside servlets: filters and listeners. These two types were introduced in the Servlet specification, so if you39。re 7 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。re probably used to invoking a servlet with a URI that starts with /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。比方說,在 HTML 文檔中如果嵌入過多的 Java 代碼( scriptlet),就會導(dǎo)致開發(fā)出來的應(yīng)用非常復(fù)雜、難以閱讀、不容易復(fù)用,而且對以后的維護和修改也會造成困難。雖然 CGI技術(shù)發(fā)展成熟且功能強大,但由于編程困難、效率 低下、修改復(fù)雜等缺點,所以有逐漸被取代的趨勢。與 CGI 不同的是, Servlet 沒有生成新的進程,而是與 HTTP Server 處于同一進程中。與一般類的不同之處是,這個類運行在一個 Servlet容器內(nèi),可以提供 session管理和對象生命周期管理。它可以讓常規(guī)靜態(tài) HTML 與動態(tài)產(chǎn)生的內(nèi)容相結(jié)合,看起來像一個 HTML 網(wǎng)頁,卻作為Servlet來運行。 JSP 文件看起來就像一個普通靜態(tài) HTML 文件,只不過里面包含了一些 Java 代碼。如果已經(jīng)做過修改的話,那就會再次執(zhí)行以上過程,翻譯、編譯并裝載。將 servlet 和 JSP 頁面組合起來使用,可以把應(yīng)用程序的邏輯部分和外觀呈現(xiàn)部分清楚地分開;換句話,利用這個方式可以對模型、視圖和控制器這三種角色分別使用最合適的組件類型 。 Servlet的實質(zhì)是實現(xiàn)了接口 ,實現(xiàn)是直接完成或通過擴展某個支持類來完成的。 Servlet的生命周期 Web 容器管理 servlet 生命周期的所有方面。一般情況下不用實現(xiàn)這些方法,因為 HttpServlet 類已經(jīng)用適用于大多 數(shù) servlet 的方法考慮到了 HEAD、 OPTIONS和 TRACE請求,而且 DELETE和 PUT這兩種 HTTP方法很少用在 Web應(yīng)用程序中。 編譯和安裝 servlet 要編譯 servlet,必須首先確保 JAR 文件包含著 CLASSPATH 環(huán)境變量中所有Servlet API類。 讀取請求 傳遞到 doGet()和 doPost()方法的參數(shù)之一是實現(xiàn)了 HttpServletRequest接口的對象。它還定義了設(shè)置應(yīng)答狀態(tài)代碼和首部的方法。這樣可以很容易地將應(yīng)用于所有請求的任務(wù)集中在一起,例如訪問控制、登錄和內(nèi)容的開銷或應(yīng)用提供的服務(wù)等。 監(jiān)聽器 監(jiān)聽器允許應(yīng)用程序?qū)μ囟ㄊ录龀龌貞?yīng)。使用新的會話屬性事件監(jiān)聽器還可以在一個位置上處理所有會話的屬性綁定事件,而不是在每個會話中防止單獨的監(jiān)聽器對象。當(dāng)應(yīng)用程序啟動是,容易會注冊監(jiān)聽器類,然后該容器會在合適的事件調(diào)用那些事件方法 。應(yīng)用程序生命周期監(jiān)聽器是此類資源初始化的絕好工具。在現(xiàn)實生活中,它可能會包含更多的頁面,例如, 用于訪問共享文檔檔案、事件表的頁面和用于管理的一組頁面等。下面看一下主要的要求,并了解如何將他們映射到適當(dāng)?shù)慕M件類型上: ? 數(shù)據(jù)庫訪問應(yīng)該是抽象的,從而避免料接應(yīng)用程序中多個部分的特定數(shù)據(jù)模式或數(shù)據(jù)庫引擎:模型角色中的 bean可以用來完成這種認(rèn)知。 ? 必須很容易改編外觀呈現(xiàn):這正是 JSP的反光點,也就是作為視圖。 Servlet可以根據(jù)所請求行為的結(jié)果來決定要生成的應(yīng)答類型,例如,為所有失敗的請求返回公共的錯誤頁面,或者根據(jù)發(fā)出請求的客戶端返回不同的應(yīng)答等。 下面是其他一些你可能希望支持的功能,即使并非所有應(yīng)用程序都要求: ? 擴展應(yīng)用程序以便以更靈活的方式支持新類型的請求處理。該要求可以通過多種方式來滿足。 。這是由 Sun公司的 Java Web Server( JWS)所引入的一個約定, JWS 是在推出標(biāo)準(zhǔn) API 之前第一個支持 servlet 的產(chǎn)品。 當(dāng)然,你可以自己開發(fā)滿足這些要求的 servlet,但是已經(jīng)有開源式 servlet了,他們可以滿足所有這些要求,甚至還有更多的功能。 當(dāng)使用 servlet作為控制器時,必須處理下列基本要求: ? 所有處理請求必須傳遞到單獨的控制器 servlet中。將這些代碼放置到 Java類中后,就可以使用普通的 Java編譯程序和調(diào)試程序來修復(fù)潛在的問題。 ? 只有通過驗證的用戶才允許使用應(yīng)用程序:過濾器可以完成訪問控制以滿足該要求。例如,很容易忘記在新頁面中包含訪問控制代碼。 為每個任務(wù)選擇正確的組件類型 在之前介紹的項目公告牌應(yīng)用程序是相當(dāng)復(fù)雜的應(yīng)用程序。例如,它們可能需要對數(shù)據(jù)庫或某些其他外部數(shù)據(jù)源的引用,還可能在內(nèi)存中創(chuàng)建一個初始消息緩存,以便即使是第一個請求數(shù)據(jù)也可以提供更快的訪問。換句話說,監(jiān)聽器是實現(xiàn)了一個或多個監(jiān)聽器接口的類。實現(xiàn)監(jiān)聽器的方式是用保存為會話屬性(使用 ()方法)的對象實現(xiàn) HttpSessionBindingListener 接口。例如,如果 AcceptLanguage請求沈陽航空 航天大學(xué) 北方科技學(xué)院畢業(yè)設(shè)計 (外文翻譯 ) 16 首部指出客戶端可以處理壓縮的應(yīng)答,那么過濾器就可以壓縮應(yīng)答的行為體。這兩種類型是在Servlet ,因此,如果你使用的是不支持該版本規(guī)范的容器,恐怕就不能繼續(xù)學(xué)習(xí)了 。 生成應(yīng)答 除應(yīng)答對象之外,容器 還將實現(xiàn) HttpServletRequest接口的對象作為 icanshu傳遞給 doGet()和 doPost()方法。 Tomcat中包含了一個名為 的 JAR 文件,位于 mon/lib 目錄中。這意味著 servlet 必須是線程安全的 — 即,能夠同時處理多個請求,每個處理都通過 servlet 代碼作為單獨的線程來執(zhí)行。對于 HttpServlet來說,容器會在 servlet生命周期的適當(dāng)時間調(diào)用方法。用于處理 HTTP 請求的 servlet 一般情況下都會擴展 類。它是用 Servlet API定義的類和接口實現(xiàn)的。因為首次訪問的時候要執(zhí)行一 系列以上的過程,所以會耗費一些時間;以后的訪問就不會這樣了。當(dāng)我們訪問一個JSP頁面的時候,這個文件首