<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-57  評論-117  文章-1  trackbacks-0

    Servlet 是一種比JSP 更早的動態網頁編程技術。在沒有JSP 之前, Servlet 也是同時充當視圖層、業務邏輯層及持久層角色。

    Servlet 的開發效率非常低,特別是當使用Servlet 生成表現層頁面時,頁面中所有的HTML 標簽,都需采用Servlet 的輸出流來輸出,因此極其煩瑣。由于Servlet 是個標準的Java 類,因此必須由程序員開發,其修改難度大,美工人員根本無法參與Servlet 頁面的開發。這一系列的問題,都阻礙了Servlet 作為表現層的使用。

    自MVC 規范出現后, Servlet 的責任開始明確下來,僅僅作為控制器使用,不再需要生成頁面標簽,也不再作為視圖層角色使用。

     

    Servlet ,通常稱為服務器端小程序,是運行在服務器端的程序,用于處理及響應客戶端請求。

    Servlet 是個特殊的Java 類,這個Java 類必須繼承HttpServlet 。每個Servlet 可以響應戶端的請求。Servlet 提供不同的方法用于響應客戶端請求。

    doGet: 用于響應客戶端的get 請求。

    doPost: 用于響應客戶端的post 請求。

    doPut: 用于響應客戶端的put 請求。

    doDelete: 用于響應客戶端的delete 請求。

    事實上,客戶端的請求通常只有get 和post 兩種; Servlet 為了響應這兩種請求,必須重寫doGet 和doPost 兩個方法。如果Servlet 為了響應四個方法,則需要同時重寫上面的四個方法。

     

    大部分時候, Servlet 對于所有請求的響應都是完全一樣的。此時,可以采用重寫一個方法來代替上面的幾個方法, Servlet 只需重寫service 方法即可響應客戶端的所有請求。另外, HttpServlet 還包含兩個方法。

    init(ServletConfig config): 創建Servlet 實例時,調用的初始化方法。

    destroy: 銷毀Servlet 實例時,自動調用的資源回收方法。

    通常無須重寫init和destroy兩個方法,除非需要在初始化Servlet 時,完成某些資源初始化的方法,才考慮重寫init 方法。如果需要在銷毀Servlet 之前,先完成某些資源的回收,比如關閉數據庫連接等,才需要重寫destroy 方法。

    注意:如果重寫了init(ServletConfig config)方法,則應在重寫該方法的第一行調用super.init(config) 。該方法將調用HttpServlet 的init 方法。

     

    Servlet 和JSP 的區別在于:

    Servlet 中沒有內置對象,原來JSP 中的內置對象都必須通過HttpServletRequest對象,或由HttpServletResponse 對象生成:

    對于靜態的HTML 標簽, Servlet 都必須使用頁面輸出流逐行輸出。

    這也正是筆者在前面介紹的: JSP 是Servlet 的一種簡化,使用JSP 只需要完成程序員需要輸出到客戶端的內容,至于JSP 中的Java 腳本如何鑲嵌到一個類中,由JSP 容器完成。而Servlet 則是個完整的Java 類,這個類的service 方法用于生成對客戶端的響應。

     

    Servlet 的配置

    編輯好的Servlet 源文件并不能響應用戶請求,還必須將其編譯成class 文件。將編譯后的HelloServlet. class 文件放在WEB-INF/classes 路徑下,如果Servlet 有包,則還應該將class 文件放在對應的包路徑下。

    為了讓Servlet 能響應用戶請求,還必須將Servlet 配置在Web 應用中。配置Servlet時,需要修改web.xrnl 文件。

    配置Servlet 需要配置兩個部分。<servlet>/<servlet-mapping>

     

    Servlet的生命周期

    Servlet 在容器中運行,其實例的創建及銷毀等都不是由程序員決定的,而是由容器進行控制。

    Servlet 的創建有兩個選擇。

    客戶端請求對應的Servlet 時,創建Servlet 實例:大部分的Servlet 都是這種Servlet。 Web 應用啟動時,立即創建Servlet 實例:即load-on-startup Servlet。

    每個Servlet 的運行都遵循如下生命周期。

    (1)創建Servlet 實例。

    (2) Web 容器調用Servlet 的init 方法,對Servlet 進行初始化。

    (3) Servlet 初始化后,將一直存在于容器中,用于響應客戶端請求。如果客戶端有get 請求,容器調用Servlet 的doGet 方法處理并響應請求。對于不同的請求,有不同的處理方法,或者統一使用service 方法處理來響應用戶請求。

    (4) Web 容器角色銷毀Servlet 時,調用Servlet 的destroy 方法,通常在關閉Web容器之時銷毀Servlet。

     

    使用Servlet創作為控制器

    正如前面見到,使用Servlet 作為表現層的工作量太大,所有的HTML 標簽都需要使用頁面輸出流生成。因此,使用Servlet 作為表現層有如下三個劣勢。

    開發效率低,所有的HTML 標簽都需使用頁面輸出流完成。

    不利于團隊協作開發,美工人員無法參與Servlet 界面的開發。

    程序可維護性差,即使修改一個按鈕的標題,都必須重新編輯Java 代碼,并重新編譯。

     

    整個結構非常清晰,下面是MVC 中各個角色的對應組件。

    M: Model,即模型,對應JavaBean 。

    V: View ,即視圖,對應JSP 頁面。

    C: Controller,即控制器,對應Servlet。

     

    load-on-startup Servlet

    Servlet 的實例化有兩個時機:用戶請求之時,或應用啟動之時。應用啟動時就啟動的Servlet 通常是用于某些后臺服務的Servlet ,或者攔截很多請求的Servlet; 這種Servlet 通常作為應用的基礎Servlet 使用,提供重要的后臺服務。如果需要Web 應用啟動時,可使用load-on-startup 元素完成Servlet 的初始化。load-on-startup 元素只接收一個整型值,這個整型值越小, Servlet 就越優先初始化。

    訪問Servlet 的配置參數

    配置Servlet 時,還可以增加附加的配置參數。通過使用配置參數,可以實現更好地解耦,避免將所有的參數以硬編碼方式寫在程序中。

    訪問Servlet 配置參數要通過ServletConfig 類的實例完成, ServletConfig提供如下方法。

    java.lang.String getInitParameter(java.lang.String name): 用于獲取初始化參數。

    注意: JSP 的內直對象config 就是此處的ServletConfig

    自定義標簽類

    使用標簽類,可以使用簡單的標簽來封裝復雜的功能,從而使團隊更好地協作開發(能讓美工人員更好地參與JSP 頁面的開發)。

    自定義標簽類都必須繼承一個父類: java.Servlet.jsp.tagext.TagSupport 。除此之外,自定義標簽類還有如下要求。

    ·如果標簽類包含屬性,每個屬性都有對應的getter 和setter 方法。

    ·重寫doStartTag或doEndTag方法,這兩個方法生成頁面內容。

    ·如果需要在銷毀標簽之前完成資源回收,則重寫re1ease方法。

    TLD 文件

    TLD 是Tag Library Definition 的縮寫,即標簽庫定義,文件的后綴是tld ,每個TLD文件對應一個標簽庫,一個標簽庫中可包含多個標簽。TLD 文件也稱為標簽庫定義文件。標簽庫定義文件的根元素是taglib,它可以有多個tag 子元素,每個tag 子元素都對應一個標簽。

    編輯了標簽庫定義文件還不夠, Web 容器還無法加載標簽庫定義文件。還必須在web.xml 文件中增加標簽庫的定義。在web.xml 文件中定義標簽庫時使用taglib 元素,該元素包含兩個子元素: taglib-uri和taglib-location,前者確定標簽庫的URI; 后者確定標簽庫定義文件的位置。

    使用標簽庫

    使用標簽庫分成以下兩步。

    (1) 導入標簽庫:使用taglib 編譯指令導入標簽。

    (2) 使用標簽:在JSP 頁面中使用自定義標簽。

    taglib 的語法格式如下:

    〈%@ taglib uri="tagliburi" prefix="tagPrefix" %〉

    其中uri 屬性確定標簽庫定義文件的URI,這個URI 就是在web.xml 文件中為標簽

    庫定義的URI。而prefix 屬性確定的是標簽前綴,即在JSP 頁面中使用標簽時,該標簽

    庫負責處理的標簽前綴。

    使用標簽的語法格式如下:

    <tagPrefix : tagName tagAttribute=ntagValue n ...>

    <tagBody/>

    </tagPrefix>

    如果該標簽沒有標簽體,則可以使用如下語法格式:

    <tagPrefix : tagName tagAttribute=ntagValue n …/>

    帶標簽體的標簽

    帶標簽體的標簽,就是允許在標簽內嵌套標簽,通常可用于完成一些邏輯運算例如判斷和循環等。

    帶標簽體的標簽需要繼承BodyTagSupport,該類包含一個bodyContent 屬性,該屬性代表標簽體。

    BodyTagSupport 還包含兩個方法。

    doAfterBody: 每次處理完標簽體后調用該方法。

    void doInitBody: 開始調用標簽體時調用該方法。

    如果有必要,可以重寫這兩個方法。

    在處理標簽類的各個方法中,不同的返回值對應不同的含義,常用的返回值有如下幾個。

    SKIP_BODY: 不處理標簽體,直接調用doEndTag方法。

    SKIP_PAGE: 忽略標簽后面的JSP 頁面。

    EVAL_PAGE: 處理標簽結束,直接處理頁面內容。

    EVAL_BODY_BUFFERED: 處理標簽體。

    EVAL_BODY_INCLUDE: 處理標簽體,但忽略setBodyContent和doInitBody方法。

    EVAL_BODY_AGAIN: 對標簽體循環處理。

     

    Filter

    Filter 并不是一個標準的Servlet ,它不能處理用戶請求,也不能對客戶端生成響應。主要用于對HttpServletRequest 進行預處理,也可以對HttpServletResponse 進行后處理,是個典型的處理鏈。

    Filter 有如下幾個用處。

    ·在HttpServletRequest 到達Servlet 之前,攔截客戶的HttpServletRequest 。

    ·根據需要檢查HttpServletRequest ,也可以修改HttpServletRequest 頭和數據。

    ·在HttpServletResponse 到達客戶端之前,攔截HttpServletResponse 。

    ·根據需要檢查HttpServletResponse ,也可以修改HttpServletResponse 頭和數據。

    Filter 有如下幾個種類。

    ·用戶授權的Filter: Filter 負責檢查用戶請求,根據請求過濾用戶非法請求。

    ·日志Filter: 詳細記錄某些特殊的用戶請求。

    ·負責解碼的Filter: 包括對非標準編碼的請求解碼。

    .能改變XML 內容的XSLTFilter 等。

    一個Filter 可負責攔截多個請求或響應:一個請求或響應也可被多個請求攔截。

    創建一個Filter 只需兩個步驟:

    (1)創建Filter 處理類:

    (2) 在web.xml 文件中配置Filter。

    創建Filter 類

    創建Filter 必須實現javax.servle t. Filter 接口,在該接口中定義了三個方法。

    void init(FilterConfig config): 用于完成Filter 的初始化。

    void destroy: 用于Filter 銷毀前,完成某些資源的回收。

    void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 實現過濾功能,該方法就是對每個請求及響應增加的額外處理。

    執行chain.doFilter(request,reponse)方法,當Filter 對請求過濾后,依然將請求發送到目的地址。如果檢查權限,可以在Filter 中根據用戶請求的HttpSession,判斷用戶權限是否足夠。

    如果權限不夠,則調用重定向即可,無須調用chain.doFilter(request,reponse)方法。

    配置Filter

    Filter 的配置和Servlet 的配置非常相似,都需要配置兩個部分:

    ·配置Filter 名。

    ·配置Filter 攔截URL 模式。

    區別在于, Servlet 通常只配置一個URL ,而Filter 可以同時攔截多個請求的URL。

    因此,可以配置多個Filter 攔截模式。

     

    Listener

    Listener 的作用非常類似于load-on-startup Servlet。用于在Web 應用啟動時,啟動某些后臺程序,這些后臺程序負責為系統運行提供支持。

    Listener 與load-on-startup Servlet 的區別在于: Listener 的啟動時機比load-on-startup Servlet 早,只是Listener 是Servlet 2.3 規范之后才出現的。

    使用Listener 只需要兩個步驟:

    (1) 創建Listener 實現類。

    (2) 在web.xml 文件中配置Listener。

    創建Listener 類

    創建Li stener 類必須實現ServletContex tListener 接口,該接口包含兩個方法。

    eontextInitialized(ServletContextEvent see): 啟動Web 應用時,系統調用該Filter的方法。

    eontextDestroyed(ServletContextEvent see): 關閉Web 應用時候,系統調用Filter

    的方法。

    配置Listener

    正如load-an-startup Servlet 一樣, Listener 用于啟動Web 應用的后臺服務程序,但不負責處理及響應用戶請求,因此無須配置URL。

    若將Listener 配置在Web 容器中(如果Web 容器支持Listener),則Listener 將隨Web 應用的啟動而啟動。

    配置Listener 時使用<listener/>元素,下面是配置Listener 的片段:

    <!-- 配置Listener-->

    <listener>

    <!- 指定Listener 的實現類→

    <listener-class>lee.ScheduleListener</listener-class>

    </listener>

    在上面的配置中,既無須配置Listener 的名字,也無須配置Listener 的URL 只需配置它的實現類即可。此時容器將自動檢測部署在容器中的Listener,并在應用啟動時,自動加載所有的Listener。



    作者:hoojo
    出處:
    blog:http://blog.csdn.net/IBM_hoojo
             http://hoojo.cnblogs.com
    本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


    版權所有,轉載請注明出處 本文出自:
    分享道版權所有,歡迎轉載,轉載請注明出處,謝謝
    posted on 2012-01-29 15:50 hoojo 閱讀(2199) 評論(5)  編輯  收藏 所屬分類: JavaEEJsp/Servlet

    評論:
    # re: Servlet 手記[未登錄] 2012-01-30 10:56 | tbw
    不錯 一直關注   回復  更多評論
      
    # re: Servlet 手記 2012-02-01 15:19 | 日出星辰
    差距!使用Java快2年了,servlet&jsp是每個java開發人員必須會的,但樓主能把這么簡單的東西總結的這么詳細、明白,自嘆不如!
    越簡單的東西越重要啊!向樓主學習!  回復  更多評論
      
    # re: Servlet 手記 2012-02-01 16:22 | hoojo
    @日出星辰
    也是看書、加上之前開發總結的一下基礎性的東西,謝謝支持~  回復  更多評論
      
    # re: Servlet 手記 2012-02-03 23:39 | allenny
    Servlce和JSP的區別總結的一塌糊涂  回復  更多評論
      
    # re: Servlet 手記 2012-02-11 13:35 | hoojo
    @allenny
    怎么講~也只是籠統的概括下  回復  更多評論
      
    主站蜘蛛池模板: 拍拍拍无挡免费视频网站| 黄网站在线播放视频免费观看| 一级特黄录像免费播放肥| 国产jizzjizz免费视频| 亚洲精品无码久久久久牙蜜区| 久久久久久国产精品免费免费| 色偷偷女男人的天堂亚洲网| 青青在线久青草免费观看| 亚洲一本之道高清乱码| 黄在线观看www免费看| 美女视频黄免费亚洲| 免费无码又爽又刺激高潮的视频| 亚洲国产精品成人AV在线| 亚洲Aⅴ无码一区二区二三区软件| 人禽伦免费交视频播放| 亚洲精品无码久久久久sm| 污视频在线免费观看| 亚洲另类春色校园小说| 色妞WWW精品免费视频| 国产精品亚洲二区在线| 国产亚洲老熟女视频| 91老湿机福利免费体验| 亚洲日本va一区二区三区| 亚洲男人的天堂在线va拉文| 成全高清在线观看免费| 亚洲欧洲精品视频在线观看| 在线综合亚洲欧洲综合网站| 亚洲AⅤ永久无码精品AA| 精品国产污污免费网站| 亚洲首页国产精品丝袜| 亚洲国产综合精品一区在线播放| 国产真人无码作爱免费视频| 亚洲精品韩国美女在线| 成年女人永久免费观看片| 在线观看人成视频免费无遮挡| 亚洲视频一区网站| 国产在线观看免费视频播放器| 国产一级a毛一级a看免费人娇| 亚洲精品不卡视频| 全亚洲最新黄色特级网站| 久久大香伊焦在人线免费|