程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 簡化Web應用開發 Servlet 3.0特性詳解(3)

簡化Web應用開發 Servlet 3.0特性詳解(3)

編輯:J2EE
屬性名類型描述

1.filterNameString指定過濾器的name屬性,等價於<filter-name>。

2.valueString[]該屬性等價於urlPatterns屬性。但是兩者不應該同時使用。

3.urlPatternsString[]指定一組過濾器的URL匹配模式。等價於<url-pattern>標簽。

4.servletNamesString[]指定過濾器將應用於哪些Servlet。取值是@WebServlet中的name屬性的取值,或者是web.XML中<servlet-name>的取值。

5.dispatcherTypesDispatcherType指定過濾器的轉發模式。具體取值包括:

◆ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。

◆initParamsWebInitParam[]指定一組過濾器初始化參數,等價於<init-param>標簽。

◆asyncSupportedboolean聲明過濾器是否支持異步操作模式,等價於<async-supported>標簽。

◆descriptionString該過濾器的描述信息,等價於<description>標簽。

◆displayNameString該過濾器的顯示名,通常配合工具使用,等價於<display-name>標簽。

下面是一個簡單的示例:

  1. @WebFilter(servletNames={"SimpleServlet"},filterName="SimpleFilter")
  2. publicclassLessThanSixFilterimplementsFilter{...}

如此配置之後,就可以不必在web.xml中配置相應的<filter>和<filter-mapping>元素了,容器會在部署時根據指定的屬性將該類發布為過濾器。它等價的web.XML中的配置形式為:

  1. <filter>
  2. <filter-name>SimpleFilter</filter-name>
  3. <filter-class>xxx</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>SimpleFilter</filter-name>
  7. <servlet-name>SimpleServlet</servlet-name>
  8. </filter-mapping>

@WebListener

該注解用於將類聲明為監聽器,被@WebListener標注的類必須實現以下至少一個接口:

  1. ServletContextListener
  2. ServletContextAttributeListener
  3. ServletRequestListener
  4. ServletRequestAttributeListener
  5. HttpSessionListener
  6. HttpSessionAttributeListener

該注解使用非常簡單,其屬性如下:

屬性名類型是否可選描述

valueString是該監聽器的描述信息。

一個簡單示例如下:

  1. @WebListener("Thisisonlyademolistener")
  2. publicclassSimpleListenerimplementsServletContextListener{...}

如此,則不需要在web.xml中配置<listener>標簽了。它等價的web.XML中的配置形式如下:

  1. <listener>
  2. <listener-class>footmark.servlet.SimpleListener</listener-class>
  3. </listener>

@MultipartConfig

該注解主要是為了輔助Servlet 3.0中HttpServletRequest提供的對上傳文件的支持。該注解標注在Servlet上面,以表示該Servlet希望處理的請求的MIME類型是multipart/form-data。另外,它還提供了若干屬性用於簡化對上傳文件的處理。具體如下:

屬性名類型是否可選描述

◆fileSizeThresholdint是當數據量大於該值時,內容將被寫入文件。

◆locationString是存放生成的文件地址。

◆maxFileSizelong是允許上傳的文件最大值。默認值為-1,表示沒有限制。

◆maxRequestSizelong是針對該multipart/form-data請求的最大數量,默認值為-1,表示沒有限制。

可插性支持

如果說3.0版本新增的注解支持是為了簡化Servlet/過濾器/監聽器的聲明,從而使得web.XML變為可選配置,那麼新增的可插性(pluggability)支持則將Servlet配置的靈活性提升到了新的高度。熟悉Struts2的開發者都知道,Struts2通過插件的形式提供了對包括Spring在內的各種開發框架的支持,開發者甚至可以自己為Struts2開發插件,而Servlet的可插性支持正是基於這樣的理念而產生的。使用該特性,現在我們可以在不修改已有Web應用的前提下,只需將按照一定格式打成的JAR包放到WEB-INF/lib目錄下,即可實現新功能的擴充,不需要額外的配置。

