Java EE 8的五大新特性详解

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/79802993 Java EE 8的五大新特性详解2018.4.3版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/79802993

Java EE 8的五大新特性详解

  • 2018.4.3
  • 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

Java EE 8带来了很多新特性,其中最好的新特性有下面五个。

备受期待的Java企业版第8版(Java EE 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企业平台,它包含数百个新特性、更新功能和错误修复。

新特性TOP 5

1、Java EE Security 1.0 API

提供了注释驱动的认证机制。这个全新的安全API包含三项出色的新功能:身份存储抽象、新的安全上下文以及新注释驱动的身份验证机制(使用web.xml配置文件进行声明的方式过时了)。

2、JAX-RS 2.1 API

新的响应式客户端。JAX-RS 2.1规范中定义了新型响应式客户端,它包含响应式编程风格并允许端点结果的组合。

3、JSON-Binding 1.0 API

新的JSON绑定API,为JSON序列化和反序列化提供了本地Java EE解决方案。

4、CDI 2.0规范

在Java SE中使用。在CDI 2.0中有趣的新功能是允许在Java SE应用程序中引导CDI。

5、Servlet 4.0规范

Servlet 4.0支持服务器推技术。这种推技术使得Servlet规范与HTTP/2协议保持了一致。

新的安全API

或许Java EE 8最重要的新特性就是新的安全API。发布这个新API的主要动机是简化,标准化和现代化跨容器和实现处理安全问题的方式。

  • Web身份认证的配置:已经实现了现代化,这要归功于三个使web.xml文件声明成为冗余的新注释。
  • 新的安全上下文:API标准化了Servlet和EJB容器执行认证的方式。
  • 新的I身份存储抽象简化了身份存储的使用。

注释驱动的认证机制

发布了3个关于配置网络安全的新注释。之前传统的方式是通过在web.xml配置文件中进行声明。

HttpAuthenticationMechanism接口,它代表了HTTP身份验证,并带有三个内置的启用CDI的实现,每个实现代表Web安全性可配置的三种方式之一。

3个新注释如下:

  • @BasicAuthenticationMechanismDefinition(基本身份认证机制定义)
  • @FormAuthenticationMechanismDefinition(表单身份认证机制定义)
  • @CustomFormAuthenticationMechanismDefinition(自定义表单身份认证机制定义)

例如,要启用基本认证,所有必要的是将BasicAuthenticationMechanismDefinition 注释添加Servlet,如下:

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

开发者可以丢弃XML配置,并使用其中一个新注释来驱动网络安全。

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);

新的JSON绑定API

新的JSON绑定API为JSON序列化和反序列化提供了本地Java EE解决方案。

以前,如果想要对JSON进行序列化和反序列化,就必须依赖Jackson、GSON、FastJson等第三方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);

其中的设计哲学来自于Gson库。但这并非全部。

行为自定义

可以通过注释字段、JavaBean方法和类来自定义默认的序列化和反序列化行为。

例如,可以使用@JsonbNillable自定义null处理,在类级别使用@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绑定API都为Java对象的序列化和反序列化提供了广泛的功能。

CDI 2.0规范

在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();

通过在select()方法中传递CDI Bean的类名来取回CDI Bean,以便检索和使用。

配置选项

更多的配置可以使用SeContext通过添加拦截器、扩展、替代、属性或装饰器来进一步配置。

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

由于SeContainer继承了AutoCloseable接口,故当使用try-with-resources结构时,可通过在SeContainer调用close()方法手动地或自动地关闭容器。

Servlet 4.0规范

Servlet 4.0规范中定义了服务器推送功能,以便于HTTP/2协议保持一致。要理解这个特性,你首先需要知道服务器推送是什么。

什么是服务器推送

服务器推送是HTTP/2协议中的新特性之一,旨在通过将服务器端的资源推送到浏览器的缓存中来预测客户端的资源需求,以便当客户端发送网页请求并接收来自服务器的响应时,它需要的资源已经在缓存中。这是一项提高网页加载速度的性能增强的功能。

如何在Servlet 4.0公开服务器推送

在Servlet 4.0中,服务器推送功能是通过PushBuilder实例公开的,此实例是从HttpServletRequest实例中获取的。

看下面这个代码片段,可以看到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需要这些资源,但不需要从服务器请求它们,因为它们已经在浏览器的缓存中。

目录
相关文章
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
65 2
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
41 3
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
33 2
|
2月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
34 3
|
2月前
|
安全 Java API
Java 17新特性让你的代码起飞!
【10月更文挑战第4天】自Java 8发布以来,Java语言经历了多次重大更新,每一次都引入了令人兴奋的新特性,极大地提升了开发效率和代码质量。本文将带你从Java 8一路走到Java 17,探索那些能让你的代码起飞的关键特性。
83 1
|
2月前
|
编解码 Oracle Java
java9到java17的新特性学习--github新项目
本文宣布了一个名为"JavaLearnNote"的新GitHub项目,该项目旨在帮助Java开发者深入理解和掌握从Java 9到Java 17的每个版本的关键新特性,并通过实战演示、社区支持和持续更新来促进学习。
82 3
|
20天前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
29 4
|
2月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
66 3
|
2月前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
25 2
|
2月前
|
Java 开发者
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
31 6