进阶– Java EE 7前端5强

ee-7概述 系列继续。 在初步概述和Arjan关于最重要的后端功能的文章之后 ,我现在非常高兴让Ed Burns( @edburns )使用他最喜欢的Java EE 7前端功能完成本系列。

感谢Markus Eisele让我有机会在他非常受欢迎的博客上发表帖子。 我和Markus的关系可以追溯到2010年左右,但我还没有来宾发布的乐趣。 Markus要求我介绍Java EE 7 Web层。 由于EE 7是非常成熟的平台的成熟版本,因此已经发布了很多有关它的信息。 我不会重述以前发生的事情,而是要就我认为重要的方面和每个方面的高级概述给出自己的看法。

如果您想了解更多有关第一手的知识,请考虑参加我在JavaLand 2016上的全日培训。我正在与现代金融和HTML5专家Oliver Szymanski一起进行培训。 有关详细信息,
请访问javaland网站 。

首先,从历史角度看。 Markus要求我写有关Java EE 7 Web层的文章。 让我们看看这个术语,也称为“ Web层”或“表示层”。 如果要相信围绕微服务等新概念的炒作,该术语本身就听起来有点过时,因为它暗示了一个三层体系结构,另外两层是“业务逻辑”,

“持久性”。 当然,三层还不够微观,对吗? 嗯,随着企业随着职责分配以寻求通过其软件实现最大业务价值的修补,这些层之间的界限变得越来越模糊。 无论如何,Java EE一直是Java平台的高度集成的企业技术集合,它使用基于共识的开放式开发实践(Java Community Process或JCP)进行了演进,并得到了主要利益相关者的实质性参与。 该平台的“ Web层”实际上只是在开发整体解决方案的“ Web层”时可能会有用的一组技术。 这是一个很大的清单:

  • WebSocket 1.0 JSR-356
  • JavaServer Faces 2.2 JSR-344
  • Servlet 3.1 JSR-340
  • JSON处理1.0 JSR-353
  • REST(JAX-RS)2.0 JSR 339
  • Bean验证1.1 JSR-349
  • 上下文和依赖注入1.1 JSR-346
  • Java 1.0 JSR-330的依赖项注入
  • Java EE 1.0 JSR-236的并发实用程序
  • 表达式语言3.0 JSR-341

出于本博客条目的目的,让我们看一下前五个:WebSocket,JSF,Servlet,JSON和JAX-RS。 尽管后五种无疑是专业Web层的必备要素,但查看它们超出了本博客条目的范围。

WebSocket

JSF和WebSocket是仅有的两个与W3C HTML5规范直接相关的Java EE 7规范。 对于WebSocket,实际上有三个不同的标准主体在起作用。 网络套接字WebSocket由IETF的RFC-6455指定。 WebSocket

W3C将JavaScript API指定为HTML5的子规范。 WebSocket Java API由JCP在JSR-356下指定。 在WebSocket的所有方面,重点是提供基于消息的可靠的全双工客户端-服务器连接。

通过JSR-356,您可以在Java SE和EE应用程序的客户端和服务器功能中使用WebSocket。

在服务器端,它允许您公开WebSocket终结点,以便浏览器可以使用其对WebSocket JavaScript API和网络协议的现有支持来连接到该终结点。 您可以通过注释一些POJOS或强制性地从Java代码(例如从ServletContextListener)调用引导API来向系统声明端点。 建立连接后,服务器可以从/向发生的任何数量的客户端发送和接收消息

同时连接。 运行时将自动处理连接设置和拆除。

WebSocket Java客户端API通过提供与W3C JavaScript WebSocket API的Java类似物,允许Java SE应用程序与WebSocket端点(Java或其他)对话。

Java Server Faces(JSF)

在JSF 2.2中,我们添加了许多新功能,但是在这里我将仅介绍其中的三个。

HTML5友好标记使您能够以几乎纯净HTML(必须格式正确)编写JSF页面,而无需使用某些人认为笨拙且难以理解的XML名称空间。 这是可能的,因为基础HTML Basic JSF RenderKit(来自JSF 1.0)提供了所有必要的原语,以采用任意的映射约定。

相应的JSF UIComponent的一部分HTML标记。 例如,这是有效的JSF表单

<form jsf:id="form"><input jsf:id="name" type="tel" jsf:value="#{complex.name}" /><progress jsf:id="progress" max="3" value="#{complex.progress}" /></form>

唯一的问题是需要通过使用命名空间属性将元素标记为JSF组件。 这意味着您必须在<html>标记中至少声明一个名称空间:

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"xmlns:jsf="http://xmlns.jcp.org/jsf">

Faces Flows是ADF Task Flows和Spring Web Flow中页面流概念的标准化。 流使您能够将具有某种逻辑连接并且需要共享状态的页面组合在一起。 流定义了一个逻辑作用域,该逻辑作用域在进入流时变为活动状态,并在退出流时可用于垃圾回收。 有多种丰富的语法可用于描述流程,如何输入,退出,如何相互关联,相互传递参数,

和更多。 由于在上下文和依赖注入(CDI)之上实现了流功能,因此提供了许多便利。 流可以打包为jar文件,并包含在您的Web应用程序中,从而实现Web应用程序各部分的模块化。

正如流程启用行为模块化一样,资源库合同(RLC)启用外观模块化。 RLC提供了一个非常灵活的蒙皮系统,该系统基于Facelets构建,并允许您将皮肤包装在jar文件中,从而有效地使外观模块化。

Servlet

Servlet 3.1中最重要的新功能是对非阻塞IO的附加支持。 它基于Servlet 3.0(来自Java EE 6)的主要功能:async io。 反应式编程的Swift兴起表明Java应用程序再也无法承受阻止IO的麻烦了。 反应式编程的四个关注点是:响应性,弹性,弹性和事件基础是在此前提下建立的。 在Servlet 3.1中非阻塞IO之前,很难避免在Servlet应用程序中阻塞。

基本思想是允许Servlet运行时在可以安全完成IO而不会阻塞的情况下回调您的应用程序。 这可以通过新的侦听器接口ReadListener和WriteListener来实现,它们的实例可以在ServletInputStream和ServletOutputStream上的方法中注册。

当您将此功能添加到Servlet 3.0中添加的async-io功能时,可以编写基于Servlet的应用程序,这些应用程序可以自豪地显示“ We Are Reactive”的标志。

JSON格式

从外部角度来看,使用Java解析和生成JSON的能力当然并不是什么新鲜事物。 甚至在Java EE 7之前,都有许多解决方案可以满足这一基本需求。 遵循标准不是为了创新而是要在现有思想上赋予特殊地位的原则,Java EE 7中的JSON支持提供了使用简单的Java API解析和生成JSON的功能。 可以使用JsonParser以流方式进行读取,也可以使用JsonReader以批量方式进行读取。 可以使用JsonGenerator以流方式完成编写。 可以使用JsonBuilderFactory和JsonWriter以批量样式进行编写。

JAX-RS

很难夸大REST对面向非最终用户的软件的现代企业软件开发实践的重要性。 我要说的是,人们去javadoc(或JSDoc或appledoc等)学习如何使用API​​的日子已经一去不复返了。 如今,如果您

企业API没有公开为RESTful Web服务,您甚至可能不会考虑。 JAX-RS是在Java中完成REST的方式。 自Java EE 6起,JAX-RS就成为Java EE的一部分,但在Java EE 7中得到了2.0的待遇。2.0中的主要功能包括:

  • 客户支持:我认为,此功能最有用的应用是使用JUnit对RESTful服务进行自动化测试,而不必依靠持续集成带来的麻烦。 当然,您也可以将其用于服务到服务的交互。
  • 与JSON的无缝集成:在大多数情况下,HTTP方法端点上的简单@Produces(“ application / json”)注释足以输出JSON。 JSON格式的数据也将以Java易于使用的格式自动提供给您。
  • 异步支持(再次处于响应状态):此功能使您能够执行生成对另一个线程的响应所需的处理,从而允许原始线程立即返回,因此不会发生阻塞。 异步线程准备就绪后可以自由响应。

自然,这只会刮擦Java EE 7 Web层的表面。 有关更多详细信息,一个不错的起点是正式的Java EE 7 启动网络研讨会 。

希望在JavaLand见到您!

谢谢Ed抽出宝贵时间写这篇文章。 如果现在还不是时候使用Java EE 7,那么下面是一些帮助您开始使用JBoss EAP 7和WildFly的资源:

  • EAP 7 Alpha和Java EE 7入门
  • 带有JBoss工具的OpenShift 3上的Java EE 7应用程序
  • GitHub上的Java EE 7示例
  • JBoss EAP 7快速入门

翻译自: https://www.javacodegeeks.com/2016/01/refresher-top-5-java-ee-7-frontend.html

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

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

相关文章

一杯水怎么测试_一杯水就能鉴别翡翠真假的高招

大家好&#xff0c;小生有礼&#xff01;鄙人是秋玉蝉珠宝的杨杨&#xff0c;很高兴能在茫茫互联网中相识就是有缘。先简单介绍一下秋玉蝉珠宝&#xff0c;我们是年轻的品牌&#xff0c;我们的理念一直秉承坚持做真翡翠&#xff0c;好翡翠&#xff0c;把握翡翠的精髓&#xff0…

php连接mysql_PHP连接MySQL数据库的三种方式

本篇文章给大家介绍一下PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)&#xff0c;结合实例形式分析了PHP基于mysql、mysqli、pdo三种方式连接MySQL数据库的相关操作技巧与注意事项。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助…

idea内置junit5_JUnit的内置Hamcrest Core Matcher支持

idea内置junit5在通过JUnit和Hamcrest改善对assertEquals的文章中&#xff0c;我简要讨论了Hamcrest “ 核心 ”匹配器与JUnit的现代版本“结合”在一起的情况。 在那篇文章中&#xff0c;我特别关注了JUnit的assertThat&#xff08;T&#xff0c;Matcher&#xff09;静态方法与…

jenkins 发送邮件模板

jenkins 发送邮件模板 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>${ENV, var"JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title> </head><body leftmargin"8" marginwidth"…

Oracle Spring Clean JavaFX应该吗?

我们确实在Codename One上依赖JavaFX&#xff0c;我们的模拟器需要它。 我们的桌面版本使用它&#xff0c;而我们的设计器工具基于Swing。 我们希望它成功&#xff0c;这对我们的业务至关重要&#xff01; 即使您是Java EE开发人员并且不关心桌面编程&#xff0c;我们也不是一个…

laravel mysql 锁表_Laravel中MySQL的乐观锁与悲观锁

MySQL/InnoDB的加锁&#xff0c;是一个老生常谈的话题。在数据库高并发请求下&#xff0c;如何兼顾数据完整性与用户体验的敏捷性是一代又一代程序员一直在思考的问题。乐观锁乐观锁之所以叫乐观&#xff0c;是因为这个模式不会对数据加锁。而是对数据操作保持一种乐观的心态&a…

mysql 超长记录_谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)...

【问题】最近查看MySQL的error log文件时&#xff0c;发现有很多服务器的文件中有大量的如下日志&#xff0c;内容很长(大小在200K左右)&#xff0c;从记录的内容看&#xff0c;并没有明显的异常信息。有一台测试服务器也有类似的问题&#xff0c;为什么会记录这些信息&#xf…

glassfish发布应用_Arquillian 1.0.0.Final正式发布! 准备使用GlassFish和WebLogic! 所有虫子死亡!...

glassfish发布应用红帽公司和JBoss社区今天宣布的1.0.0.Final发布的Arquillian &#xff0c;其屡获殊荣的建在Java虚拟机&#xff08;JVM&#xff09;运行测试平台。 Arquillian大大减少了编写和执行Java中间件集成和功能测试所需的工作。 它甚至使测试工程师能够解决以前认为无…

使用ADF列表视图的主从数据

最近&#xff0c;从UI角度来看&#xff0c;ADF Faces 表组件不再被认为很酷。 对于显示数据集合&#xff0c; 列表视图今天应该很酷。 这并不意味着我们根本不应该使用af&#xff1a;table 。 在某些情况下&#xff08;经常是:)&#xff09;&#xff0c;表比列表视图更适合。 但…

java 调用私有方法_公开调用私有Java方法?

