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

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

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

    Sealyu

    --- 博客已遷移至: http://www.sealyu.com/blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評(píng)論 :: 0 Trackbacks
    Java servlets 是一項(xiàng)被普遍接受的技術(shù),用于構(gòu)建基于 web 應(yīng)用程序的動(dòng)態(tài)內(nèi)容;Servlet 3.0 規(guī)范早期草案版本的發(fā)行讓該技術(shù)在特性和應(yīng)用程序接口(Application Program Interface,API)方面得到了極大增強(qiáng)。Java Specification Request(JSR)已經(jīng)以 JSR 315 的形式得到了批準(zhǔn),并計(jì)劃成為 Java Enterprise Edition 6(JSR 316)或更高版本的組成部分。與之前僅僅是維護(hù)發(fā)行版(maintenance releases)的一些版本規(guī)范不同,Servlet 3.0 規(guī)范隨帶了許多 web 開發(fā)新時(shí)代所需的最令人興奮的特性。在本文中,我們將研究新版 Java servlets 中引入的主要特性。值得注意的是,本規(guī)范仍處于草案版本階段,因此在本文中所討論的技術(shù)細(xì)節(jié)可能會(huì)發(fā)生變化。

      新規(guī)范主要交付了以下新特性:

      開發(fā)的簡(jiǎn)易性
    可插拔性和可擴(kuò)展性
    異步支持
    安全性增強(qiáng)
    其他雜項(xiàng)變化

      很明顯,與其他技術(shù)相比,servlets 在 Java Enterprise Edition 家族中有著更廣泛的應(yīng)用。Servlets 保留了其簡(jiǎn)潔性和能夠處理 HTTP 請(qǐng)求并向 web 客戶機(jī)傳回響應(yīng)的優(yōu)點(diǎn)。Servlets 可以用于實(shí)現(xiàn)簡(jiǎn)單和小型應(yīng)用程序的業(yè)務(wù)邏輯。在 web 框架中,servlets 作為所有傳入請(qǐng)求的入口點(diǎn)(即 controller servlet);因此,所有流行框架都是在原始的 servlets 上建立的。Servlet 3.0 中的新增特性旨簡(jiǎn)化 servlet 應(yīng)用程序的開發(fā),并讓 servlet 開發(fā)人員和框架開發(fā)人員從中受益。在以下章節(jié)中,我們將詳細(xì)介紹每個(gè)新增特性,并討論如何使用它們來開發(fā)更優(yōu)秀的應(yīng)用程序。

      開發(fā)的簡(jiǎn)易性

      開發(fā)的簡(jiǎn)易性是任何技術(shù)成功的關(guān)鍵因素。Servlet 3.0 API 通過使用 JSR 175 注釋 集中解決開發(fā)簡(jiǎn)易性問題,允許開發(fā)人員采用聲明式的編程方式。這意味著您可以通過使用像 @Servlet 或者 @ServletFilter 這樣的適當(dāng)注釋對(duì)類進(jìn)行注釋來快速開發(fā)一個(gè) servlet 或者過濾器類。注釋不僅使 servlet、過濾器和偵聽器類的編碼更容易,而且,即使應(yīng)用程序存檔可能有 servlet、過濾器或者上下文偵聽器類也可以選擇用于 web 應(yīng)用程序的開發(fā)部署描述符。Web 容器負(fù)責(zé)處理各種注釋,其位置在 WEB-INF/classes 目錄下的各個(gè)類中、WEB-INF/lib 目錄下的 .jar 文件中、或者應(yīng)用程序類路徑中任何可以找到的類中。

      注釋與部署描述符

      值得注意的是,部署描述符優(yōu)先于注釋。換句話說,部署描述符覆蓋通過注釋機(jī)制所規(guī)定的配置信 息。Web 部署描述符的 3.0 版本在 web-app 元素上包含一種名為 metadata-complete 的新屬性。該屬性定義了 web 描述符是否完整,或者 web 應(yīng)用程序的類文件是否針對(duì)指定部署信息的注釋而進(jìn)行檢查。如果該屬性被設(shè)置為 true,則部署工具必須忽略類文件中所存在的任何 servlet 注釋,并只使用描述符中所提及的配置細(xì)節(jié)。否則,如果沒有指定該值或者該值被設(shè)置為 false,容器必須針對(duì)注釋而掃描應(yīng)用程序的所有類文件。這個(gè)屬性提供了在應(yīng)用程序啟動(dòng)階段啟用或者禁用注釋掃描以及對(duì)注釋的處理。

      在 Servlet 3.0 中所引入的所有注釋都可以在 javax.servlet.http.annotation 和 javax.servlet.http.annotation.jaxrs 軟件包中找到。以下章節(jié)闡述 Servlet 3.0 中注釋的完整集合:

      @Servlet:javax.servlet.http.annotation.Servlet 是一個(gè)類級(jí)別的注釋,確認(rèn)經(jīng)過注釋的類為一個(gè) servlet 并保存關(guān)于所聲明的 servlet 的元數(shù)據(jù)。urlMappings 屬性是指定 URL 模式(調(diào)用該 servlet)的 @Servlet 的強(qiáng)制屬性。當(dāng)接收到了一個(gè)請(qǐng)求時(shí),容器將請(qǐng)求中的 URL 與 servlet 的 urlMappings 進(jìn)行匹配,且如果 URL 模式匹配,則調(diào)用相應(yīng)的 servlet 以響應(yīng)該項(xiàng)請(qǐng)求。該注釋的所有其他屬性都是可選的,并帶有合理的默認(rèn)值。Servlet 類中必須有一種使用像 GET、PUT、POST、HEAD 或者 DELETE 這樣的 HttpMethod 注釋進(jìn)行注釋的方法。這些方法應(yīng)將 HttpServletRequest 和 HttpServletResponse 作為方法參數(shù)。與以前的版本相反,servlets 3.0 的版本可以作為簡(jiǎn)單傳統(tǒng) Java 對(duì)象(Plain Old Java Objects,POJOs)而實(shí)現(xiàn);也就是 servlets 不必再擴(kuò)展像 HTTPServlet 或者 GenericServlet 這樣的基礎(chǔ) servlet 實(shí)現(xiàn)類。

      為了進(jìn)行比較,在此給出了使用傳統(tǒng) Servlet 2.5 API 編寫的 Java servlet 代碼片段,如下所示。在 Servlet 2.5 中,只要在部署描述符中配置了 servlet 的詳細(xì)信息,web 容器就將初始化 servlet。

    1. public class MyServlet extends HttpServlet {  
    2. public void doGet (HttpServletRequest req,   
    3. HttpServletResponse res) {  
    4. ....  
    5. }  
    6. }   

      Deployment descriptor (web.xml)

    1. <web-app>  
    2. <servlet>  
    3. <servlet-name>MyServlet</servlet-name>  
    4. <servlet-class>samples.MyServlet</servlet-class>  
    5. </servlet>  
    6.   
    7. <servlet-mapping>  
    8. <servlet-name>MyServlet</servlet-name>  
    9. <url-pattern>/MyApp</url-pattern>  
    10. </servlet-mapping>  
    11. ...  
    12.   
    13. </web-app>  

          這里給出的是使用 Servlet 3.0 API 編寫的較為簡(jiǎn)化的版本。當(dāng) MyServlet 使用 @Servlet 注釋而被注釋為一個(gè) servlet 時(shí),則在 web 容器的啟動(dòng)期間對(duì)其初始化。注意,在這種情況下部署描述符是可選的。

    1. @Servlet(urlMappings={"/MyApp"})  
    2. public class MyServlet {  
    3. @GET  
    4. public void handleGet(HttpServletRequest req,   
    5. HttpServletResponse res) {  
    6. ....  
    7. }  
    8. }  

         Deployment descriptor (web.xml)

         optional

      @ServletFilter 和 @FilterMapping:您可以使用 javax.servlet.http.annotation.ServletFilter 注釋來注釋過濾器類,從而輕松創(chuàng)建一個(gè) servlet 過濾器。該注釋封裝正被聲明的過濾器的有關(guān)元數(shù)據(jù)。在過濾器類上具有 @FilterMapping 注釋也是強(qiáng)制性的。@FilterMapping 注釋定義用于過濾器的 URL 模式。@ServletFilter 的所有其他屬性都是可選的,并帶有合理的默認(rèn)值。V3.0 過濾器類現(xiàn)在類似 POJO 類,并且沒有用于這些類所需的 Filter 接口或者非參數(shù)公用構(gòu)造器。以下給出了使用 Servlet v2.5 API 的過濾器類的代碼片段:

    1. public class MyFilter implements Filter {  
    2. public void doFilter(ServletRequest req,  
    3. ServletResponse res,  
    4. FilterChain chain)   
    5. throws IOException, ServletException {  
    6. ......  
    7. }  
    8. }  

        Deployment descriptor (web.xml)

    1. <web-app>  
    2. <filter>  
    3. <filter-name>My Filter</filter-name>  
    4. <filter-class>samples.MyFilter</filter-class>  
    5. </filter>  
    6.   
    7. <filter-mapping>  
    8. <filter-name>My Filter</filter-name>  
    9. <url-pattern>/foo</url-pattern>  
    10. </filter-mapping>   
    11. ...  
    12. </web-app>  

       使用 Servlet 3.0 編寫的一個(gè)示例過濾器類如下所示。因?yàn)樵擃愂褂?ServletFilter 注釋,所以容器將 MyFilter 標(biāo)記為一個(gè)過濾器類。MyFilter 截取所有收到的請(qǐng)求,其中該請(qǐng)求的 URL 匹配模式 /foo。Servlet 3.0 為過濾器配置提供了可選的部署描述符。

    1. @ServletFilter  
    2. @FilterMapping("/foo")  
    3. public class MyFilter {  
    4. public void doFilter(HttpServletRequest req,   
    5. HttpServletResponse res) {  
    6. .....  
    7. }  
    8. }  

      @InitParam:該注釋可以用來定義必須傳遞給 servlet 或者過濾器類的任意初始化參數(shù)。它是 @Servlet 和 @ServletFilter 注釋的一個(gè)屬性。以下代碼示例解釋了如何將具有 english 值、稱作 lang 的初始化參數(shù)傳遞給一個(gè) servlet 類。

    1. @Servlet(urlMappings={"/MyApp"}, initParams ={@InitParam(name="lang", value="english")})  
    2. public class MyServlet {  
    3. @GET  
    4. public void handleGet(HttpServletRequest req,   
    5. HttpServletResponse res) {  
    6. ....  
    7. }  
    8. }  

    @ServletContextListener:javax.servlet.http.annotation.ServletContextListener 注釋將該類聲明為一個(gè) servlet 上下文偵聽器。當(dāng) web 容器創(chuàng)建或者銷毀 ServletContext 時(shí),該上下文偵聽器接收注釋。上下文偵聽器是一個(gè) POJO 類,且不必實(shí)現(xiàn) ServletContextListener 接口。使用 Servlet 2.5 API 編寫的偵聽器類如下所示。當(dāng)且僅當(dāng)您在部署描述符中配置了該偵聽器類,容器才識(shí)別它。

    1. public class MyListener implements ServletContextListener {  
    2. public void contextInitialized(ServletContextEvent sce) {  
    3.   
    4. }  
    5. .....  
    6. }  

         Deployment Descriptor (web.xml)

    1. <web-app>  
    2. <listener>  
    3. <listener-class>samples.MyListener</listener-class>  
    4. </listener>  
    5. ....  
    6. </web-app>  

      使用 Servlet 3.0 API 編寫的一個(gè)得到極大簡(jiǎn)化的偵聽器類,如下所示。

    1. @ServletContextListener  
    2. public class MyListener {  
    3. public void contextInitialized (ServletContextEvent sce) {  
    4.   
    5. }  
    6. .....  
    7. }  

          Deployment Descriptor (web.xml)

         optional

    posted on 2009-09-21 14:21 seal 閱讀(211) 評(píng)論(0)  編輯  收藏 所屬分類: Java基礎(chǔ)
    主站蜘蛛池模板: 亚洲高清国产拍精品熟女| GOGOGO高清免费看韩国| 免费在线一级毛片| 国产午夜精品免费一区二区三区| 亚洲视频在线观看网站| 波多野结衣久久高清免费| a一级毛片免费高清在线| 亚洲精品国产肉丝袜久久| 免费国产成人高清在线观看麻豆| 免费无码又爽又刺激一高潮| 亚洲天堂2017无码中文| 亚洲性猛交XXXX| a级毛片无码免费真人| 黄色网页在线免费观看| 亚洲日韩国产精品乱-久| 国产av无码专区亚洲av果冻传媒| 日本成年免费网站| 成人无码区免费A∨直播| 色天使亚洲综合在线观看| 亚洲国产一二三精品无码| 在线观看人成网站深夜免费| 久久久久免费看黄a级试看| 久久亚洲AV成人无码国产电影| 日韩精品亚洲人成在线观看| 免费永久国产在线视频| A在线观看免费网站大全| 免费观看91视频| 无忧传媒视频免费观看入口| 激情亚洲一区国产精品| 亚洲AV乱码久久精品蜜桃| 亚洲片一区二区三区| 四虎影视www四虎免费| 18女人腿打开无遮掩免费| 青青操免费在线观看| 搜日本一区二区三区免费高清视频 | 日亚毛片免费乱码不卡一区| 亚洲中文字幕久久久一区| 久久亚洲AV成人无码| 久久精品亚洲视频| 亚洲综合色婷婷七月丁香| 全黄性性激高免费视频|