2011年11月18日星期五

JavaEE_010:JavaEE6 新特性之三:Servlet3.0(2)

特性二:可插入性支持: 引入Web模块部署描述符片段:web-fragment.xml。
Web模块可以按不同功能划分为多个web-fragment.xml文件,每个文件描述该功能模块的配置。
web-fragment.xml必须放在JAR文件的META-INF目录下,而JAR包一般放在WEB-INF/lib 目录下。
web-fragment.xml内容上跟web.xml没有啥区别,web.xml可以定义的,web-fragment.xml也可以定义。

1. 三种方式配置
以配置Servlet为例(Filter,Listener与之类似),首先编写一个Java类,将其继承HttpServlet。
(1)使用web.xml定义
将该类放在 classes 目录下的对应包结构中,修改 web.xml,在其中增加一个 Servlet 声明。
(2)使用元注释定义
在该类上使用 @WebServlet将该类声明为 Servlet,将该类放在 classes 目录下的对应包结构中,无需web.xml 文件。
(3)使用web-fragment.xml定义
将该类打成JAR包,并且在 JAR 包的 META-INF 目录下放置一个 web-fragment.xml 文件,在其中增加一个 Servlet 声明。
其中 web-fragment.xml 文件定义示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-fragment
xmlns=http://java.sun.com/xml/ns/javaee
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"
metadata-complete="true">
<servlet>
<servlet-name>fragment</servlet-name>
<servlet-class>footmark.servlet.FragmentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fragment</servlet-name>
<url-pattern>/fragment</url-pattern>
</servlet-mapping>
</web-fragment>

从上面的示例可以看出,web-fragment.xml 与 web.xml 除了在头部声明的 XSD 引用不同之外,其主体配置与 web.xml 是完全一致的。

2. web-fragment.xml加载顺序
一个 Web 应用中可以出现一个 web.xml 文件和多个web-fragment.xml 声明文件,加载顺序规则如下:
web-fragment.xml 包含了两个可选的顶层标签,<name> 和 <ordering>。
<name> 标签的作用是标识当前文件,通常是被其它 web-fragment.xml 文件在定义先后顺序时引用的。
<ordering> 则用于指定先后顺序。
一个简单的示例如下:

<web-fragment...>
<name>FragmentA</name>
<ordering>
<after>
<name>FragmentB</name>
<name>FragmentC</name>
</after>
<before>
<others/>
</before>
</ordering>
...
</web-fragment>

以上片段则表示当前文件必须在 FragmentB 和 FragmentC 之后解析。
<before> 的使用于此相同,它所表示的是当前文件必须早于 <before> 标签里所列出的 web-fragment.xml 文件。
<others/>标签表示除了当前文件之外的其他所有的 web-fragment.xml 文件。

没有评论: