Servlet3.0新特性介紹:
Servlet 3.0 作為 Java EE 6 規范體系中一員,隨着 Java EE 6 規范一起發布。該版本在前一版本(Servlet 2.5)的基礎上提供了若干新特性用於簡化 Web 應用的開發和部署。其中有幾項特性的引入讓開發者感到非常興奮,同時也獲得了 Java 社區的一片贊譽之聲:
- 異步處理支持:有了該特性,Servlet 線程不再需要一直阻塞,直到業務處理完畢才能再輸出響應,最后才結束該 Servlet 線程。在接收到請求之后,Servlet 線程可以將耗時的操作委派給另一個線程來完成,自己在不生成響應的情況下返回至容器。針對業務處理較耗時的情況,這將大大減少服務器資源的占用,並且提高並發處理速度。
- 新增的注解支持:該版本新增了若干注解,用於簡化 Servlet、過濾器(Filter)和監聽器(Listener)的聲明,這使得 web.xml 部署描述文件從該版本開始不再是必選的了。
- 可插性支持:熟悉 Struts2 的開發者一定會對其通過插件的方式與包括 Spring 在內的各種常用框架的整合特性記憶猶新。將相應的插件封裝成 JAR 包並放在類路徑下,Struts2 運行時便能自動加載這些插件。現在 Servlet 3.0 提供了類似的特性,開發者可以通過插件的方式很方便的擴充已有 Web 應用的功能,而不需要修改原有的應用。
注:關於Servlet3.0新特性今天着重演示web-fragment.xml模塊化配置文件(在實際項目遇到的),關於其他新特性可以參考此文章:Servlet3.0新特性詳解 或者 博友文章
1、web-fragment.xml和web.xml的展現形式區別在哪里?
普通的web.xml文件文件模板是:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> ................ </web-app>
web-fragment.xml文件模板是:
<?xml version="1.0" encoding="UTF-8"?> <web-fragment id="WebFragment_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"> ............ </web-fragment>
首先就是根標簽的不一樣正常的web.xml文件標簽是 <web-app></web-app> 這表示主要的Javaweb項目的配置文件,而web-fragment.xml文件根標簽是<web-fragment></web-fragment>,和web-fragment.xml 與 web.xml 除了在頭部聲明的 XSD 引用不同之外,其主體配置與 web.xml 是完全一致的,Servlet 3.0 引入了稱之為“Web 模塊部署描述符片段”的 web-fragment.xml 部署描述文件,該文件必須存放在 JAR 文件的 META-INF 目錄下,該部署描述文件可以包含一切可以在 web.xml 中定義的內容。JAR 包通常放在 WEB-INF/lib 目錄下,除此之外,所有該模塊使用的資源,包括 class 文件、配置文件等,只需要能夠被容器的類加載器鏈加載的路徑上,比如 classes 目錄等。可以說這個新特性還是很實用的,不用把之前臃腫的配置全部放在web.xml文件中了,可以把一些初始化的配置全部配置到web-fragment.xml文件中,比如在分布式項目中,spring的包掃描,在一些公司中都會有相應的規范約束,就連controller和service等等都要求包名都要遵守規范,這樣我們就可以提取出來一個工程,統一加載spring的配置文件,在web-fragment.xml中加載這些spring的配置文件,這樣在其他開發者工作中,不用每次都要配置spring的幾乎重復的配置,直接引用相應的jar包即可完成配置,這樣可以打打提高效率。
例如:
******************************************
這樣在其他開發者引用該項目以后,就可以做到"0配置spring"就可以使用spring帶來的方便。
2、web.xml與web-fragment.xml的執行順序問題?
*首先:web.xml肯定是第一個執行的因為web.xml是web項目的入口
*多個web-fragement.xml 的執行順序是可以配置的,示例:
使用部署描述符(web.xml)中的<absolute-ordering>元素,可以按如下所示設置絕對順序:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <name>MyApp</name> <absolute-ordering> <name>MyFragment1</name> <name>MyFragment2</name> </absolute-ordering> ... </web-app>
Web片段的相對排序:
使用web-fragment.xml中的<ordering>元素,可以設置相對順序。下面給出三個不同的web-fragment.xml文件,如下所示:
web-fragment.xml:
<web-fragment> <name>MyFragment1</name> <ordering><after><name>MyFragment2</name></after></ordering> ... </web-fragment>
web-fragment.xml:
<web-fragment> <name>MyFragment2</name> ... </web-fragment>
web-fragment.xml:
<web-fragment> <name>MyFragment3</name> <ordering><before><others/></before></ordering> .. </web-fragment>
在<before>指明所述含有片段必須在片段名稱之前預訂下嵌套提供<name>標記。<after>標記指定必須在嵌套的<name>標記下提供的片段名稱之后對片段進行排序。在<before> <others/> </before> 指明所述含有片段必須是在web.xml后的排序的第一個。
以上內容的網頁片段順序如下:
- MyFragment3
- MyFragment2
- MyFragment1
參考文獻來自:Web片段的排序
3、實際演示效果?
*首先創建一個test的maven工程,這里只有web-fragment.xml文件,其他沒有只是作為演示:
在web-fragment.xml文件中配置context-param參數:
然后安裝到本地倉庫
注意:該文件必須存放在 JAR 文件的 META-INF 目錄下,在maven中配置:
<build> <resources> <resource> <directory>src/main/resources</directory> <targetPath>META-INF/</targetPath> </resource> </resources> </build>
*****************
*創建一個AA的javaweb項目,添加一個監聽器,或者上下文參數:
啟動項目打印結果:
從結果可以看出在test工程里web-fragment.xml配置的參數生效了,只需要應用該jar包就可以完成web.xml文件的模塊化配置。