Servlet3.0新特性之web-fragment.xml模塊化配置文件


Servlet3.0新特性介紹:

Servlet 3.0 作為 Java EE 6 規范體系中一員,隨着 Java EE 6 規范一起發布。該版本在前一版本(Servlet 2.5)的基礎上提供了若干新特性用於簡化 Web 應用的開發和部署。其中有幾項特性的引入讓開發者感到非常興奮,同時也獲得了 Java 社區的一片贊譽之聲:

  1. 異步處理支持:有了該特性,Servlet 線程不再需要一直阻塞,直到業務處理完畢才能再輸出響應,最后才結束該 Servlet 線程。在接收到請求之后,Servlet 線程可以將耗時的操作委派給另一個線程來完成,自己在不生成響應的情況下返回至容器。針對業務處理較耗時的情況,這將大大減少服務器資源的占用,並且提高並發處理速度。
  2. 新增的注解支持:該版本新增了若干注解,用於簡化 Servlet、過濾器(Filter)和監聽器(Listener)的聲明,這使得 web.xml 部署描述文件從該版本開始不再是必選的了。
  3. 可插性支持:熟悉 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后的排序的第一個。

以上內容的網頁片段順序如下:

    1. MyFragment3

    2. MyFragment2

    3. 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文件的模塊化配置。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM