Java EE 7 新特性簡介

jopen 10年前發布 | 52K 次閱讀 Java EE J2EE Java開發

        2013 年 6 月中旬甲骨文公司發布了 Java EE 7,該版本的新特性主要集中在提高開發人員的生產力、加強對 HTML5 動態可伸縮應用程序的支持和進一步滿足苛刻的企業需求這三個方面。Java EE 7 使得開發人員可以寫更少的樣板代碼,通過豐富的組件來提供一個完整、全面、集成的堆棧來支持和構建最新的 Web 應用程序和框架,同時提供更具擴展性、豐富性和簡易的功能。企業將會從便捷式批處理、改進的擴展性等新功能中獲益。本文將通過對這個版本中新增組件 WebSocket 1.0、JSON Processing 1.0、JAX-RS 2.0、JSF 2.2 和 JMS 2.0 的介紹及若干示例的展示,來對以上三個特性進行詳細的剖析。


Java EE 作為一個企業應用的部署平臺,具有很好的健壯性、能夠提供強大的 Web 服務且非常易于部署。這些年來,通過其不斷發展,它已大大簡化了以服務器為中心的應用程序的開發、部署和管理,已經逐漸成為企業級開發的通用標準。

1999 年,Sun 正式發布了 J2EE 的第一個版本。但從 1999 年誕生的第一個 J2EE 版本一直到 J2EE 1.4 版本,雖然它已經具有了強大的功能,但仍不太被人們接受。這是因為連實現一個簡單的 J2EE 程序,都需要大量的配置文件,非常不便使用。在 2002 年,J2EE 1.4 推出后,復雜程度更是達到了頂點,尤其是 EJB 2.0,開發和調試的難度非常大。

2006 年 5 月份 Sun 正式發布了 J2EE 1.5(現改名為 Java EE 5)規范,Java EE 5 的主基調為“簡化開發”。即讓開發者能夠更方便、高效地使用 Java EE 技術。從 Java EE 5 開始,通過引入注釋、EJB 3.0 的業務組件、更新的 Web 服務和加強的持久化模型,將重心轉移到提高開發人員的生產力上來。

Java EE 6 進一步簡化開發流程,增加平臺的靈活性,從而更好地解決輕量級 Web 應用程序。此外,Java EE 6 開始與開源架構進行無縫集成,并對現有的技術做了精簡。實踐證明,Java EE 6 取得了巨大成功,成功的原因主要有下面幾點:

  • 截至 2013 年 5 月,已有超過 50 萬人次從 Oracle 和其他行業的產商下載 Java EE 組件;
  • 是企業開發人員的第一選擇;
  • 是應用開發平臺的第一選擇;
  • 18 家應用服務器供應商以最快的速度兼容 Java EE 不同版本。
圖 1. Java EE 7 新特性
Java EE 7 新特性簡介

Java EE 7 擴展了 Java EE 6,利用更加透明的 JCP 和社區參與來引入新的功能,如圖 1(本圖引用自 Java 官網)所示,主要包括加強對 HTML5 動態可伸縮應用程序的支持、提高開發人員的生產力和滿足苛刻的企業需求。

1、提高開發人員的生產力

通過一個緊密集成的平臺簡化了應用架構,減少樣板代碼和加強對注釋的使用來提高效率,另外借助標準 RESTful Web 服務對客戶端的支持提高了應用程序的可移植性。

2、加強對 HTML 5 動態可伸縮應用程序的支持

基于其可擴展的基礎架構,Java EE 7 推動了對 HTML 5 應用的構建和支持。在新的平臺中,借助具有行業標準的 JSON 簡化了數據分析和交換,并通過低延遲和雙向通信的 WebSockets 減少了響應時間。以及利用改進的 JAX-RS 2.0 更好地支持異步的、可擴展的、高性能的 RESTful 服務,從而更好地支持多用戶的并發操作。

3、滿足苛刻的企業需求

為更好地滿足企業的需求,Java EE 7 提供了許多新功能:

  • 細化批處理作業,形成可管理的區塊,以實現不間斷的 OLTP 性能;
  • 簡化多線程并發任務的定義,以提高可擴展性;
  • 以及提供具有選擇性和靈活性的事務應用程序等。

Java EE 7 開發的開放性,使得 Java 社區、供應商、組織和個人都能參與其中。19 個來自世界各地的用戶組,包括來自北美、南美、歐洲和亞洲,都參與了“采用 JSR”計劃,提供了寶貴的反饋意見和代碼示例以驗證 Java 規范 (JSR) 的 API。

在最新發布的 Java EE 平臺中都大大簡化了訪問集裝箱服務的 API,同時大大拓寬了服務范圍。Java EE 7 繼續秉承了簡化性和高效性的趨勢,并進一步拓寬了平臺范圍。下面就針對 Java EE 7 的三大新特性進行詳細的剖析。

提高開發人員的生產力

從 Java EE 5 開始,重心就一直放在提高開發人員的生產力上。這對于 Java 開發者來說非常重要,因為這使得使用 Java EE 進行開發更加便捷,更重要的是能夠滿足快速管理和生產的需求。鑒于此,Java EE 7 大大提高了開發人員的生產力。首先,減少了編寫大量核心業務邏輯所需要的樣板代碼。其次,該平臺引入更多的注釋 POJOS 來降低 XML 配置的復雜性。最后,Java EE 7 使用更緊密集成的技術,提供一個更加無縫的開發體驗。

減少冗余代碼

Java EE 7 一直在致力于減少在核心業務邏輯代碼運行前必須執行的樣板代碼。減少樣板代碼的三大核心區域是默認資源、JMS 2.0 和 JAX-RS 客戶端 API。默認資源是一個新的功能,要求平臺提供商預配置一個默認的數據源和一個默認的 JMS 連接工廠。這可以讓開發人員直接使用默認的資源而無需進行額外的定義。JMS2.0 在可伸縮性和可移植性上經歷了重大的改進,減少了冗余代碼,已運用在無數的產品部署上,事實證明它是一個良好的規范,能夠較好地滿足企業的需求。

更多帶注釋的POJO

通過注釋 Java EE 使開發人員更專注于 Java 對象的編程而無需關注繁瑣的配置。

CDI 現在默認情況下已不需要使用 beans.xml 文件就可以直接使用。開發人員可以不需要任何配置而是簡單的使用 @Inject 來注入任何 Java 對象。包括新的資源注釋 @JMSDestinationDefinition 和 @MailSessionDefinition ,使得開發人員在源代碼中就可以指定元數據資源,簡化了 DevOps 體驗。

更緊密集成的平臺

Java EE 6 引入了 Managed Beans 1.0 作為第一步來朝著 EJBs、JSF Managed Beans 和 CDI beans 發展。Java EE 7 繼承了這一點,例如,對 JSF Managed Beans 進行了改進來更好支持 CDI Beans。Java EE 7 為平臺引入了易用的 EJB 容器管理事物,使用基于 CDI 攔截器的解決方案來保證事務可用在 CDI managed beans 和其它 Java EE 組件中,把注釋 @Transactional 應用到任何 CDI bean 或者任何支持事務的方法中。

Bean Validation 在 Java EE 7 中使用廣泛,現在可以用于方法級別的驗證,包括內置和自定義的約束。約束可被應用于方法的參數以及返回值。約束也可以使用靈活渲染和違反約束的字符串格式的 Java EE 的表達語言。

Bean Validation 也延伸到 JAX-RS 2.0。注釋約束可以應用到公共構造函數的參數、方法參數、字段和 bean 的屬性。此外,他們還可以修飾資源類、實體參數和資源的方法。例如,約束可以通過 @ POST 和 @ PUT 應用于 JAX-RS 方法參數來驗證表單提交的數據。

通過精簡現有技術來簡化Java EE

Java EE 7 中新增加了許多新的特性,有些老的特性和功能已經被更簡單的特性所替代或直接棄用。Java EE 6 為過時技術的棄用和功能的修剪引入了一個正式的流程,以下的 API 在 Java EE 7 中已成可選,但在 Java EE 8 中將會被移除:

  • Java EE Management (JSR-77),原本是用于為應用 服務器創建監控管理的 API,可各大供應商對此 API 熱情并不高漲;
  • Java EE Application Deployment (JSR-88),JSR 88 是當初用于 J2EE 應用程序在應用 服務器上進行配置和部署的標準 API 。可是該 API 始終沒有得到眾供應商的支持;
  • JAX-RPC,是早期通過 RPC 調用和 SOAP web services 進行交互的編程模型。由于 Web services 成熟后從 RPC 模型中分離出來,被更加健壯和具備更多特性的 JAX-WS API 所替代;
  • EJB 2.x Entity Beans CMP,復雜、笨重、過度復雜的 EJB2.* 的 Entity Bean 模型已經被 Java EE 5 的基于 POJO 的流行輕量級 JPA 持久層模型所代替。

對 HTML 5 動態可伸縮應用程序的支持

