Servlet3.0模塊化支持
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-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了。