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了。