HTML5 是包括 HTML、JavaScript 和 CSS3 在內的一套技術組合,它加快了開發人員創建高度互動的應用程序的步伐。開發出的應用程序都是以高度互動的方式提供實時的數據,如聊天應用程序,比賽實況報 導等,并且這些應用程序只需要編寫一次,就可以應用在桌面、移動客戶端等不同設備上,具有非常好的跨平臺性。這些高度動態的應用程序,使得用戶可以在任何 地點任何時間進行訪問,從而對服務器端向客戶端傳送數據的規模提出了更高的要求。Java EE 7 在更新現有技術如 JAX-RS 2.0、Java Server Faces 2.2、和 Servlet 3.1 NIO 基礎上,又借助新的應用技術 WebSockets 和 JSON 處理為支持動態應用程序 HTML5 奠定了堅實的基礎。

低延遲數據交換:Java API for WebSocket 1.0

越來越多的 web 應用程序依賴于從中央服務器及時獲取并更新數據。基于 HTTP 的 WebSockets 為解決低延遲和雙向通信提供了一種解決方案。在 WebSocket API 的最基層是一個帶注釋的 Java 對象(POJO),如清單 1 所示:

清單 1. 帶注釋的 Java 對象(POJO)

 @ServerEndpoint("/test") 
 public class TestEndpoint{ 
 @OnOpen 
     public void onOpen(...){ } 
 @OnClose 
     public void onClose(...){ } 
     @OnError 
 public void onError(...){ } 
 @OnMessage 
 public void testMessage(String message,...){ } 
 }

通過注釋 @ServerEndpoint 來指定一個 URI。諸如客戶端連接、接收消息和客戶端斷開這樣的回調函數都可以用注釋來指定。WebSocket API 的最基層支持發送和接收簡單文本和二進制信息。API 的簡單性也使得開發人員可以快速入門。

當然,功能豐富的應用擁有更復雜的需求,因此需要支持對最基礎的網絡協議進行控制和自定義,而 WebSocket API 正好能夠滿足以上需求。另外,WebSocket 利用現有 Web 容器的安全特性,開發人員只需付出較少的代價就可以建立良好的保密通信。

簡化應用數據分析和處理:Java API for JSON Processing 1.0

JSON 作為一個輕量級的數據交換格式被應用在許多流行的 Web 服務中用來調用和返回數據。許多流行的在線服務都是使用基于 JSON 的 RESTful 服務。在 Java EE 7 之前,Java 應用程序使用了不同的類庫去生成和解析 RESTful 服務中的 JSON 對象。然而,現在這個功能已被標準化。

通過 Java API 中的 JSON Processing 1.0,JSON 處理過程標準化為一個單一的 API,應用程序不需要使用第三方的類庫。這樣使得應用程序更小更簡便。同時 API 包括了支持任何轉換器和生成器實現的插件,使得開發人員可以選擇最好的實現方式去完成工作。

可擴展的RESTful服務:JAX-RS 2.0

JAX-RS 2.0 增加了異步響應處理,這對于支持對數據有著高要求的 HTML5 客戶端的擴展是至關重要的。異步處理是一種更好更有效利用線程處理的技術。在服務器端,處理請求的線程在等待外部任務去完成時應該避免阻塞,從而保證在這 一時間段內到達的其他請求能夠得到響應。

同樣的,在客戶端,一個發出請求的線程在等待響應的時候也會發生阻塞,這影響了應用程序的性能。新的 JAX-RS 2.0 異步客戶端 API 使得客戶端調用 RESTful 可以和其他客戶端活動并行執行。異步的好處是使得一個客戶端可以同時調用多個后臺服務,對于一個使用者來說減少了總體的延遲時間。

同時為了增強 RESTful 服務,JAX-RS 2.0 開發人員可以使用過濾器和實體攔截器。這樣開發人員就可以使用標準的 API 來實現過濾和攔截功能,使開發過程變得更加便捷和高效。

增強開發的易用性:JSF 2.2

JavaServer Faces (JSF) 是一種用于構建 Web 應用程序的 Java 新標準框架。它提供了一種以組件為中心來開發 Java Web 用戶界面的方法,從而簡化了開發。在這個版本中,JSF 增加了對 HTML5 的支持。JSF 2.2 增加了一個叫“pass-through elements”的新功能。并為現有的元素增加了一系列的新屬性,如輸入元素“tel”、“range”和“date”等。不幸的是,現有的 JSF 組件不能識別這些新的屬性,因此 JSF 應用程序會忽略這些屬性不能進行使用,直到創建專有的解決方案。對于“pass-through elements”,JSF 渲染器將會忽略這些元素,只是把它們傳給支持 HTML5 的瀏覽器,這使得可以利用現有的 JSF 組件來利用 HTML5 的特性來正常渲染。

