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>標簽。
下面是一個簡單的示例:
- @WebFilter(servletNames={"SimpleServlet"},filterName="SimpleFilter")
- publicclassLessThanSixFilterimplementsFilter{...}
如此配置之後,就可以不必在web.xml中配置相應的<filter>和<filter-mapping>元素了,容器會在部署時根據指定的屬性將該類發布為過濾器。它等價的web.XML中的配置形式為:
- <filter>
- <filter-name>SimpleFilter</filter-name>
- <filter-class>xxx</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>SimpleFilter</filter-name>
- <servlet-name>SimpleServlet</servlet-name>
- </filter-mapping>
@WebListener
該注解用於將類聲明為監聽器,被@WebListener標注的類必須實現以下至少一個接口:
- ServletContextListener
- ServletContextAttributeListener
- ServletRequestListener
- ServletRequestAttributeListener
- HttpSessionListener
- HttpSessionAttributeListener
該注解使用非常簡單,其屬性如下:
屬性名類型是否可選描述
valueString是該監聽器的描述信息。
一個簡單示例如下:
- @WebListener("Thisisonlyademolistener")
- publicclassSimpleListenerimplementsServletContextListener{...}
如此,則不需要在web.xml中配置<listener>標簽了。它等價的web.XML中的配置形式如下:
- <listener>
- <listener-class>footmark.servlet.SimpleListener</listener-class>
- </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文件示例如下:
- <?XMLversionXMLversion="1.0"encoding="UTF-8"?>
- <web-fragment
- XMLns=http://java.sun.com/XML/ns/Javaee
- XMLns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="3.0"
- xsi:schemaLocation="http://java.sun.com/XML/ns/Javaee
- http://java.sun.com/XML/ns/Javaee/web-fragment_3_0.xsd"
- metadata-complete="true">
- <servlet>
- <servlet-name>fragment</servlet-name>
- <servlet-class>footmark.servlet.FragmentServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>fragment</servlet-name>
- <url-pattern>/fragment</url-pattern>
- </servlet-mapping>
- </web-fragment>
從上面的示例可以看出,web-fragment.xml與web.xml除了在頭部聲明的XSD引用不同之外,其主體配置與web.xml是完全一致的。由於一個Web應用中可以出現多個web-fragment.xml聲明文件,加上一個web.XML文件,加載順序問題便成了不得不面對的問題。Servlet規范的專家組在設計的時候已經考慮到了這個問題,並定義了加載順序的規則。
web-fragment.XML包含了兩個可選的頂層標簽,<name>和<ordering>,如果希望為當前的文件指定明確的加載順序,通常需要使用這兩個標簽,<name>主要用於標識當前的文件,而<ordering>則用於指定先後順序。一個簡單的示例如下:
- <web-fragment...>
- <name>FragmentA</name>
- <ordering>
- <after>
- <name>FragmentB</name>
- <name>FragmentC</name>
- </after>
- <before>
- <others/>
- </before>
- </ordering>
- ...
- </web-fragment>
如上所示,<name>標簽的取值通常是被其它web-fragment.xml文件在定義先後順序時引用的,在當前文件中一般用不著,它起著標識當前文件的作用。在<ordering>標簽內部,我們可以定義當前web-fragment.XML文件與其他文件的相對位置關系,這主要通過<ordering>的<after>和<before>子標簽來實現的。在這兩個子標簽內部可以通過<name>標簽來指定相對應的文件。比如:
- <after>
- <name>FragmentB</name>
- <name>FragmentC</name>
- </after>
以上片段則表示當前文件必須在FragmentB和FragmentC之後解析。<before>的使用於此相同,它所表示的是當前文件必須早於<before>標簽裡所列出的web-fragment.xml文件。除了將所比較的文件通過<name>在<after>和<begin>中列出之外,Servlet還提供了一個簡化的標簽<others/>。它表示除了當前文件之外的其他所有的web-fragment.XML文件。該標簽的優先級要低於使用<name>明確指定的相對位置關系。