Servlet 3.0引入了稱之為“Web模塊部署描述符片段”的web-fragment.xml部署描述文件,該文件必須存放在JAR文件的META-INF目錄下,該部署描述文件可以包含一切可以在web.XML中定義的內容。JAR包通常放在WEB-INF/lib目錄下,除此之外,所有該模塊使用的資源,包括class文件、配置文件等,只需要能夠被容器的類加載器鏈加載的路徑上,比如classes目錄等。

現在,為一個Web應用增加一個Servlet配置有如下三種方式(過濾器、監聽器與Servlet三者的配置都是等價的,故在此以Servlet配置為例進行講述,過濾器和監聽器具有與之非常類似的特性):

1.編寫一個類繼承自HttpServlet,將該類放在classes目錄下的對應包結構中,修改web.XML,在其中增加一個Servlet聲明。這是最原始的方式;

2.編寫一個類繼承自HttpServlet,並且在該類上使用@WebServlet注解將該類聲明為Servlet,將該類放在classes目錄下的對應包結構中,無需修改web.XML文件。

3.編寫一個類繼承自HttpServlet,將該類打成JAR包,並且在JAR包的META-INF目錄下放置一個web-fragment.xml文件,該文件中聲明了相應的Servlet配置。web-fragment.XML文件示例如下:

  1. <?XMLversionXMLversion="1.0"encoding="UTF-8"?>
  2. <web-fragment
  3. XMLns=http://java.sun.com/XML/ns/Javaee
  4. XMLns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="3.0"
  5. xsi:schemaLocation="http://java.sun.com/XML/ns/Javaee
  6. http://java.sun.com/XML/ns/Javaee/web-fragment_3_0.xsd"
  7. metadata-complete="true">
  8. <servlet>
  9. <servlet-name>fragment</servlet-name>
  10. <servlet-class>footmark.servlet.FragmentServlet</servlet-class>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>fragment</servlet-name>
  14. <url-pattern>/fragment</url-pattern>
  15. </servlet-mapping>
  16. </web-fragment>

從上面的示例可以看出,web-fragment.xml與web.xml除了在頭部聲明的XSD引用不同之外,其主體配置與web.xml是完全一致的。由於一個Web應用中可以出現多個web-fragment.xml聲明文件,加上一個web.XML文件,加載順序問題便成了不得不面對的問題。Servlet規范的專家組在設計的時候已經考慮到了這個問題,並定義了加載順序的規則。

web-fragment.XML包含了兩個可選的頂層標簽,<name>和<ordering>,如果希望為當前的文件指定明確的加載順序,通常需要使用這兩個標簽,<name>主要用於標識當前的文件,而<ordering>則用於指定先後順序。一個簡單的示例如下:

  1. <web-fragment...>
  2. <name>FragmentA</name>
  3. <ordering>
  4. <after>
  5. <name>FragmentB</name>
  6. <name>FragmentC</name>
  7. </after>
  8. <before>
  9. <others/>
  10. </before>
  11. </ordering>
  12. ...
  13. </web-fragment>

如上所示,<name>標簽的取值通常是被其它web-fragment.xml文件在定義先後順序時引用的,在當前文件中一般用不著,它起著標識當前文件的作用。在<ordering>標簽內部,我們可以定義當前web-fragment.XML文件與其他文件的相對位置關系,這主要通過<ordering>的<after>和<before>子標簽來實現的。在這兩個子標簽內部可以通過<name>標簽來指定相對應的文件。比如:

  1. <after>
  2. <name>FragmentB</name>
  3. <name>FragmentC</name>
  4. </after>

以上片段則表示當前文件必須在FragmentB和FragmentC之後解析。<before>的使用於此相同,它所表示的是當前文件必須早於<before>標簽裡所列出的web-fragment.xml文件。除了將所比較的文件通過<name>在<after>和<begin>中列出之外,Servlet還提供了一個簡化的標簽<others/>。它表示除了當前文件之外的其他所有的web-fragment.XML文件。該標簽的優先級要低於使用<name>明確指定的相對位置關系。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved