Java EE 8的前5个新功能
備受期待的Java Enterprise Edition 8版本擁有兩個激動人心的新API(JSON綁定1.0和Java EE Security 1.0)以及對當前API的改進(JAX-RS 2.1,Bean Validation 2.0,JSF 2.3,CDI 2.0,JSON-P) 1.1,JPA 2.2和Servlet 4.0)。 這是近四年來Oracle企業Java平臺的第一個版本,它包含數百個新功能,更新的功能和錯誤修復。 那么最好的新功能是什么? 我試圖在這篇博客文章中回答這個高度主觀的問題。
TL; DR的前5個新功能
全新的安全性API包含三個出色的新功能:標識存儲抽象,新的安全性上下文以及新的注釋驅動的身份驗證機制,使web.xml文件聲明過時。 這就是我今天要談論的最后一個。
JAX-RS 2.1中新的反應式客戶端包含反應式編程風格,并允許端點結果的組合。
新的JSON綁定API為JSON序列化和反序列化提供了本機Java EE解決方案。
CDI 2.0中有趣的新功能允許在Java SE應用程序中引導CDI。
Servlet 4.0中的服務器推送功能使Servlet規范與HTTP / 2保持一致。
你準備好了嗎? 因此,讓我們開始吧。
1.新的安全性API
可能,添加到Java EE 8中最重要的一項新功能就是新的安全性API。
此新API的主要動機是簡化,標準化和現代化跨容器和實現處理安全性問題的方式。 他們做得很好。
由于三個新的注釋使web.xml文件聲明變得多余,Web身份驗證的配置已實現現代化。 稍后再詳細介紹。
新的安全上下文 API標準化了Servlet和EJB容器執行身份驗證以及
新的身份存儲庫抽象可簡化身份存儲庫的使用。
因此,讓我們看一下其中的第一個。
注釋驅動的認證機制
此功能全部與配置Web安全有關。 web.xml文件中需要哪種傳統的XML聲明。
有了HttpAuthenticationMechanism接口,該接口代表HTTP身份驗證,并帶有三個內置的啟用CDI的實現,每個實現都可以表示可配置Web安全的三種方式之一,因此不再需要此操作。
使用這些注釋之一觸發它們。
@BasicAuthenticationMechanismDefinition @FormAuthenticationMechanismDefinition @CustomFormAuthenticationMechanismDefinition它們復制了servlet容器中已經可用的經典HTTP基本身份驗證,表單和基于自定義表單的身份驗證的功能。
例如,要啟用基本身份驗證, 僅需向您的servlet添加BasicAuthenticationMechanismDefinition批注即可。
@BasicAuthenticationMechanismDefinition(realmName="${'user-realm'}") @WebServlet("/user") @DeclareRoles({ "admin", "user", "demo" }) @ServletSecurity(@HttpConstraint(rolesAllowed = "user")) public class UserServlet extends HttpServlet { … }現在,您可以放棄XML配置,并使用這些新注釋之一來提高Web安全性。
2. JAX-RS 2.1:新的反應式客戶端
讓我們看一下JAX-RS 2.1中新的反應式客戶端,以及它如何包含反應式編程風格。
被動式方法以數據流的思想為中心,該模型具有一個執行模型,該模型可以在流中傳播更改。 一個典型的示例是JAX-RS方法調用。 當調用返回時,對方法調用的結果執行下一個操作(可能是繼續,完成或錯誤)。
您可以將其視為流程的異步管道 ,而下一個流程將對前一個流程的結果起作用,然后將其流程的結果傳遞給鏈中的下一個流程。 數據流是可組合的,因此您可以將許多流組合并轉換為一個結果。
通過在用于構造客戶端實例的Invocation.Builder實例上調用rx()方法來啟用反應式功能。 它的返回類型是帶有參數化響應類型的CompletionStage 。 Java 8中引入了CompletionStage接口,并提出了一些有趣的可能性。
例如,在此代碼段中,對不同的端點進行了兩次調用,然后將結果合并:
CompletionStage<Response> cs1 = ClientBuilder.newClient().target(".../books/history").request().rx().get();CompletionStage<Response> cs2 = ClientBuilder.newClient().target(".../books/geology").request().rx().get();cs1.thenCombine(cs2, (r1, r2) ->r1.readEntity(String.class) + r2.readEntity(String.class)).thenAccept(System.out::println);3.新的JSON綁定API
現在,讓我們繼續下一個重要功能。 新的JSON綁定API,此API為JSON序列化和反序列化提供了本機Java EE解決方案 。
以前,如果要在JSON上對Java進行序列化和反序列化,則必須依靠Jackson或GSON之類的第三方API。 不再。 使用新的JSON Binding API,您可以擁有所有可能希望本機可用的功能。
從Java對象生成JSON文檔再簡單不過了。 只需調用toJson()方法并將其要序列化的實例傳遞給它即可。
String bookJson = JsonbBuilder.create().toJson(book);將JSON文檔反序列化為Java對象也很簡單。 只需將JSON文檔和目標類傳遞給fromJson()方法,然后彈出您的Java對象。
Book book = JsonbBuilder.create().fromJson(bookJson, Book.class);但這還不是全部。
行為定制
通過注釋字段,JavaBeans方法和類,可以自定義默認的序列化和反序列化行為。
例如,您可以使用@JsonbNillable定制空處理,并使用@JsonbPropertyOrder注釋定制在類級別指定的屬性順序。 你可以指定與@JsonbNumberFormat()標注的數字格式,并與@JsonbProperty()注釋更改字段的名稱。
@JsonbNillable @JsonbPropertyOrder(PropertyOrderStrategy.REVERSE) public class Booklet {@JsonbProperty("cost")@JsonbNumberFormat("#0.00")private Float price;}或者,您可以選擇使用運行時配置構建器JsonbConfig來處理定制:
JsonbConfig jsonbConfig = new JsonbConfig().withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_DASHES).withNullValues(true).withFormatting(true);Jsonb jsonb = JsonbBuilder.create(jsonbConfig);無論哪種方式,JSON Binding API都為Java對象的序列化和反序列化提供了廣泛的功能。
4. CDI 2.0:在Java SE中使用
現在,讓我們繼續下一個API。 CDI 2.0 API。 此版本具有許多新功能,更有趣的功能之一是能夠在Java SE應用程序中引導CDI 。
要在Java SE中使用CDI,必須明確引導CDI容器。 這可以通過在SeContainerInitializer抽象類上調用靜態方法 newInstance() 來實現 。 它返回一個SeContainer實例,該實例是CDI運行時的句柄,您可以使用該實例執行CDI解析,如此代碼段所示。 它可以訪問BeanManager,它是CDI的核心入口點。
SeContainer seContainer =SeContainerInitializer.newInstance().initialize();Greeting greeting = seContainer.select(Greeting.class).get();greeting.printMessage("Hello World");seContainer.close();通過向CDI bean傳遞要檢索和使用的bean的類名,可以使用select()方法對其進行檢索。
配置選項
通過添加攔截器,擴展,替代品,屬性和裝飾器,可以對SeContext進行進一步的配置 。
.enableInterceptors() .addExtensions() .selectAlternatives() .setProperties() .enableDecorators()通過調用SeContainer上的close()方法來手動關閉容器,或者在使用try-with-resources結構時自動關閉容器,因為SeContainer擴展了AutoCloseable接口。
5. Servlet 4.0:服務器推送
最后但并非最不重要的一點是,Servlet 4.0中的服務器推送功能使Servlet規范與HTTP / 2保持一致。
要了解此功能,您首先需要知道什么是服務器推送。
什么是服務器推送?
服務器推送是HTTP / 2協議中的許多新功能之一,旨在通過將客戶端資源推送到瀏覽器的緩存中來預期客戶端資源需求,以便客戶端發送網頁請求并收到響應時返回從服務器上,它所需的資源已經在緩存中。 這是一項性能增強功能,可提高網頁加載速度。
它在Servlet 4.0中如何公開?
在Servlet 4.0中, 服務器Push功能通過從HttpServletRequest實例獲得的PushBuilder實例公開 。
看一下這個代碼片段。 您可以看到header.png的路徑是通過path()方法在PushBuilder實例上設置的,并通過調用push()將其推送到客戶端。 當該方法返回時,將清除路徑和條件標頭,以供構建器重用。 推送menu.css文件,然后將ajax.js javascript文件推送到客戶端。
protected void doGet(HttpServletRequest request, HttpServletResponse response) {PushBuilder pushBuilder = request.newPushBuilder();pushBuilder.path("images/header.png").push();pushBuilder.path("css/menu.css").push();pushBuilder.path("js/ajax.js").push();// Return JSP that requires these resources}到Servlet doGet()方法完成執行時,資源將到達瀏覽器。 從JSP生成HTML需要這些資源,由于它們已經是瀏覽器緩存,因此不需要從服務器請求它們。
結論
好吧,這是Java EE 8中最好的新功能,但是還有許多其他功能可以告訴您。
目前為止就這樣了。
翻譯自: https://www.javacodegeeks.com/2018/04/the-top-5-new-features-in-java-ee-8.html
總結
以上是生活随笔為你收集整理的Java EE 8的前5个新功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 画世界APP如何绘图 画世界APP绘图方
- 下一篇: 诺基亚C5-01说明书(诺基亚C5-03