Errai框架简介

Errai是Red Hat开发和维护的框架,旨在结合GWT和JEE世界的优点。 根据Red Hat的说法,Errai是基于GWT的框架,用于使用下一代Web技术构建富Web应用程序。 在此简单声明的背后,存在一种与GWT完全不同的开发方式,在下面的文章中,我们将了解原因。

官方文档建议了两种不同的方式来设置项目:

    1. 使用演示项目:

启动新项目的一种怪诞方法是克隆errai-tutorial:git clone
git@github.com:errai / errai-tutorial.git并使其适应您的项目需求。 实际上,https://github.com/errai/archetypes也有一个原型 ,但是从现在起已弃用。

    1. 使用Errai Forge插件。

JBoss Forge可描述为一种用于脚手架项目的CLI。 它可以使用附加组件进行扩展(其中有很多),因此它可以用于从头开始创建几乎任何类型的项目:Spring,JEE,Vaadin,GWT等。

forge --install org.jboss.errai.forge:errai-forge-addon,4.0.2.Final forgeproject-new --named errai-tutorial --topLevelPackage com.gwidgets.errai.tutorial --version1.0.0-SNAPSHOT --finalName "Errai Tutorial" --type war --buildSystem Mavenerrai-setup --version-select 4.0.2.Final --logical-module-name com.gwidgets.errai.tutorial --module-name ErraiTutorial

在应用命令之后,我们应该有一个名为“ errai-tutorial”的Errai项目的空支架。

本教程基于此处的项目: https : //github.com/gitgabrio/errai-tutorial 。 我们将遵循逐步的方法,其中每个步骤都对应一个分支。 要从一个步骤转到另一个步骤,
分支需要签出。 在这个项目中,我们利用了官方Errai教程中的一些类。

Errai框架非常适合使用JBoss Application Server(当前为WildFly版本10)。使用默认配置,在首次运行时,Maven将在本地存储库中下载WildFly zip发行版;否则,将不再运行。 然后,在构建过程中,它将在项目的构建目录(目标)中将其解压缩。 该应用程序将在此WildFly服务器的实例中运行,因此要配置它,您必须提供WildFly属性作为GWT插件的JVM参数:

<properties><errai.dev.context>${project.artifactId}</errai.dev.context>    <as.version>10.0.0.Final</as.version>   
<errai.jboss.home>${project.build.directory}/wildfly-${as.version}</errai.jboss.home><listening.address>127.0.0.1</listening.address></properties><plugin><groupId>org.codehaus.mojo</groupId><artifactId>gwt-maven-plugin</artifactId><version>${gwt.version}</version><executions><execution><goals><goal>compile</goal></goals></execution></executions><configuration><logLevel>INFO</logLevel><noServer>false</noServer><extraJvmArgs>-Xmx3096m-XX:CompileThreshold=7000 -Derrai.jboss.home=${errai.jboss.home}-Derrai.dev.context=${errai.dev.context}-Djboss.bind.address=${listening.address}</extraJvmArgs><server>org.jboss.errai.cdi.server.gwt.EmbeddedWildFlyLauncher</server>
<!--other configuration properties -->
</configuration>

Errai提供了可以通过所谓的功能启用的不同功能。 功能只是添加到pom的行家罐子。 您可以手动添加它们,但是,由于某些功能需要多个jar,因此最好在提供的教程中复制它们,或者甚至更好的是,使用以下命令(在Forge控制台内部)将它们与Forge添加:

errai-add-features --feature-select [name of the feature]
    • 错误消息:
git checkout messaging

此功能启用ErraiBus。 ErraiBus是用于与端点之间交换消息的消息传递系统的骨干。 端点可以在客户端或服务器端实例化,并且框架之间几乎没有区别:消息可以往返于任何一个。 给定主题的多个侦听器可能会收到发给该主题的消息。
端点注册自己以侦听给定主题,并将回调传递给MessageBus。

例如,在教程项目中,ReceiverMessagePanel类中有两个端点:

public static final String CLIENT_SUBJECT = "ClientSubject";public static final String VARIABLE_SUBJECT = "VariableSubject";private void subscriptions() {subscribe(CLIENT_SUBJECT);subscribe(VARIABLE_SUBJECT);}private void subscribe(String subject) {bus.subscribe(subject, message -> {String messageText = message.get(String.class, "text");logger.debug("Received " + messageText + " on " + subject);showReceived(subject, messageText);});}

