Web fragments

背景

Web fragmentsservlet 3.0开始支持的一个特性(可插性支持),通过插件的方式很方便的扩充已有Web应用的功能,而不需要修改原有的应用

注意事项

Servlet 3.0 的部署描述文件 web.xml 的顶层标签 有一个 metadata-complete 属性,该属性指定当前的部署描述文件是否是完全的。如果设置为 true,则容器在部署时将只依赖部署描述文件,忽略所有的注解(同时也会跳过 web-fragment.xml 的扫描,亦即禁用可插性支持,具体请看后文关于 可插性支持 的讲解);如果不配置该属性,或者将其设置为 false,则表示启用注解支持(和可插性支持)。

Web fragments语法和规则

  1. Web fragments 需要有 web-fragment.xml 的部署描述文件,该文件必须存放在 JAR 文件的 META-INF 目录下,该部署描述文件可以包含一切可以在 web.xml 中定义的内容(过滤器、监听器与Servlet)
  2. 包含 web-fragment.xmlJAR 应该部署到 Web 应用程序的 WEBINF/lib 目录中
  3. web-fragment.xml 的根元素是 <web-fragment>,它可以包含 DD(web.xml)<web-app> 元素的任何子元素。
  4. 每个 web-fragment.xml 都可以包含一个 name 元素。name 元素在所有 Web 片段中应该是唯一的,并且不应有任何循环引用或循环,否则容器将因有意义的错误中止应用程序部署。该名称将用于 Web 片段的任何排序。
  5. 可以使用元素 <absolute-ordering>web.xml 中指定 Web 片段的顺序。也可以使用元素 <ordering>Web 片段本身内部指定 Web 片段的顺序。在 web.xmlWeb 片段中,元素按照声明的顺序加载。
  6. 并且如果 web-fragment.xmlweb.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
    <?xml version="1.0" encoding="UTF-8"?>
    <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
    18
    import 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 {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.service(req, resp);
    }

    @Override
    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
    24
    import 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 {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    @Override
    public void destroy() {

    }
    }
  • Listener:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;

    public class ListenerTest implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {

    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {

    }
    }
分享到: