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

  • 相关阅读:
    (三)Java学习-简单了解JMS与ActiveMQ
    (二)Java并发包-线程池
    (一)Java多线程学习
    zookeeper学习-4数据节点与zkCli客户端命令
    zookeeper学习-3集群环境搭建
    zookeeper学习-1初步了解
    201871010101-陈来弟 实验四 团队作业1:软件研发团队组建
    201871010101-陈来弟《软件工程课程》实验三 软件工程结对项目
    201871010101-陈来弟 实验二 个人项目——《西北师范大学学生疫情上报系统》项目报告
    201871010101-陈来弟《软件工程课程》实验一 软件工程准备
  • 原文地址:https://www.cnblogs.com/xiejn/p/12687976.html
Copyright © 2020-2023  润新知