Java2Days會議是東歐的主要活動,目的是介紹Java開發的最新趨勢。 今年,該活動于10月25日至26日在保加利亞的索非亞舉行。 我在那里,并有機會與一些SAP的同事一起品嘗了一些最新的Java,云和移動內容,這些內容已直接發送到我的家鄉城市。
我已經連續第二年訪問此活動。 今年,它更大了,其中包括“免費技術培訓”等新內容。 還有一場競賽(開放至11月11日),其中涉及一些很酷的編程問題。
在這篇博客文章中,我想分享我參加的一些會議的簡短摘要,這些筆記是基于我的筆記以及后來我做的一些其他研究得出的。
- JavaEE.Next(): Reza Rahman 撰寫的Java EE 7、8和Beyond
- 使用GlassFish,Grizzly和JSR 356構建HTML5 / WebSocket應用程序 ,作者Reza Rahman
- Reza Rahman撰寫的Java EE 6域驅動設計
JavaEE.Next():Java EE 7、8及更高版本
在會議開幕式上,Oracle的Java EE / GlassFish傳播者Reza Rahman介紹了即將于明年三月/四月發布的即將發布的Java EE第七版的主要更改,以及對Java的一瞥。 EE8。我們了解到對Java EE 8的支持已推遲到Java EE 8,并且對各種更改進行了概述,例如對JMS,WebSocket和HTML 5支持進行了大修,用于JSON處理的標準API,下一版JAX-RS,緩存API等。
JMS 2.0
新版本的Java消息服務(JMS)當前正在作為JSR 343開發,它對將近5年前發布的現有JMS 1.1進行了一些重大改進。 它引入了新的消息傳遞功能,例如批處理傳遞和傳遞延遲,以及對JMS API的一些更改,以使其更易于使用,例如新的批注和依賴項注入。 使用新的API,發送消息實際上涉及注入上下文,查找隊列,最后是單個方法調用,并動態創建所有需要的對象:
@Inject
private JMSContext context;@Resource(mappedName = "jms/inboundQueue")
private Queue inboundQueue;public void sendMessage(String payload) {context.createProducer().send(inboundQueue, payload);
}
另請參見JMS 2.0早期草案 。
WebSocket的Java API
用于WebSocket的Java API( JSR 356 )是Java EE 7首次引入的新規范。它具有用于WebSocket的服務器端API和客戶端API,具有兩種編程風格和聲明性風格。 有關更多信息,請參見下面有關此主題的專門會議的摘要。
JSON處理的Java API
JSON處理的Java API( JSR 353 )也是一個新規范,它具有解析,生成,轉換和查詢JSON內容的功能。 它同時具有對象模型和流API,類似于XML世界中的DOM和StAX。 將來,類似于JAXB ,還將有將JSON綁定到Java對象的方法,但是目前,這仍然不屬于此JSR的范圍。 另請參閱JSON-P:JSON處理的Java API 。
JAX-RS 2.0
下一版本的RESTful Web服務Java API(JAX-RS)的主要新增功能是標準的客戶端API,以及新功能,例如消息過濾器和處理程序,實體攔截器,異步處理,超媒體支持和通用配置。 另請參見JAX-RS 2.0早期草案解釋 。
Java緩存API
Java緩存API( JSR 107 )已經失去了近10年的歷史,并且最終將成為Java EE的一部分。 它引入了標準API和注釋,用于存儲和從緩存中檢索對象。 該API非常簡單,例如,將客戶對象放入緩存中將涉及類似于以下代碼:
public class CustomerDao {@CachePut(cacheName = "customers")public void addCustomer(@CacheKeyParam int cid, @CacheValue Customer customer) {...}
}
其他Java EE 7功能
- JPA 2.1增加了內置的模式生成,包括索引,對存儲過程的支持以及其他增強功能。
- JTA 1.2引入了對EJB外部聲明式事務的支持以及@
TransactionScoped
注釋。 - JSF 2.2引入了更好HTML5支持,包括JSF頁面中HTML5孤島以及將HTML5輸入類型綁定到JSF Bean,以及其他注釋,例如
@FlowScoped
和@ViewScoped
,CDI對齊等。 - Java EE的批處理是一個新規范,它引入了一個API,用于基于作業的批處理,該作業包括步驟,每個步驟都涉及讀取,處理和寫入項目。 除了實現接口之外,可以將讀取,處理和寫入項目的方法簡單地標注為
@ReadItem
,@ProcessItem
和@WriteItem
- Bean Validation 1.1引入了方法約束和可注入工件。
Java EE 8
JavaEE的第8版預計將于Java EE 7于2015年發布2年。它將重點關注以下領域:
- 云,PaaS,多租戶
- 基于拼圖的模塊化
- 更好HTML5支持
- 更多CDI和EJB對齊
- NoSQL(?)
摘要
在45分鐘內確實吞沒了很多信息,但發言人在傳達這些信息方面做得很好。 看來Java EE 7將是該系列的堅實補充,而Java EE 8將具有更多主要功能。
本次會議的幻燈片可在此處獲得 。 您可以通過下載GlassFish 4試用這些新功能。 要保持最新狀態,您可以關注The Aquarium博客。
使用GlassFish,Grizzly和JSR 356構建HTML5 / WebSocket應用程序
實際上,這是最后一次會議,Reza Rahman在會議上介紹了即將到來的Java EE 7的一個非常有趣的部分,即對WebSocket的支持。
WebSocket入門
通過半雙工HTTP協議進行雙向通信一直是一個挑戰。 已經引入了服務器推送的方式,例如輪詢,長輪詢或AJAX,但它們復雜,效率低下且浪費。
相比之下, WebSocket通過單個TCP套接字提供雙向全雙工通信通道。 但是,與純TCP不同,所有通信都是通過標準HTTP端口(例如80)完成的,這使其可以在使用防火墻阻止非標準Internet連接的環境中工作。 它最初是作為HTML 5的一部分提出的。
W3C定義了一個非常簡單的WebSocket JavaScript API和一個WebSocket協議 。 該協議定義了“握手”和“框架”,其中握手定義了如何將普通的HTTP連接升級為WebSocket連接,而框架則定義了消息的有線格式。 API定義了用于打開和關閉連接以及以各種方式發送消息的方法。 當前所有主要瀏覽器都支持它。
WebSocket的Java API
Java EE 7通過用于WebSocket的Java API( JSR 356 )引入了WebSocket支持。 該參考實現稱為Tyrus,它是GlassFish 4的一部分。該規范定義了兩種不同的API風格–針對客戶端和服務器的基于接口的編程和基于注釋的聲明。
聲明性API過于簡單,對開發人員完全隱藏了WebSocket內部。 以最簡單的形式,可以如下定義WebSocket端點:
@WebSocketEndpoint("/hello")
public class HelloBean {@WebSocketMessagepublic String sayHello(String name) {return "Hello " + name;}
}
有以下注釋:
-
@WebSocketEndpoint
是一個類級別的批注,它聲明一個POJO來接受WebSocket消息。 在此批注中指定了接受消息的路徑。 可選地,它也可以指定解碼器,編碼器和子協議。 -
@WebSocketMessage
是方法級別的注釋,用于端點接收消息時調用的方法。 從此方法返回的值將發送回另一端。 -
@WebSocketOpen
和@WebSocketClose
是用于攔截連接打開和關閉事件的方法級注釋。 -
@WebSocketError
是用于在對話期間攔截錯誤的方法級注釋。 -
@WebSocketParam
是作為參數傳遞的路徑段的參數級注釋。
摘要
WebSocket似乎確實是當前使用的服務器推送方法的更好替代方案,因此很高興JavaEE即將推出對此的支持。
本次會議的幻燈片可在此處獲得 。 Slideshare也提供了類似的演示文稿, 用Java構建HTML5 WebSocket應用程序 。
Java EE 6的域驅動設計
Reza Rahman的第三次Java EE研討會重點討論了域驅動設計(DDD) 。 這是一種通過將實現與不斷發展的模型連接來開發軟件的方法。 它的前提是將項目的主要精力放在核心領域和領域邏輯上,并基于領域模型進行設計。 這個詞最早是由埃里克·埃文斯(Eric Evans)在他的同名書中創造的。 DDD強調返回面向對象的分析和設計,并逐漸取代J2EE Blue Prints最初流行的傳統體系結構而逐漸流行。 會議的目的是通過將Java EE 6的核心概念映射到Java EE規范,并提供一個全面的代碼示例,來演示如何使用Java EE 6實現DDD。
核心概念
- 領域 :知識領域(本體論),影響或活動。
- 模型 :描述領域選擇方面的抽象系統,可用于解決與該領域相關的問題。
- 無處不在的語言 :一種圍繞領域模型構造的語言,所有團隊成員都在使用。
- 上下文 :單詞或陳述出現的設置,用于確定其含義。
建筑模塊
下圖是域驅動設計的“規范圖像”。
- 實體 :不是由其屬性定義的對象,而是由連續性及其標識來定義的對象。
- 值對象 :包含屬性但沒有概念標識的對象。
- 集合 :由根實體(否則稱為集合根)綁定在一起的對象的集合。
- 服務 :當操作在概念上不屬于任何對象時。
- 存儲庫 :用于檢索域對象的方法應委托給專門的存儲庫對象。
- Factory :用于創建域對象的方法應委托給專門的Factory對象。
維護模型完整性(策略性DDD)
層數
用戶界面:顯示用戶信息并接收輸入。
- 應用程序 :薄層以協調應用程序活動。 此層中沒有業務邏輯或業務對象狀態。
- 域 :所有業務對象及其狀態都位于此處。 域層中的對象應該不關心顯示或持久保存自身。
- 基礎結構 :處理諸如持久性之類的內務處理任務的對象。
將DDD映射到Java EE
DDD概念/層 | Java EE概念 |
---|---|
語境 | 包裝,模塊化 |
UI層 | JSF,Servlet |
服務,應用層 | EJB,CDI |
實體,值對象,存儲庫 | JPA(實體),CDI |
基礎設施層 | JPA(實體管理器API),JMS |
樣品申請
在此期間進行演示的示例應用程序是SourceForge已提供的DDD示例的改進 。 這是一個Shipping Tracker應用程序。 該應用程序的包裝結構清楚地揭示了上述不同的層。 經過翻新的DDD示例應用程序將作為java.net項目盡快發布。 在此之前,您可以下載并使用現有的DDD示例,該示例是使用Maven構建的,可以在嵌入式Jetty中運行,當然也可以導入Eclipse以進行更深入的了解。
摘要
我發現DDD非常有趣,盡管起初有點難以理解。 Reza詳細解釋了所有內容,但是這縮短了演示和顯示示例應用程序代碼的時間。 我和我的同事對示例中的業務邏輯是在Domain層類本身中捕獲的,而沒有任何Facade的控制器感到驚訝。 最初,這對我來說似乎是一種不尋常的方法,但盡管如此,其次它還是很合理的。
本次會議的幻燈片可在此處獲得。 會議后研究DDD時,我發現了以下有趣的資源:
- 快速域驅動設計 ,一個簡短,易讀的摘要以及DDD基礎知識簡介。
- JavaWorld(2009)中的文章, 使用Java EE 6進行域驅動的設計 。
- 域驅動設計社區 。
參考: Java2Days 2012:來自JCG合作伙伴 Stoyan Rachev的Java EE ,位于Stoyan Rachev的Blog博客上。
翻譯自: https://www.javacodegeeks.com/2012/11/java2days-2012-java-ee.html