• 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文件的模块化配置。

  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/xiejn/p/12687976.html
Copyright © 2020-2023  润新知