备受期待的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

Java EE 8的前5个新功能相关推荐

  1. java ee打印功能_Java EE 8的前5个新功能

    java ee打印功能 备受期待的Java Enterprise Edition 8版本具有两个令人兴奋的新API(JSON绑定1.0和Java EE Security 1.0),并且对当前API进行 ...

  2. Java JDK 11:现在可以使用所有新功能

    为什么80%的码农都做不了架构师?>>>    删除了CORBA,Java EE和JavaFX支持,但添加了十几个主要新功能 目录 哪里可以下载JDK 11 Java 11 JDK中 ...

  3. 官宣弃用Java 8!Kafka 3.0.0 新功能get

    作者 | Travis 来源 | OSC开源社区(ID:oschina2013) Apache Kafka 是一个分布式流平台,具有四个核心 API.借助这些 API,Kafka 可以用于以下两大类应 ...

  4. java-ee-api_刷新器-Java EE 7概览

    java-ee-api 随着红帽JBoss企业应用平台7(EAP 7)的迫在眉睫,甚至WebLogic Server刚刚获得Java EE 7认证,我认为现在应该是时候对Java Enterprise ...

  5. 复习者-Java EE 7概览

    随着红帽JBoss企业应用平台7(EAP 7)的出现,甚至最近刚刚通过Java EE 7认证的WebLogic服务器,我认为现在应该为您重新介绍Java Enterprise Edition 7的时候 ...

  6. Java EE 8停步不前:Java社区能否扭转乾坤?

    最近大家围绕Oracle对Java EE的承诺有很多顾虑.InfoQ上个月通过一篇Java EE守护者联盟的报道介绍了相关新闻.Pivotal公司Spring Data项目主管兼JPA 2.1专家组成 ...

  7. 改名之后的Java EE,现在有什么新进展?

    Jakarta EE正在为企业版Java开辟新的道路.在这篇文章中,Cesar Saavedra将解释为什么说Jakarta EE为企业版Java带来了新鲜的空气. \\ 首先,作为一名具有30年经验 ...

  8. Java 9幕后花絮:新功能从何而来?

    找出Java幕后发生的事情,以及新功能如何实现 在上一篇文章中,我们介绍了即将发布的Java 9版本的新功能和尚待解决的功能,并简要提到了将新功能添加到下一个版本之前要经历的过程. 由于此过程几乎影响 ...

  9. Java EE 8:社区想要什么?

    在进行了之前的两次社区调查之后,第一次调查于2013年12月发布,第二次调查于2014年1月发布,Oracle呼吁企业社区对Java EE 8进行第三次也是最后一次调查 .该调查的截止日期为2014年 ...

最新文章

  1. 突然想到一个可以减少fc层权重数的方法
  2. CodeForces - 484E Sign on Fence(主席树区间合并+二分)
  3. java地图 热力图,腾讯地图数据可视化之热力图
  4. 微信支付,redirect_uri域名与后台配置不一致,错误代码10003
  5. 视频分辨率和音频质量_高分辨率音频的声音是否比CD质量好?
  6. UVA722 LA5359 Lakes【DFS】
  7. 信息安全之程序实现简单替换加密,并用字母频率统计进行破解
  8. 拓端tecdat|R语言多维数据层次聚类散点图矩阵、配对图、平行坐标图、树状图可视化城市宏观经济指标数据
  9. Mac小白必备技巧4—Mac文件管理器需要的快捷键有什么?
  10. 京东p7员工 什么级别_阿里、腾讯、百度、华为、京东等大厂职级及薪资范围
  11. ForkJoinPool 详解
  12. 计算机专业怎样才能晋级正高级
  13. MyEclipse中maven项目中WEBROOT目录问题
  14. Android怎么查看手机中的本地数据库
  15. kubernets 集群搭建
  16. 计算中英文混合字符串长度
  17. 【红队APT】反朔源隐藏C2项目CDN域前置云函数数据中转DNS转发
  18. Escape character is ‘^]’什么意思?怎么使用telnet
  19. Terraria-新手常常忽略的小技巧,效率提升巨大
  20. 211大学计算机全国排名,全国211大学名单排名

热门文章

  1. mongodb如何实现更新一个字段的值为另外一个字段的值?
  2. 【LSB】图片隐写主体函数
  3. C++描述 国王给骑士发放金币 ||
  4. Python缩进的几个原则
  5. mybatis解决 1 字节的 UTF-8 序列的字节 1 无效
  6. 16-1 Redis分布式缓存引入与保存缓存功能实现
  7. android手机打电话src,【SPILL 百科】SRC:Android 系统的 48kHz 音讯输出限制
  8. 计算机视觉论文doc,嘉炬-计算机视觉论文资料.doc
  9. kali linux改中文_kali linux 2019.4设置为中文方法
  10. 多边形上点的顺序排序_一种寻找多边形视觉中心的新算法