背景
Web fragments
是servlet 3.0
开始支持的一个特性(可插性支持),通过插件的方式很方便的扩充已有Web
应用的功能,而不需要修改原有的应用
注意事项
Servlet 3.0 的部署描述文件 web.xml 的顶层标签 有一个 metadata-complete 属性,该属性指定当前的部署描述文件是否是完全的。如果设置为 true,则容器在部署时将只依赖部署描述文件,忽略所有的注解(同时也会跳过 web-fragment.xml 的扫描,亦即禁用可插性支持,具体请看后文关于 可插性支持 的讲解);如果不配置该属性,或者将其设置为 false,则表示启用注解支持(和可插性支持)。
Web fragments语法和规则
Web fragments
需要有web-fragment.xml
的部署描述文件,该文件必须存放在JAR
文件的META-INF
目录下,该部署描述文件可以包含一切可以在web.xml
中定义的内容(过滤器、监听器与Servlet
)- 包含
web-fragment.xml
的JAR
应该部署到Web
应用程序的WEBINF/lib
目录中 web-fragment.xml
的根元素是<web-fragment>
,它可以包含DD(web.xml)
中<web-app>
元素的任何子元素。- 每个
web-fragment.xml
都可以包含一个name
元素。name
元素在所有Web
片段中应该是唯一的,并且不应有任何循环引用或循环,否则容器将因有意义的错误中止应用程序部署。该名称将用于Web
片段的任何排序。 - 可以使用元素
<absolute-ordering>
从web.xml
中指定Web
片段的顺序。也可以使用元素<ordering>
从Web
片段本身内部指定Web
片段的顺序。在web.xml
或Web
片段中,元素按照声明的顺序加载。 - 并且如果
web-fragment.xml
和web.xml
之间存在冲突,则web.xml
将具有优先权。但是,如果两个片段之间存在冲突,则会引发错误。
配置内容
servlet、filter、listener三个可以定义任何一个,也可以全部定义
web-fragment.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<web-fragment id="WebFragment_ID" version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-fragment_3_1.xsd">
<name>Test</name>
<!-- servlet -->
<servlet>
<servlet-name>servletTest</servlet-name>
<servlet-class>com.xxx.xxx.servlets.ServletTest</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servletTest</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- filter -->
<filter>
<filter-name>filterTest</filter-name>
<filter-class>com.xxx.xxx.FilterTest</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>filterTest</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
<!-- listener -->
<listener>
<listener-class>com.xxx.xxx.ListenerTest</listener-class>
</listener>
<ordering>
<!-- 表示在项目所有之前进行初始化 -->
<before>
<others/>
</before>
<!-- 表示在项目所有之后进行初始化 -->
<after>
<others/>
</after>
</ordering>
</web-fragment>Servlet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletTest extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
}
public void destroy() {
super.destroy();
}
}Filter:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class FilterTest implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
public void destroy() {
}
}Listener:
1
2
3
4
5
6
7
8
9
10
11
12
13
14import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class ListenerTest implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
}
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
}
}