每当将消息发送到CLIENT_SUBJECT或VARIABLE_SUBJECT时,都会调用该回调。 消息由JSON格式的String表示,并通过RequestDispatcher的实例发送。
为了发送消息,该框架提供了实用程序类MessageBuilder,它具有流畅的样式,允许创建消息并将其发送给给定的主题。
有多种选择,但最简单的选择如下:

MessageBuilder.createMessage().toSubject(HelloServerService.SERVER_SUBJECT).signalling().with("text", requestTextBox.getText()).noErrorHandling().sendNowWith(dispatcher)

这样,我们将向HelloServerService.SERVER_SUBJECT发送一条消息,该消息将包含具有给定String值的字段文本。 消息立即与给定的RequestDispatcher发送。

  • errai-cdi-integration:

Errai CDI包含JSR-299上下文和依赖注入规范的实现。 它本身也是Errai-IOC功能的扩展,因此添加CDI将自动添加IOC。 为了使此功能正常运行,您必须在每个目录的根目录中添加一个“ ErrayApp.properties”文件,该目录包含Errai应该知道其存在的类。 此外,我们将在web.xml中启用CDIServiceLocator:

<servlet><servlet-name>ErraiServlet</servlet-name><servlet-class>org.jboss.errai.bus.server.servlet.DefaultBlockingServlet</servlet-class><init-param><param-name>service-locator</param-name><param-value>org.jboss.errai.cdi.server.CDIServiceLocator</param-value></init-param><load-on-startup>1</load-on-startup></servlet>

此功能未实现所有JSR-299规范,但它增加了产生和使用事件的可能性,因此Bean可以在完全分离的同时进行交互。 ContactStorageServiceImpl和ReceiverEventPanel演示了事件的用法。 暂时忽略其他所有内容,让我们关注事件创建:

@Stateless
@Service
public class ContactStorageServiceImpl implements ContactStorageService  {@Inject@Operation(CREATE)private Event<ContactOperation> created;// other fields and methodspublic Response create(final ContactOperation contactOperation) {..// This event is delivered to call connected clients.created.fire(contactOperation);...}}

在此类内部,已注入Event <ContactOperation>(特定于CREATE操作类型); 在创建方法Event.fire中调用,这会将给定事件推送到上下文中。

ReceiverEventPanel:

public void onRemoteCreated(final @Observes @Operation(Operation.OperationType.CREATE) ContactOperation contactOperation) {}

@Observes注释会导致在事件发生时调用onRemoteCreated方法

(操作类型为CREATE)被触发。