JSF 引入了一個新的 pass-through 命名空間 http://xmlns.jcp.org/jsf/passthrough 映射到“p:”,任何組件的 name/value 對都可以以“p:” 開始,然后傳給瀏覽器。如清單 2 所示,HTML 5 “type=color”不需要 JSF 組件的任何解析就可以傳遞給瀏覽器。

 <h:inputText Value=”#{bean.color}” P:type=”color” />

HTML5 的動態性使得服務器端處理信息更新的請求不斷增多。在 Java EE 6,Servlet 異步 I/O 通過移除“一個請求需要一個線程”的限制,使一個線程可以處理多個并發請求。這可以使 HTML5 客戶端快速得到響應。但是,如果服務器端讀取數據的速度比客戶端發送的速度要快,那么可能會由于緩慢的客戶端連接而不能提供更多的數據導致線程阻塞,這樣 就限制了擴展性。在 Java EE 7 中使用新的事件驅動 API Servlet 3.1 從客戶端讀取數據將不會造成阻塞。如果有數據可用時,Servlet 線程將會讀取和處理這些數據,否則就去處理其他請求。

滿足苛刻的企業需求

Java EE 十幾年來一直努力滿足企業的需求,使用 Java 連接器連接到企業服務端、使用 Java 事務支持事務處理、使用 Java 消息服務讓系統間可以進行相互通信。現在企業希望利用開發人員的 Java 技能編寫基于標準的 API 并能夠跨平臺運行的批處理應用程序。企業也需構建高度可擴展的應用來滿足更高的服務要求并提高現有資產的利用率。Concurrency Utilities 使得 Java EE 開發人員編寫可擴展的應用程序成為可能。

在Java平臺中,提高批處理應用程序的效率使開發過程變得更加便捷和高效

絕大部分的 Java EE 應用都是在線用戶驅動的系統,但同時有一些需要進行批處理的服務器端應用程序,尤其是離線分析和 ETL 等。這些面向批處理的應用程序是非交互式的、需要長時間運行,這些任務通常需要大量計算,同時可以按順序或者并行執行,并可以通過特定的事件啟動或者定時 調度。批處理較適合選擇閑置的時間進行處理,這樣可以有效利用計算機資源。

以前,對于批處理程序沒有標準的 Java 編程模型。現在,批處理應用程序為 Java 平臺提供了如圖 2 非常容易理解的模型。批處理過程包括任務、步驟、存儲庫、讀取 - 處理 - 寫入模式和工作流等。

如圖 2 所示,一個任務 job 代表一系列執行離散業務流程但又密切相關的步驟。步驟可以按順序或者并行執行。同時,在同一個工作流,當前步驟是可選的,基于前一步驟的運行結果決定當前 步驟將被執行或者跳過。另外,步驟可以根據實際的需要被重新執行。存儲庫 (repository) 存儲了當前任務的信息,比如任務的最后執行時間。通過操作員 (operator) 可以對任務進行排序、開始、停止、暫停和取消操作。

圖2. 用步驟描述工作
Java EE 7 新特性簡介

Java EE 8 展望

在 Java EE 7 發布后,開發人員對此似乎并不滿足,對 Java EE 8 的新特性提出了一些設想與展望:

  • 改進 CDI(Contexts and Dependency Injection for Java EE,上下文與依賴注入)。Java EE 8 應該支持所有 JSF 組件,包括轉換器和驗證器,以及 JASPIC 組件。
  • 更深入的修剪 Pruning()和 Deprecating(棄用)。應該延續 Java EE 6 和 Java EE 7 修剪與棄用的步伐,比如可以修剪 EJB 編程模型相關的所有東西。
  • 標準化的緩存 API。JCache 緩存 API 原本將包含在 Java EE 7 中,但由于該 API 錯過了重要的公共審查的最后期限,導致其沒能成為 Java EE 7 的一部分。
  • 平 臺范圍內的配置。Java EE 應用程序可以使用部署描述文件(比如 web.xml)進行配置,但該方法對于不同的開發階段(如 DEV、BETA、LIVE 等)來說比較麻煩,因為不同階段會對應不同的服務器,從而導致配置也要隨之改變。 期望 Java EE 8 能夠以一種徹底的、統一平臺的方式來解決這些配置問題。
  • 綜合的現代化的安全框架。在 Java EE 中,安全一直是一個棘手的問題。缺乏整體和全面的安全框架是 Java EE 的主要缺點之一,尤其是在討論或評估競爭框架(如 Spring)時,這些問題會被更多地提及。期望在 Java EE 8 中,能夠構建一個綜合的和現代化的安全框架。
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!