Servlet3.0模塊化支持java
Servlet3.0如今已經支持各Web組件的模塊化了。也就是說如今咱們能夠把各Web組件單獨拿出來進行開發,以後把它們打成對應的jar包放到主項目中就能夠了,而沒必要像以前那樣——全部的內容都必須在web.xml文件中進行定義。有了對模塊化的支持後咱們在實際應用中就能夠把某些通用功能的Filter、Listener、Servlet做爲一個單獨的Web模塊進行定義,在須要使用它們的項目中就把對應Web模塊對應的jar包加進去就能夠了。是否是頗有用呢?接下來咱們就來看一下這些Web組件到底是怎樣模塊化的。 Web模塊打成的jar包的內容的文件結構要求是這個樣子的:
|--META-INF
| |--web-fragment.xml
| |--resources
| | |--jsp、圖片等,至關於web的根目錄
|--class文件和類路徑下的文件web
其中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。
xml代碼:
[XML] 純文本查看 複製代碼
?app
<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 [url=http://java.sun.com/xml/ns/ja...]http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd[/url]">jsp
</web-fragment>ide
另外,在web-fragment.xml文件中咱們能夠經過<name>元素來指定當前模塊的名稱,用<ordering>元素來指定當前模塊相對的加載順序。<ordering>元素下面能夠指定<before>或<after>元素,而<before>和<after>元素下又能夠指定<name>和<others>元素。咱們來看幾個指定ordering的示例。
在其餘模塊以前加載
xml代碼:
[XML] 純文本查看 複製代碼
?模塊化
<ordering>
<!-- 在其它模塊以前加載 -->
<before>this
<others/>
</before>
</ordering>url
在指定模塊以後加載
xml代碼:
[XML] 純文本查看 複製代碼
?spa
<ordering>
<!-- 在指定模塊以後加載 -->
<after>code
<name>模塊名稱</name>
</after>
</ordering>
除了能夠在web-fragment.xml文件裏面經過<ordering>元素定義當前模塊的加載順序外,咱們還能夠在web.xml文件中經過<absolute-ordering>元素指定各模塊的 加載順序。並且web.xml文件中指定的加載順序比web-fragment.xml文件中指定的加載順序具備更高的優先級。如:
xml代碼:
[XML] 純文本查看 複製代碼
?
<absolute-ordering>
<name>module1</name>
<name>module2</name>
<name>module3</name>
<others/>
</absolute-ordering>
接下來咱們來展現一個建立web模塊的例子。假設咱們要建立一個叫作module1的模塊,其中含有一個Module1Servlet,其代碼以下所示:
Java代碼:
[Java] 純文本查看 複製代碼
?
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文件,其內容以下:
xml代碼:
[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 [url=http://java.sun.com/xml/ns/ja...]http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd[/url]">
<!-- 指定模塊名稱 -->
<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了。