Servlet3.0新特性之web-fragment.xml模块化配置文件

Servlet3.0新特性介绍:

Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声:

  1. 异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
  2. 新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。
  3. 可插性支持:熟悉 Struts2 的开发者一定会对其通过插件的方式与包括 Spring 在内的各种常用框架的整合特性记忆犹新。将相应的插件封装成 JAR 包并放在类路径下,Struts2 运行时便能自动加载这些插件。现在 Servlet 3.0 提供了类似的特性,开发者可以通过插件的方式很方便的扩充已有 Web 应用的功能,而不需要修改原有的应用。

注:关于Servlet3.0新特性今天着重演示web-fragment.xml模块化配置文件(在实际项目遇到的),关于其他新特性可以参考此文章:Servlet3.0新特性详解 或者 博友文章

 

1、web-fragment.xml和web.xml的展现形式区别在哪里?

普通的web.xml文件文件模板是:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
................
</web-app>

 

web-fragment.xml文件模板是:

<?xml version="1.0" encoding="UTF-8"?>
<web-fragment id="WebFragment_ID" 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.xml文件标签是 <web-app></web-app> 这表示主要的Javaweb项目的配置文件,而web-fragment.xml文件根标签是<web-fragment></web-fragment>,和web-fragment.xml 与 web.xml 除了在头部声明的 XSD 引用不同之外,其主体配置与 web.xml 是完全一致的,Servlet 3.0 引入了称之为“Web 模块部署描述符片段”的 web-fragment.xml 部署描述文件,该文件必须存放在 JAR 文件的 META-INF 目录下,该部署描述文件可以包含一切可以在 web.xml 中定义的内容。JAR 包通常放在 WEB-INF/lib 目录下,除此之外,所有该模块使用的资源,包括 class 文件、配置文件等,只需要能够被容器的类加载器链加载的路径上,比如 classes 目录等。可以说这个新特性还是很实用的,不用把之前臃肿的配置全部放在web.xml文件中了,可以把一些初始化的配置全部配置到web-fragment.xml文件中,比如在分布式项目中,spring的包扫描,在一些公司中都会有相应的规范约束,就连controller和service等等都要求包名都要遵守规范,这样我们就可以提取出来一个工程,统一加载spring的配置文件,在web-fragment.xml中加载这些spring的配置文件,这样在其他开发者工作中,不用每次都要配置spring的几乎重复的配置,直接引用相应的jar包即可完成配置,这样可以打打提高效率。

例如:

 

 ******************************************

 

 这样在其他开发者引用该项目以后,就可以做到"0配置spring"就可以使用spring带来的方便。

 

2、web.xml与web-fragment.xml的执行顺序问题?

*首先:web.xml肯定是第一个执行的因为web.xml是web项目的入口

*多个web-fragement.xml 的执行顺序是可以配置的,示例:

使用部署描述符(web.xml)中的<absolute-ordering>元素,可以按如下所示设置绝对顺序:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
id="WebApp_ID" version="3.0">
    <name>MyApp</name>
    <absolute-ordering>
        <name>MyFragment1</name>
        <name>MyFragment2</name>
    </absolute-ordering>
    ...

</web-app>

Web片段的相对排序:

使用web-fragment.xml中的<ordering>元素,可以设置相对顺序。下面给出三个不同的web-fragment.xml文件,如下所示:

web-fragment.xml:

<web-fragment>
    <name>MyFragment1</name>
    <ordering><after><name>MyFragment2</name></after></ordering>
    ...
</web-fragment>

web-fragment.xml:

<web-fragment>
    <name>MyFragment2</name>
    ...
</web-fragment>

web-fragment.xml:

<web-fragment>
    <name>MyFragment3</name>
    <ordering><before><others/></before></ordering>
    ..
</web-fragment>

<before>指明所述含有片段必须在片段名称之前预订下嵌套提供<name>标记。<after>标记指定必须在嵌套的<name>标记下提供的片段名称之后对片段进行排序<before> <others/> </before指明所述含有片段必须是在web.xml后的排序的第一个。

以上内容的网页片段顺序如下:

    1. MyFragment3

    2. MyFragment2

    3. MyFragment1

参考文献来自:Web片段的排序

 

3、实际演示效果?

*首先创建一个test的maven工程,这里只有web-fragment.xml文件,其他没有只是作为演示:

在web-fragment.xml文件中配置context-param参数:

 然后安装到本地仓库

 注意:该文件必须存放在 JAR 文件的 META-INF 目录下,在maven中配置:

      <build>
        <resources>
          <resource>
             <directory>src/main/resources</directory>
             <targetPath>META-INF/</targetPath>
          </resource>
       </resources>
    </build>

*****************

*创建一个AA的javaweb项目,添加一个监听器,或者上下文参数:

 

 

启动项目打印结果:

 

 从结果可以看出在test工程里web-fragment.xml配置的参数生效了,只需要应用该jar包就可以完成web.xml文件的模块化配置。

 

posted @ 2020-04-12 21:58  图图小淘气_real  阅读(2114)  评论(0编辑  收藏  举报