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个新功能

  1. 新的安全性API:注释驱动的身份验证机制
    全新的安全性API包含三个出色的新功能:标识存储抽象,新的安全性上下文以及新的注释驱动的身份验证机制,使web.xml文件声明过时。 这就是我今天要谈论的最后一个。
  2. JAX-RS 2.1:新的反应式客户端
    JAX-RS 2.1中新的反应式客户端包含反应式编程风格,并允许端点结果的组合。
  3. 新的JSON绑定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保持一致。

你准备好了吗? 因此,让我们开始吧。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言实用算法系列之二级指针用法简介

一、几个知识点 内存四区&#xff1a;栈、全局&#xff08;静态&#xff09;&#xff0c;常量区&#xff0c;除此以外剩余的空间暂时不能随意使用&#xff1b;除此以外剩余的空间只要通过malloc函数申请一下&#xff0c;就可以使用了&#xff1b;申请一个堆上的单个int变量的方…

C语言实用算法系列之行指针

代码 #include <stdio.h>void Test(double (*a)[3]) {printf("sizeof(a)%d\n", sizeof(a));printf("sizeof(*a)%d\n", sizeof(*a));printf("sizeof(a[1])%d\n", sizeof(a[1])); }void main() {double ar[2][3] { {1.0,2.1,3.2},{4.3,5.4…

C语言实用算法系列之DOS传参“加减乘除计算器”

简介 主要采用str族函数实现字符检测&#xff0c;只能用DOS传参进行计算&#xff0c;详见运行结果。 代码 #include <stdio.h> #include <string.h> #include <stdlib.h>/* int main(int argc, char** argv) { int i0; printf("总共有%d条有效字符串…

ARP地址解析协议(深信服X计划)

文章目录一、ARP需求背景二、ARP概述及工作原理三、免费ARP概述及案例四、代理ARP概述及案例一、ARP需求背景 在以太网中&#xff0c;一个主机和另一个主机进行直接通信&#xff0c;必须要知道目标主机的MAC地址。单这个目标MAC地址是如何获得的呢&#xff1f;它就是通过ARP&a…

grails框架_Play和Grails Java框架的优缺点

grails框架框架通过为程序员提供一些有用的功能来简化应用程序开发过程。 由于开发人员的普遍使用&#xff0c;Java框架经常被开发人员使用。 您可以在市场上找到各种Java开发框架。 新手开发人员经常在论坛上发布一个常见问题&#xff1a;“哪种Java框架是最好的&#xff1f;”…

TCP和UDP协议(深信服X计划)

文章目录一、TCP协议概述二、TCP三次握手和四次挥手三、UDP协议概述四、TCP和UDP对比及应用场景一、TCP协议概述 TCP (Transmission Control Protocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由ETF的RFC 793定义。在简化的计算机网络O…

C语言实用算法系列之时间族函数、目录遍历

时间族函数测试 代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <stdlib.h> #include <time.h>void main() {time_t tt;//long __int64time(&tt);tm* time localtime(&tt);char* ws[] { "日","一","…

跟踪反应流–将Spring Cloud Sleuth与Boot 2结合使用

Spring Cloud Sleuth在OpenZipkin Brave的基础上增加了对Spring工具的支持&#xff0c; 从而使Spring Boot应用程序的分布式跟踪变得异常简单。 这是一篇关于如何使用此出色的库添加对分布式跟踪支持的简要说明。 考虑两个应用程序–一个使用上游服务应用程序的客户端应用程序…

DNS域名解析协议(深信服X计划)

文章目录一、DNS协议背景二、DNS协议概述三、DNS工作原理四、DNS常用的记录及作用一、DNS协议背景 在Internet网中连接着数量众多的主机&#xff0c;要让这些主机进行通信&#xff0c;需要有一套名字标识体系&#xff0c;让主机之间能够彼此找到对方&#xff0c;我们可以用多种…

基于51单片机的温度检测监测报警系统设计

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发生关键词&#xff1a;单片…

rest 验证demo_如何实现REST资源的输入验证

rest 验证demo如何实现REST资源的输入验证 我正在使用的SaaS平台具有一个RESTful接口&#xff0c;该接口可以接受XML有效负载。 实施REST资源 对于像我们这样的Java商店&#xff0c;使用JAX-B从XML Schema生成JavaBean类是有意义的。 在像Jersey的JAX-RS环境中&#xff0c;使…

校园点餐系统:点餐、食堂管理、商户管理和菜品管理(Java和MySQL)

微信公众号&#xff1a;创享日记 发送关键词&#xff1a;校园点餐系统 获取报告数据库设计说明项目源码源文件工程文件 1 实验环境 操作系统&#xff1a;Windows 10&#xff0c;主要开发工具&#xff1a;PowerDesign&#xff0c;MySQL&#xff0c;Eclipse 2 实验过程 2.1 系统…

病情预测:指示病情程度、预测病情指标(深度学习和Python)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;病情…

邮件系统(基于SMTP协议和POP3协议-C语言实现)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;邮件…

arp、ethernet、icmp、udp、ip协议的C语言实现(计算机网络协议栈实验)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;协议…

CPU设计(单周期和流水线)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;cpu …

前馈-反馈控制系统设计(过程控制课程设计matlab/simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;前馈…

感应电机直接转矩控制系统的设计与仿真(运动控制matlab/simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;直接…

双容水箱液位模糊PID控制系统设计与仿真(Matlab/Simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;双容模糊 获…

基于单片机步进电机控制器设计(正转反转指示灯挡位)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;单片机步进…