java 调用私有方法我们是Java开发人员&#xff0c;在Java中已知4种访问修饰符&#xff1a;私有&#xff0c;受保护&#xff0c;公共和包。 好吧&#xff0c;除了私有以外&#xff0c;最后三个可以通过继承&#xff0c;相同的包或实例从类外部调用。 现在&#xff0c;常见的问题…

港航环境变化引起的错误解决方法

1.serlvet API缺少&#xff0c;pom.xml中引入坐标&#xff1b; 2.web.xml中出现错误&#xff0c;将所有的filter调到filtermapping上面去&#xff1b; 3.依赖导入完成后项目依然有红叉&#xff0c;右击项目Propreties->myeclipse->Project Facets->java换成1.6就可以了…

flutter 国际化_从0开始设计Flutter独立APP | 第二篇: 完整的国际化语言支持

鉴于Flutter高性能渲染和跨平台的优势&#xff0c;闪点清单在移动端APP上&#xff0c;使用了完整的Flutter框架来开发。既然是完整APP&#xff0c;架构搭建完全不受历史Native APP的影响&#xff0c;没有历史包袱的沉淀&#xff0c;设计也能更灵活和健壮。国际化语言的支持&…

将旧版本从Java EE 5减少到7

Java EE 5于2005年首次引入&#xff0c;而Java EE 7于2013年问世。这两个版本之间有7年的差距&#xff0c;从技术角度来说&#xff0c;这就像一个世纪。 许多组织仍然对使用Java EE 5感到困惑&#xff0c;并且有很多正当理由选择不升级。 不过&#xff0c;如果您考虑一些前进的…

sql插入临时表数据的方法

方法有两种&#xff0c;主要看需求。 方法1&#xff1a;定义好临时表的字段和类型、插入对应的值 create table #Tmp --创建临时表#Tmp (City varchar(50), --Country varchar(50), -- );insert #Tmp select 北京,中国 union select 东京,日本 union select 纽约,美国 se…

gulp

1.gulp是什么&#xff1f; gulp是前端开发过程中一种基于流的代码构建工具&#xff0c;是自动化项目的构建利器&#xff1b;她不仅能对网站资源进行优化&#xff0c;而且在开发过程中很多重复的任务能够使用正确的工具自动完成&#xff1b;使用她&#xff0c;不仅可以很愉快的编…

往vxe-table添加渲染器怎么添_赚大了!飘窗上装书桌,加扇折叠窗,等于为家里又多添一间房...

阅读本文前&#xff0c;请您先点击上面蓝色字体&#xff0c;再点关 注这样您就可以继续免费收到文章注&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系我们进行删除&#xff0c;谢谢&#xff01; …

【六大排序详解】中篇 :选择排序 与 堆排序

选择排序 与 堆排序 选择排序 选择排序 与 堆排序1 选择排序1.1 选择排序原理1.2 排序步骤1.3 代码实现 2 堆排序2.1 堆排序原理2.1.1 大堆与小堆2.1.2 向上调整算法2.1.3 向下调整算法 2.2 排序步骤2.3 代码实现 3 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#…

java中contains的用法_java容器中所有接口和类的用法

我这里讲一下如何下载java的api文档还有就是容器和容器之间进行的操作每一个地方称之为一个节点&#xff0c;每一个节点包含了3部分(上一个节点&#xff0c;下一个节点&#xff0c;以及我们自己的数据部分)需要多个线程共享的时候通过键对象来找值对象1 java中的length属性是针…

lcs文本相似度_具有LCS方法的通用文本比较工具

lcs文本相似度常见的问题是检测并显示两个文本的差异&#xff08;尤其是几百行或几千行&#xff09;。 使用纯java.lang.String类方法可能是一种解决方案&#xff0c;但是对于此类操作最重要的问题是&#xff0c;“性能”将不能令人满意。 我们需要一种有效的解决方案&#xff…

MySQL--开发技巧(一)

Inner Join: Left Outer Join: Right Outer Join: Full Join: Cross Join&#xff1a; SELECT t1.attrs ,t2.attrs FROM t1 CROSS JOIN t2 使用Join更新表&#xff1a; UPDATE table1 SET attr2 WHERE attr1 IN (SELECT table2.attr1 FROM table1 INNER JOIN table2 ON tab…