中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Java EE8的五大最新特性

2018-07-26    來源:importnew

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用

備受期待的 Java Enterprise Edition 8 發(fā)布了兩個(gè)令人興奮的全新 API (JSON-Binding 1.0 和 Java EE Security 1.0),并改進(jìn)了現(xiàn)有的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 的企業(yè)級(jí) Java 平臺(tái)近四年以來第一次發(fā)布新版本,其中包含了數(shù)百項(xiàng)新特性、功能升級(jí)和錯(cuò)誤修復(fù)。

哪些新特性是最棒的?我試圖在這篇文章中回答這個(gè)非常主觀的問題。

摘要:五大新特性

  1. ?新的安全 API:注解驅(qū)動(dòng)型的認(rèn)證機(jī)制。這個(gè)全新的安全API包含了三個(gè)優(yōu)秀新功能:身份儲(chǔ)存的抽象層,新的安全上下文,以及一個(gè)注解驅(qū)動(dòng)型的認(rèn)證機(jī)制——這使得用 web.xml 文件聲明的方式過時(shí)了。最后一個(gè)功能我們將會(huì)在今天講到。
  2. JAX-RS 2.1:?新的響應(yīng)式客戶端。JAX-RX 2.1 中新的響應(yīng)式客戶端,融合了響應(yīng)式編程風(fēng)格,允許組合端點(diǎn)結(jié)果。
  3. 新的 JSON 綁定 API。新的 JSON 綁定 API,為 JSON 的序列化和反序列化提供了一個(gè)原生的 Java EE 解決方案。
  4. CDI 2.0:? Java SE 中使用CDI。CDI 2.0 中的這個(gè)有趣的新功能允許在 Java SE 中引導(dǎo) CDI。
  5. Servlet 4.0: 服務(wù)器推送。Servlet 4.0 中的服務(wù)器推送功能使得 servlet 規(guī)范和 HTTP/2 保持一致。

準(zhǔn)備好了么?我們開始吧。

1、新的安全 API

Java EE 8 添加的新安全 API 可能是最重要的新特性之一。

這個(gè)新 API 的主要?jiǎng)訖C(jī)是簡(jiǎn)化、標(biāo)準(zhǔn)化及現(xiàn)代化跨容器和跨實(shí)現(xiàn)的安全問題處理方式。現(xiàn)有成效,盡如人意。

  • Web 認(rèn)證的配置因?yàn)槿齻(gè)新的注解而實(shí)現(xiàn)了現(xiàn)代化,web.xml 從此變得冗余。具體稍后再說。
  • 新的安全上下文 API 標(biāo)準(zhǔn)化了 servlet 和EJB 容器執(zhí)行身份驗(yàn)證的方式。
  • 新的身份儲(chǔ)存抽象層簡(jiǎn)化了身份儲(chǔ)存的使用。

讓我們仔細(xì)看看這些新增功能中的第一個(gè)。

注解驅(qū)動(dòng)型的認(rèn)證機(jī)制

這個(gè)功能主要用于配置 Web 安全。舊的方式要求在 web.xml 文件中聲明。

得益于?HttpAuthenticationMechanism?接口,我們不必再使用舊方式。HttpAuthenticationMechanism?接口代表了一個(gè) HTTP 身份驗(yàn)證,并附帶了三個(gè)內(nèi)置的 CDI 支持的實(shí)現(xiàn),每個(gè)實(shí)現(xiàn)都代表了可配置的三種 Web 安全方式之一。

使用以下的注解之一觸發(fā)特定的實(shí)現(xiàn)。

@BasicAuthenticationMechanismDefinition
@FormAuthenticationMechanismDefinition
@CustomFormAuthenticationMechanismDefinition

它們復(fù)制了 servlet 容器中已有的傳統(tǒng) HTTP 基本認(rèn)證,表單和基于表單的自定義認(rèn)證功能。

舉個(gè)例子來說,若要啟用基本認(rèn)證,所要做的僅是把?BasicAuthenticationMechanismDefinition?注解添加到你的 servlet 中。

@BasicAuthenticationMechanismDefinition(realmName="${'user-realm'}")
@WebServlet("/user")
@DeclareRoles({ "admin", "user", "demo" })
@ServletSecurity(@HttpConstraint(rolesAllowed = "user"))
public class UserServlet extends HttpServlet { ... }

現(xiàn)在你可以拋棄 XML 配置,并使用上面的注解來驅(qū)動(dòng) Web 安全了。

2、JAX-RS 2.1:新的響應(yīng)式客戶端

讓我們來看看 JAX-RS 2.1 中新的響應(yīng)式客戶端,以及它是怎么融合響應(yīng)式編程風(fēng)格的。

響應(yīng)式方法的核心概念是數(shù)據(jù)流以及一個(gè)通過流來傳播變化的執(zhí)行模型。一個(gè)典型的例子是 JAX-RS 的方法調(diào)用。當(dāng)調(diào)用返回時(shí),將在方法調(diào)用的結(jié)果上執(zhí)行下一個(gè)操作(可能是繼續(xù),完成或錯(cuò)誤)。

你可以將其視作:數(shù)據(jù)變成了一個(gè)異步的進(jìn)程管道,后一個(gè)進(jìn)程根據(jù)前一個(gè)進(jìn)程的結(jié)果執(zhí)行,然后將其進(jìn)程的結(jié)果傳遞給鏈中的下一個(gè)進(jìn)程。組件化的流讓你得以組合和轉(zhuǎn)化多個(gè)流到一個(gè)結(jié)果中。

通過調(diào)用?rx()Invocation.Builder?實(shí)例中用于構(gòu)造客戶端實(shí)例的方法,以此啟用響應(yīng)式的功能。此方法返回一個(gè)攜帶 Response 類型的?CompletionStage 實(shí)例。?CompletionStage 接口在 Java 8 中引入,并提出了一些有趣的可能性。

例如,在這個(gè)代碼片段中,兩個(gè)調(diào)用是對(duì)不同的端點(diǎn)進(jìn)行的,然后將結(jié)果合并:

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

現(xiàn)在讓我們來看看下一個(gè)優(yōu)秀的新特性。新的 JSON 綁定 API為 JSON 的序列化和反序列化提供了一個(gè)原生的 Java EE 解決方案。

在此之前,如果你想對(duì) JSON 進(jìn)行序列化和反序列化,則必須依賴類似 Jackson 或是 GSON 這樣的第三方 API。現(xiàn)在不一樣了,使用新的 JSON 綁定 API,你可能需要的所有功能都有了原生支持。

從 Java 對(duì)象生成一個(gè) JSON 文檔非常簡(jiǎn)單。只需要調(diào)用?toJson() 方法,并傳遞你想要序列化的實(shí)例即可。

String bookJson = JsonbBuilder.create().toJson(book);

將 JSON 文檔反序列化為 Java 對(duì)象也同樣簡(jiǎn)單。只需要將 JSON 文檔和目標(biāo)類傳遞給 fromJson 方法,即可獲得 Java 對(duì)象。

Book book = JsonbBuilder.create().fromJson(bookJson, Book.class);

但其功能不止于此。

行為定制

可以通過注解字段,JavaBean 方法和類來自定義默認(rèn)的序列化和反序列化行為。

例如,你可以使用?@JsonbNillable?來自定義空處理和?@JsonbPropertyOrder 注解來自定義在類級(jí)別指定的屬性順序。 也可以使用?@JsonbNumberFormat() 注解指定數(shù)字格式,并使用?@JsonbProperty() 注解更改字段的名稱。

@JsonbNillable
@JsonbPropertyOrder(PropertyOrderStrategy.REVERSE)
public class Booklet {
  @JsonbProperty("cost")
  @JsonbNumberFormat("#0.00")
  private Float price;
}

或者,你可以選擇使用運(yùn)行時(shí)自定義構(gòu)建器 JsonbConfig 來處理自定義:

JsonbConfig jsonbConfig = new JsonbConfig()
     .withPropertyNamingStrategy( PropertyNamingStrategy.LOWER_CASE_WITH_DASHES)
     .withNullValues(true)
     .withFormatting(true);
Jsonb jsonb = JsonbBuilder.create(jsonbConfig);

無論哪種方式,JSON 綁定 API 都為 Java 對(duì)象的序列化和反序列化提供了廣泛的功能。

4、CDI 2.0:在 Java SE 中使用CDI

現(xiàn)在讓我們繼續(xù)看下一個(gè)API。 CDI 2.0 API。該版本擁有許多新功能,其中一個(gè)較為有趣的功能是在 Java SE 應(yīng)用程序中引導(dǎo) CDI 的能力。

要在 Java SE 中使用 CDI,必須明確引導(dǎo) CDI 容器。這是通過調(diào)用?SeContainerInitializer?抽象類的靜態(tài)方法 newInstance()?來實(shí)現(xiàn)的。此方法返回一個(gè)?SeContainer?實(shí)例,該實(shí)例是 CDI 運(yùn)行時(shí)的句柄,你可以使用該實(shí)例執(zhí)行 CDI 解析,如代碼片段中所示。它可以訪問 BeanManager,是 CDI 的核心入口點(diǎn)。

SeContainer seContainer =
       SeContainerInitializer.newInstance().initialize();
Greeting greeting = seContainer.select(Greeting.class).get();
greeting.printMessage("Hello World");
seContainer.close();

傳遞想要檢索和使用的 bean 的類名給?select()?方法,以此檢索 CDI bean。

配置選項(xiàng)

可以添加 Interceptors, Extensions, Alternatives, Properties, 和 Decorators 來進(jìn)一步配置?SeContext?。

.enableInterceptors()
.addExtensions()
.selectAlternatives()
.setProperties()
.enableDecorators()

在?SeContainer 上調(diào)用?close()?方法手動(dòng)關(guān)閉容器,因?yàn)?SeContainer?擴(kuò)展了?AutoCloseable?接口,也可以使用?try-with-resources?結(jié)構(gòu)自動(dòng)關(guān)閉容器。

5、Servlet 4.0:服務(wù)器推送

最后,Servlet 4.0 中的服務(wù)器推送功能。這使得 servlet 規(guī)范和HTTP/2 保持一致。

為了理解這個(gè)特性,你首先需要知道服務(wù)器推送是什么。

什么是服務(wù)器推送?

服務(wù)器推送是HTTP/2協(xié)議中的許多新功能之一,旨在通過預(yù)測(cè)客戶端資源需求,將這些資源推送到瀏覽器的緩存中,客戶端發(fā)送網(wǎng)頁請(qǐng)求并接收服務(wù)器的響應(yīng)時(shí),它需要的資源已經(jīng)在緩存中。這是一項(xiàng)提高網(wǎng)頁加載速度的性能增強(qiáng)功能。

這一功能在 Servlet 4.0 中是如何暴露的?

在 Servlet 4.0 中,服務(wù)器推送功能通過?PushBuilder?實(shí)例暴露,該實(shí)例從?HttpServletRequest?實(shí)例中獲得。

看看這段代碼片段。你可以看到,通過?path()?方法在?PushBuilder?實(shí)例上設(shè)置了?header.png?的路徑,并通過調(diào)用?push() 將其推送到客戶端。當(dāng)方法返回時(shí),路徑和條件頭將被清除,以便構(gòu)建器重用。接著將?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()?方法執(zhí)行完畢時(shí),資源將會(huì)到達(dá)瀏覽器。從JSP生成的HTML需要這些資源,但不必從服務(wù)器請(qǐng)求它們,因?yàn)樗鼈円呀?jīng)是瀏覽器緩存了。

原文鏈接: dzone 翻譯: ImportNew.com - enigma
譯文鏈接: http://www.importnew.com/29189.html
[ 轉(zhuǎn)載請(qǐng)保留原文出處、譯者和譯文鏈接。]

關(guān)于作者: enigma

查看enigma的更多文章 >>

標(biāo)簽: 安全 代碼 服務(wù)器

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:去投資銀行面試會(huì)遇到的10個(gè)Java問題

下一篇:CmlPHP V2.8.3 發(fā)布,快速穩(wěn)定易維護(hù)的 PHP 框架