Java EE 6增强的可扩展性:Web分片和可插拔框架

原创
开发 后端
Java EE 6在Web层的改进十分值得关注。在可扩展性方面,Java EE 6通过Web分片和可插拔共享框架进行了改进,这是通过Servlet 3.0实现的。本文介绍这两个可扩展性方面的增强特性。

【51CTO精选译文】Java EE 6中最引人注目的改进要算Web层的展示了,正如前面提到的Java EE 6的一个重要目标(参考51CTO之前发布的Java EE 6平台的主要目标)就是提高可扩展性,在可扩展性方面两个关键改进分别是Web分片和可插拔性共享框架,这两个新特性是通过Java EE 6中的Servlet 3.0技术提供的。Servlet 3.0,JSR 315规范是Servlet技术的***版本,它提供了诸如支持异步处理和注解等增强。

51CTO编辑推荐:Java EE 6平台指南

Java EE 6中另一个重要的Web层技术是JSF 2.0,它是JSF技术的***版本,JSF 2.0通过Facelets简化了页面和组件的开发,并支持异步JavaScript和XML(通常叫做Ajax),以及注解。

Servlet 3.0中支持的Web分片

Web应用程序开发人员通常在他们的应用程序中使用第三方框架,如Apache Wicket或Spring MVC。为了使用这些框架,开发人员需要在Web应用程序中注册要使用的框架,一般都使用Web.xml文件来保存注册信息,这个文件还包括构成Web应用程序的Web组件部署描述符,这样使得Web.xml变得非常庞大,难以隔离和维护各种描述符。

Web分片是Servlet 3.0中引入的一个新技术,通过模块化部署描述符解决了这个问题,一个Web分片可以看作是Web.xml文件的一个逻辑段,可以存在多个Web分片,每个分片代表一个逻辑段,Web分片集可以组成一个完整的Web.xml文件,Web.xml文件这种逻辑分区让Web框架自己可以在Web容器中完成注册。你在Web应用程序中使用的每个Web框架可以在一个Web分片中定义所有它需要的工具,如Servlet和监听器,不再需要在Web.xml文件中添加信息。

下面是一个注册Servlet和监听器的Web分片示例:

  1. <web-fragment> 
  2.         <servlet> 
  3.             <servlet-name>myFrameworkServlet</servlet-name> 
  4.             <servlet-class>myFramework.myFrameworkServlet</servlet-class> 
  5.         </servlet> 
  6.  
  7.         <listener> 
  8.             <listener-class>myFramework.myFrameworkListener</listener-class> 
  9.         </listener> 
  10.     </web-fragment> 
  11.  

一个<web-fragment>元素表示一个Web分片,Web分片必须在一个名叫web-fragment.xml的文件中,这个文件可以放在Web应用程序类路径的任何地方,但Web框架通常会将它的Web分片放到META-INF目录下。

在Web.xml中使用<metadata-complete>元素指示Web容器是否要查找Web分片和注解,如果你将<metadata-complete>设为false,或在Web.xml文件中不指定<metadata-complete>元素,那在以后的开发过程中,容器就必须扫描Web分片和注解,以便为Web应用程序构建有效的元数据。在响应中,Web容器搜索框架JAR文件中的Web分片和注解,Web容器然后使用每个Web分片中的配置信息注册应用程序要使用的框架,但如果将<metadata-complete>设为true,部署描述符会为Web应用程序提供所有的配置信息,这种情况下Web容器不会搜索Web分片和注解。

因为Servlet 3.0技术支持Web分片,你可以将Web.xml文件模块化,你的Web应用程序仍然有传统的,庞大的Web.xml文件,但它是一个包含一到多个Web分片的逻辑分区Web.xml文件。

#t#因为Servlet 3.0让你可以模块化你的部署描述符,这些描述符的处理顺序非常重要,因为它们的顺序影响着调用Servlet,监听器和过滤器的顺序,不过不要担心,因为在Servlet 3.0中你可以指定这些描述符的顺序。

Servlet 3.0支持对部署描述符的绝对排序和相对排序,在Web.xml文件中使用<absolute-ordering>元素指定绝对排序,在web-fragment.xml文件中使用<ordering>元素指定相对排序。

例如,假设你的Web应用程序包括两个Web分片:MyFragment2 和 MyFragment3,也包括一个Web.xml文件,可以象下面这样声明描述符使用绝对排序:

  1. <web-app> 
  2.        <name>MyApp</name> 
  3.        <absolute-ordering> 
  4.           <name>MyFragment3</name> 
  5.           <name>MyFragment2</name> 
  6.        </absolute-ordering> 
  7.        ...  
  8. </web-app> 
  9.  

通过上面的代码,我们可以看出处理顺序如下:

◆web.xml - web.xml描述符总是***个处理。

◆MyFragment3

◆MyFragment2

可插拔式共享框架

Web分片和注解不是Servlet 3.0允许你扩展web应用程序的唯一方法,你也可以插入构建在Web容器之上的框架共享副本,如基于XML Web服务的Java API(JAX-WS),JAX-RS 和 JSF,Servlet 3.0引入了一个新接口ServletContainerInitializer,它可以用来插入一个框架。

下面是一个插入框架A的例子:

  1. @HandlesTypes(AnnotationA.class)  
  2.     AServletContainerInitializer implements ServletContainerInitializer  
  3.     {  
  4.        public void onStartup(Set<Class<A>>c, ServletContext ctx) throws ServletException {  
  5.          // Framework-specific code here to initialize the runtime  
  6.          // and setup the mapping etc.  
  7.          ServletRegistration reg = ctx.addServlet("AServlet""com.foo.AServlet");  
  8.       reg.addServletMapping("/foo");  
  9.  

当容器或应用程序启动时,容器使用JAR服务API发现ServletContainerInitializer。@HandlesTypes注解指定ServletContainerInitializer可以处理的类型,在WEB-INF/lib目录下任何JAR中发现的类都传递给ServletContainerInitializer,ServletContainerInitializer就可以和ServletContextListeners使用相同的编程配置API。

原文:Introducing the Java EE 6 Platform 作者:Ed Ort

责任编辑:yangsai 来源: 51CTO.com
相关推荐

2021-09-02 09:42:11

测试软件可扩展性开发

2020-08-18 08:04:16

DubboSPI框架

2021-12-09 05:36:16

云存储可扩展性数据存储云存储

2011-03-01 11:31:38

SOA甲骨文

2022-09-05 15:17:34

区块链比特币可扩展性

2023-10-11 13:46:26

缓存Web应用程序

2017-01-05 19:29:10

公共云云存储微软

2012-06-04 11:04:46

虚拟化

2021-12-03 14:41:00

云存储可扩展性存储

2021-05-17 07:28:23

Spring可扩展性项目

2016-10-13 14:38:51

OpenStack可扩展性IT人员

2023-06-15 15:40:36

2018-09-03 14:30:35

2019-12-09 16:08:19

区块链分片分布式

2010-02-26 15:07:20

WCF单例服务

2009-04-20 11:33:47

光网络动态扩展

2023-05-17 15:53:21

2022-01-20 15:45:32

区块链网络安全数据

2012-07-04 16:50:41

2013-04-09 10:16:28

OpenStackGrizzlyHyper-V
点赞
收藏

51CTO技术栈公众号