Servlet3.0新特性介绍:
Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声:
- 异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
- 新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。
- 可插性支持:熟悉 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后的排序的第一个。
以上内容的网页片段顺序如下:
- MyFragment3
- MyFragment2
- 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文件的模块化配置。