標籤:ajax on() demo 程式 http 應用 cos order eol
備受期待的 Java Enterprise Edition 8 發布了兩個令人興奮的全新 API (JSON-Binding 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 平台近四年以來第一次發布新版本,其中包含了數百項新特性、功能更新和錯誤修複。
哪些新特性是最棒的?我試圖在這篇文章中回答這個非常主觀的問題。
摘要:五大新特性
新的安全 API:註解驅動型的認證機制。這個全新的安全API包含了三個優秀新功能:身份儲存的抽象層,新的安全上下文,以及一個註解驅動型的認證機制——這使得用 web.xml 檔案聲明的方式過時了。最後一個功能我們將會在今天講到。
JAX-RS 2.1: 新的響應式用戶端。JAX-RX 2.1 中新的響應式用戶端,融合了響應式編程風格,允許組合端點結果。
新的 JSON 綁定 API。新的 JSON 綁定 API,為 JSON 的序列化和還原序列化提供了一個原生的 Java EE 解決方案。
CDI 2.0: 在 Java SE 中使用CDI。CDI 2.0 中的這個有趣的新功能允許在 Java SE 中引導 CDI。
Servlet 4.0: 伺服器推送。Servlet 4.0 中的伺服器推送功能使得 servlet 規範和 HTTP/2 保持一致。
準備好了嗎?我們開始吧。
1、新的安全 API
Java EE 8 添加的新安全 API 可能是最重要的新特性之一。
這個新 API 的主要動機是簡化、標準化及現代化跨容器和跨實現的安全問題處理方式。現有成效,盡如人意。
Web 認證的配置因為三個新的註解而實現了現代化,web.xml 從此變得冗餘。具體稍後再說。
新的安全上下文 API 標準化了 servlet 和EJB 容器執行身分識別驗證的方式。
新的身份儲存抽象層簡化了身份儲存的使用。
讓我們仔細看看這些新增功能中的第一個。
註解驅動型的認證機制
這個功能主要用於配置 Web 安全。舊的方式要求在 web.xml 檔案中聲明。
得益於 HttpAuthenticationMechanism 介面,我們不必再使用舊方式。HttpAuthenticationMechanism 介面代表了一個 HTTP 身分識別驗證,並附帶了三個內建的 CDI 支援的實現,每個實現都代表了可配置的三種 Web 安全方式之一。
使用以下的註解之一觸發特定的實現。
@BasicAuthenticationMechanismDefinitionbr/>@FormAuthenticationMechanismDefinition
它們複製了 servlet 容器中已有的傳統 HTTP 基本認證,表單和基於表單的自訂認證功能。
舉個例子來說,若要啟用基本認證,所要做的僅是把 BasicAuthenticationMechanismDefinition 註解添加到你的 servlet 中。
@BasicAuthenticationMechanismDefinition(realmName="${‘user-realm‘}")br/>@WebServlet("/user")
@ServletSecurity(@HttpConstraint(rolesAllowed = "user"))
public class UserServlet extends HttpServlet { ... }
現在你可以拋棄 XML 配置,並使用上面的註解來驅動 Web 安全了。
2、JAX-RS 2.1:新的響應式用戶端
讓我們來看看 JAX-RS 2.1 中新的響應式用戶端,以及它是怎麼融合響應式編程風格的。
響應式方法的核心概念是資料流以及一個通過流來傳播變化的執行模型。一個典型的例子是 JAX-RS 的方法調用。當調用返回時,將在方法調用的結果上執行下一個操作(可能是繼續,完成或錯誤)。
你可以將其視作:資料變成了一個非同步進程管道,後一個進程根據前一個進程的結果執行,然後將其進程的結果傳遞給鏈中的下一個進程。組件化的流讓你得以組合和轉化多個流到一個結果中。
通過調用 rx()Invocation.Builder 執行個體中用於構造用戶端執行個體的方法,以此啟用響應式的功能。此方法返回一個攜帶 Response 類型的 CompletionStage 執行個體。 CompletionStage 介面在 Java 8 中引入,並提出了一些有趣的可能性。
例如,在這個程式碼片段中,兩個調用是對不同的端點進行的,然後將結果合并:
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為 JSON 的序列化和還原序列化提供了一個原生的 Java EE 解決方案。
在此之前,如果你想對 JSON 進行序列化和還原序列化,則必須依賴類似 Jackson 或是 GSON 這樣的第三方 API。現在不一樣了,使用新的 JSON 綁定 API,你可能需要的所有功能都有了原生支援。
從 Java 對象產生一個 JSON 文檔非常簡單。只需要調用 toJson() 方法,並傳遞你想要序列化的執行個體即可。
String bookJson = JsonbBuilder.create().toJson(book);
將 JSON 文檔還原序列化為 Java 對象也同樣簡單。只需要將 JSON 文檔和目標類傳遞給 fromJson 方法,即可獲得 Java 對象。
Book book = JsonbBuilder.create().fromJson(bookJson, Book.class);
但其功能不止於此。
行為定製
可以通過註解欄位,JavaBean 方法和類來自訂預設的序列化和還原序列化行為。
例如,你可以使用 @JsonbNillable 來自訂空處理和 @JsonbPropertyOrder 註解來自訂在類層級指定的屬性順序。 也可以使用 @JsonbNumberFormat() 註解指定數字格式,並使用 @JsonbProperty() 註解更改欄位的名稱。
@JsonbNillablebr/>@JsonbPropertyOrder(PropertyOrderStrategy.REVERSE)
@JsonbProperty("cost")
private Float price;
}
或者,你可以選擇使用運行時自訂構建器 JsonbConfig 來處理自訂:
JsonbConfig jsonbConfig = new JsonbConfig()
withPropertyNamingStrategy( PropertyNamingStrategy.LOWER_CASE_WITH_DASHES)
withNullValues(true)
withFormatting(true);
Jsonb jsonb = JsonbBuilder.create(jsonbConfig);
無論哪種方式,JSON 綁定 API 都為 Java 對象的序列化和還原序列化提供了廣泛的功能。
4、CDI 2.0:在 Java SE 中使用CDI
現在讓我們繼續看下一個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();
傳遞想要檢索和使用的 bean 的類名給 select() 方法,以此檢索 CDI bean。
配置選項
可以添加 Interceptors, Extensions, Alternatives, Properties, 和 Decorators 來進一步配置 SeContext 。
enableInterceptors()
addExtensions()
selectAlternatives()
setProperties()
enableDecorators()
在 SeContainer 上調用 close() 方法手動關閉容器,因為 SeContainer 擴充了 AutoCloseable 介面,也可以使用 try-with-resources 結構自動關閉容器。
5、Servlet 4.0:伺服器推送
最後,Servlet 4.0 中的伺服器推送功能。這使得 servlet 規範和HTTP/2 保持一致。
為了理解這個特性,你首先需要知道伺服器推送是什麼。
什麼是伺服器推送?
伺服器推送是HTTP/2協議中的許多新功能之一,旨在通過預測用戶端資源需求,將這些資源推送到瀏覽器的緩衝中,用戶端發送網頁請求並接收伺服器的響應時,它需要的資源已經在緩衝中。這是一項提高網頁載入速度的效能增強功能。
這一功能在 Servlet 4.0 中是如何暴露的?
在 Servlet 4.0 中,伺服器推送功能通過 PushBuilder 執行個體暴露,該執行個體從 HttpServletRequest 執行個體中獲得。
看看這段程式碼片段。你可以看到,通過 path() 方法在 PushBuilder 執行個體上設定了 header.png 的路徑,並通過調用 push() 將其推送到用戶端。當方法返回時,路徑和條件頭將被清除,以便構建器重用。接著將 menu.css 檔案,JavaScript 檔案 ajax.js 推送到用戶端。
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 EE8的五大最新特性