  • 数据绑定
git checkout persistence

通过数据绑定,可以使用特定DTO类的数据自动填充用户界面中的字段。为此,应使用@Bindable对该类进行注释,并为其属性提供标准的getter / setter方法。 @Templated注释的ui Bean(请参阅下文)将使其字段与这些类的值自动同步。 在我们的示例中,Contact类将具有这样的注释,以便我们可以在单个类中实现所有堆栈(从客户端表示到服务器端持久性):

@Bindable
@Portable
@Entity
@NamedQueries({@NamedQuery(name = Contact.ALL_CONTACTS_QUERY, query = "SELECT c FROM Contact c ORDER BY c.id")
})
public class Contact
  • 导航:

此功能允许创建具有多个可标记页面的应用程序。 可以用@Page注释类,以指示其角色和路径,例如下面的ContactListPage,它被标记为应用程序的默认页面:

@Page(role = DefaultPage.class, path = "/contacts")
@Templated(value = "contact-page.html#contact-list", stylesheet = "contact-page.css")
public class ContactListPage

只有@Templated注释的类或实现(直接或间接)IsWidget的类可以具有@Page注释。其他注释用于在特定页面事件时调用方法:

将对象附加到NavigationPanel时,将调用@PageShown。

从NavigationPanel中删除对象时,将调用@PageHiding。

页面之间的导航可以使用“ org.jboss.errai.ui.nav.client.local.Navigation”类实现,该类提供了一些方法,例如:

Navigation.goTo([PAGE_NAME])

当然,Errai提供了许多工具来开发基于GWT的完整JEE应用程序。 除了所有的用户界面增强功能外,真正有趣的是代码的客户端和服务器端之间的“模糊”,特别是对于消息系统。使用MessageBus或Events确实可以极大地帮助构建解耦的代码,最终将简化应用程序的开发和维护。 另一方面,这是有价格的,价格是与应用服务器的绑定(在示例中,WildFly是开箱即用的,但其他任何方法都可以使用)。 与Application Server一起使用意味着体系结构和复杂性方面的开销,并且应该考虑成本/收益比。 我们可以将Errai框架视为Spring + GWT应用程序的JEE对应物,因此,最终,所有这些都可以解决一个古老的问题:您是JEE还是Spring开发人员?

翻译自: https://www.javacodegeeks.com/2017/09/introduction-errai-framework.html

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

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

相关文章

动态壁纸安卓_高清无水印!这4款壁纸软件,让你的手机好看又独特

手机与我们每日相伴&#xff0c;我们总会精心挑选各种图片设置为手机壁纸&#xff0c;有时换个壁纸就像换了一种心情一样。但网上搜索的壁纸大同小异&#xff0c;有没有风格独特又有趣的&#xff1f;今天就给大家推荐4款各具特色的壁纸App&#xff0c;保证给你耳目一新的感觉。…

在线生成安卓APP图标

移动应用图标/启动图生成工具&#xff0c;一键生成所有尺寸的应用图标/启动图 在线生成安卓APP图标生成 图标在 线 在线图标 安卓图标 生成图标 https://icon.wuruihong.com/ 在线png图片压缩 png压缩 https://compresspng.com/zh/ 在线gif图片压缩 gif压缩 https://www.soog…

NOIP模拟测试29「爬山·学数数·七十和十七」

爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左面第一个大于当前值的值,极右值为右面第一个大于当前值的值 ,找到最大值…

手机音频拼接软件_良心分享:业界最顶尖的软件!

01短视频的爆火&#xff0c;让全民都接触了“剪辑”要知道在最最最开始大众离它很远&#xff0c;更多是一种职业而非爱好最具影响力的是抖音、B站等平台抖音让更多人接触到了剪辑哔哩让更多人学会剪辑技术虽然抖音的视频时长普遍较短但这并不妨碍剪辑技术的展现比如&#xff0c…

java堆内存和堆外内存_Java堆空间,本机堆和内存问题

java堆内存和堆外内存最近&#xff0c;我正在和一个朋友讨论为什么Java进程使用的内存比启动Java进程时设置的最大堆多。 代码创建的所有Java对象都是在Java堆空间内创建的&#xff0c;其大小由-Xmx选项定义。 但是一个Java进程由很多空间组成&#xff0c;而不仅仅是Java堆空间…

springboot实践1

环境安装 安装jdk 推荐安装jkd1.8,我使用的是mac&#xff0c;假设已经安装好homebrew,则jdk的安装指令是&#xff1a; brew install java 在 ~/zshrc ,添加两行 export JAVA_HOME你的jdkPath export PATH$PATH:$JAVA_HOME;然后保存&#xff1b; 输入 echo ${JAVA_HOME} 回车&…

电脑入门基础教程_ARM入门最好的文章------转载一位资身工程师的入门心得

开始学ARM一团雾水,不知道如何入手.这个介绍的比较全面.本人认为aRM入门最好的文章1. 抓住51开发ARM这几个月来我一直都爬在51的问题&#xff0c;自己都有一点笑自己了&#xff0c;用了4个月的时间&#xff0c;来巩固51的原理和程序&#xff0c;还好我自己算是走过来了&#xf…

项目包装组织

程序包是Java的基本概念&#xff0c;是您开始用该语言编程时偶然发现的第一件事。 作为一个初学者&#xff0c;您可能不太在意软件包的结构&#xff0c;但是随着您成为经验丰富且成熟的软件开发人员&#xff0c;您开始思考可以采取哪些措施来提高其效率。 有几个主要选项需要考…

NOIP模拟测试30「return·one·magic」

magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i1}^{i<N} [gcd(i,N)1] C_{G}^{i} \%phi(p)}\%p$ 根据欧拉函数是积性的得出$phi(54184622)phi(2)*phi(27092311)$ 然后$phi(27092311)27092310$ $phi(2)1$所以$phi(541…

python作用域的理解-理解Python的UnboundLocalError(Python的作用域)

今天写代码碰到一个百思不得解为什么会出错的代码&#xff0c;简化如下&#xff1a; 1 2 3 4 5 6 7 x10 deffunc(): ifsomething_true(): x20 print(x) func() 意图很明显&#xff0c;首先我定义了一个全局的x&#xff0c;在函数中&#xff0c;如果有特殊需要&#xff0c;就重新…

threadlocals_如何使用ThreadLocals射击自己

threadlocals它将很好地启动。 像大多数故事一样。 您会发现一个新概念&#xff0c;并对其功能感到惊讶。 然后突然装备了这把新锤子&#xff0c;一切开始看起来像钉子。 根据我们过去几个月的经验&#xff0c; java.lang.ThreadLocal真是一锤定音。 我想这全都归结为ThreadLo…

ASP.NET Core Web API

1.简单介绍 ASP.NET Core Web API 是 ASP.NET Core MVC 的一个功能。ASP.NET Core MVC 包含了对 Web API 的支持。可以构建多种客户端的 HTTP 服务。ASP.NET Core Web API可用于在 .NET Core 上构建 RESTful 应用程序。 框架包含对 HTTP 内容协商的支持&#xff0c;内置支持以 …

win8配置_《FIFA 20》PC配置公布 最低仅需i3+GTX660

EA公布了新作《FIFA 20》的PC配置需求&#xff0c;玩家最低仅需 i3-2100 GTX 660 显卡即可进行游戏&#xff0c;推荐配置则为 i3-6300T GTX 670 显卡&#xff0c;考虑到本作的逼真画面效果&#xff0c;这配置可以说是非常亲民&#xff0c;另外硬盘空间需要大约 50 GB。最低配…

Thymeleaf + Spring中的验证

总览 我们将要讨论的重要主题涉及空值&#xff0c;空字符串和输入验证&#xff0c;因此我们不会在数据库中输入无效数据。 在处理空值时&#xff0c;我们使用了Java 1.8中引入的java.util.Optional 。 0 – Spring Boot Thymeleaf示例表单验证应用程序 我们正在为一所大学构…

技术管理规划-设定团队的职能

背景 职责 团队是干什么的 初步自查团队 1.公司为什么给我团队&#xff1f;希望我产出什么&#xff1f;完成对除了c端健康领域探索的研发任务&#xff0c;产出技术类产品 2.团队存在的独特价值是什么&#xff1f;研发过lx健康这款基础app,研发能力强&#xff0c;熟悉硬件相关技…

开发转测试没人要_前端开发,测试,后端,该如何选择?

一般来说前端会比后端简单一些的&#xff0c;初学者或者转行可能考虑前端多一点&#xff0c;但是后端开发的薪水又比前端高一些&#xff0c;就是比较枯燥。前端开发我目前一直在自学前端&#xff0c;从网上找资料&#xff0c;然后听课&#xff0c;只要是对编程有兴趣&#xff0…

技术管理规划-如何设定团队的目标

团队管理规划有4个互相关联的要素&#xff1a; 职能目标团队路径在未来的3个月&#xff0c;6个月&#xff0c;1年&#xff0c;2年&#xff0c;3年&#xff0c;5年中&#xff0c;你希望带着你的团队抵达一个什么样的目的地&#xff0c;也就是团队的目标。 更加清楚目标意味着什么…

a8处理器相当于骁龙几_天玑820相当于骁龙什么处理器?天梯图秒懂联发科天玑820性能排名...

5月18日&#xff0c;联发科发布了全新 天玑820处理器&#xff0c;号称目前最强中端芯&#xff0c;受到不少网友关注。联发科近年来在手机CPU市场沉寂多年&#xff0c;今年异常给力&#xff0c;先后发布了天玑1000/L、天玑800等多款处理器&#xff0c;采用了全新的命名方式&…

hibernate 继承_Hibernate继承:每个类层次结构的表

hibernate 继承在本教程中&#xff0c;我们将了解如何在hibernate中实现继承。可以通过3种方式在hibernate中实现继承。在本文中&#xff0c;我们将看到其中一种&#xff0c;即每个类层次结构一个表。 Hibernate中的继承&#xff1a; Java是面向对象的语言&#xff0c;继承是J…

vue - cli 脚手架安装

一、 node安装 1&#xff09;如果不确定自己是否安装了node,可以在命令行工具内执行&#xff1a; node -v &#xff08;检查一下 版本&#xff09;&#xff1b; 2&#xff09;如果 执行结果显示&#xff1a; xx 不是内部命令&#xff0c;说明你还没有安装node , node 安装地址…