【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分片示例:
- <web-fragment>
- <servlet>
- <servlet-name>myFrameworkServlet</servlet-name>
- <servlet-class>myFramework.myFrameworkServlet</servlet-class>
- </servlet>
- <listener>
- <listener-class>myFramework.myFrameworkListener</listener-class>
- </listener>
- </web-fragment>
一個<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文件。
Servlet 3.0支持對部署描述符的絕對排序和相對排序,在Web.xml文件中使用<absolute-ordering>元素指定絕對排序,在web-fragment.XML文件中使用<ordering>元素指定相對排序。
例如,假設你的Web應用程序包括兩個Web分片:MyFragment2 和 MyFragment3,也包括一個Web.XML文件,可以象下面這樣聲明描述符使用絕對排序:
- <web-app>
- <name>MyApp</name>
- <absolute-ordering>
- <name>MyFragment3</name>
- <name>MyFragment2</name>
- </absolute-ordering>
- ...
- </web-app>
通過上面的代碼,我們可以看出處理順序如下:
◆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的例子:
- @HandlesTypes(AnnotationA.class)
- AServletContainerInitializer implements ServletContainerInitializer
- {
- public void onStartup(Set<Class<A>>c, ServletContext ctx) throws ServletException {
- // Framework-specific code here to initialize the runtime
- // and setup the mapping etc.
- ServletRegistration reg = ctx.addServlet("AServlet", "com.foo.AServlet");
- reg.addServletMapping("/foo");
當容器或應用程序啟動時,容器使用JAR服務API發現ServletContainerInitializer。@HandlesTypes注解指定ServletContainerInitializer可以處理的類型,在WEB-INF/lib目錄下任何JAR中發現的類都傳遞給ServletContainerInitializer,ServletContainerInitializer就可以和ServletContextListeners使用相同的編程配置API。
原文:Introducing the Java EE 6 Platform 作者:Ed Ort