Servlet3.0模塊化支持

Servlet3.0模塊化支持

 

       Servlet3.0現在已經支持各Web組件的模塊化了。也就是說現在我們可以把各Web組件單獨拿出來進行開發,之後把它們打成對應的jar包放到主項目中就可以了,而不必像之前那樣——所有的內容都必須在web.xml文件中進行定義。有了對模塊化的支持後我們在實際應用中就可以把某些通用功能的FilterListenerServlet作爲一個單獨的Web模塊進行定義,在需要使用它們的項目中就把對應Web模塊對應的jar包加進去就可以了。是不是很有用呢?接下來我們就來看一下這些Web組件究竟是怎樣模塊化的。

       Web模塊打成的jar包的內容的文件結構要求是這個樣子的:

|--META-INF

|     |--web-fragment.xml

|     |--resources

|     |     |--jsp、圖片等,相當於web的根目錄

|--class文件和類路徑下的文件

 

       其中web-fragment.xml文件是必須要的。上述目錄結構就相當於在我們的類路徑下有一個META-INF目錄,該目錄下有web-fragment.xml文件及包含jsp、圖片等資源的resources目錄。針對於上述這樣的目錄結構,所以當我們在使用Maven構建項目的時候,我們的Maven項目的目錄結構應該是這個樣子的:



 
       web-fragment.xml文件的作用與Web應用下的web.xml文件的作用是相似的,在web.xml文件可以配置的信息都可以在web-fragment.xml文件中進行配置。此外,它們的文檔結構也非常的相似。所不同的是web-fragment.xml文件的根元素是web-fragment,所使用的schema也是web-fragment相應的schema。

<web-fragment 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-fragment.xml文件中我們可以通過<name>元素來指定當前模塊的名稱,用<ordering>元素來指定當前模塊相對的加載順序。<ordering>元素下面可以指定<before><after>元素,而<before><after>元素下又可以指定<name><others>元素。我們來看幾個指定ordering的示例。

在其他模塊之前加載

   <ordering>
      <!-- 在其它模塊之前加載 -->
      <before>
         <others/>
      </before>
   </ordering>

  

在指定模塊之後加載

   <ordering>
      <!-- 在指定模塊之後加載 -->
      <after>
         <name>模塊名稱</name>
      </after>
   </ordering>

  

       除了可以在web-fragment.xml文件裏面通過<ordering>元素定義當前模塊的加載順序外,我們還可以在web.xml文件中通過<absolute-ordering>元素指定各模塊的 加載順序。而且web.xml文件中指定的加載順序比web-fragment.xml文件中指定的加載順序具有更高的優先級。如:

   <absolute-ordering>
      <name>module1</name>
      <name>module2</name>
      <name>module3</name>
      <others/>
   </absolute-ordering>

  

       接下來我們來展示一個創建web模塊的例子。假設我們要創建一個叫做module1的模塊,其中含有一個Module1Servlet,其代碼如下所示:

public class Module1Servlet extends HttpServlet {
 
   private static final long serialVersionUID = 1L;
 
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      this.doPost(req, resp);
   }
 
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
         throws ServletException, IOException {
      req.getRequestDispatcher("/module1.jsp").forward(req, resp);
   }
 
}

  

       接着我們在類路徑下創建一個META-INF文件夾,在該文件夾下創建一個resources目錄,在resources目錄下創建一個module1.jsp文件。接着在META-INF目錄下創建一個web-fragment.xml文件,其內容如下:

<web-fragment 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">
  
   <!-- 指定模塊名稱 -->
   <name>module1</name>
   <!-- 加載順序 -->
   <ordering>
      <!-- 在其它模塊之前加載 -->
      <before>
         <others/>
      </before>
   </ordering>
  
   <servlet>
      <servlet-name>module1Servlet</servlet-name>
      <servlet-class>com.xxx.Module1Servlet</servlet-class>
   </servlet>
  
   <servlet-mapping>
      <servlet-name>module1Servlet</servlet-name>
      <url-pattern>/servlet/module1</url-pattern>
   </servlet-mapping>
  
</web-fragment>

 

       之後我們把該項目打成一個jar包就可以把它作爲一個jar加到其它Web應用中,在其它Web應用中使用了。放到其它Web應用中後,我們通過訪問/servlet/module1就可以訪問到我們module1模塊中定義的Module1Servlet了。

 

 

  • c972fca7-28f2-32f9-ba69-43fa1d3dbf69-thumb.png
  • 大小: 6.2 KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章