vaadin

从表面上看 , 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

vaadin

vaadin_Vaadin和DukeScript中的Hello World相关推荐

  1. Vaadin和DukeScript中的Hello World

    从表面上看 , Vaadin和GWT通常与DukeScript有很多共同点. 两者都致力于为Java开发人员提供面向浏览器的解决方案,并且由于其对Maven的原生支持而与IDE集成良好. 但是,这些方 ...

  2. vaadin_Vaadin应用程序中的EJB查找

    vaadin 自从我实现上一个服务定位器以来已经有很长时间了. 考虑到Java EE CDI (上下文和依赖注入)的成熟度,我认为不再需要. 我的第一个实现是在基于Struts的Web应用程序中使用E ...

  3. 无处不在_Java无处不在:使用DukeScript在任何地方运行一次编写

    无处不在 在相当长一段时间内,Java都未能兑现"一次编写,随处运行"的承诺. DukeScript希望通过在跨平台应用程序中实现视图和逻辑的清晰分离来改变这种状况. 在本文中,一 ...

  4. Java无处不在:使用DukeScript在任何地方运行一次编写

    在相当长一段时间内,Java都未能兑现"一次编写,随处运行"的承诺. DukeScript希望通过在跨平台应用程序中实现视图和逻辑的清晰分离来改变这种状况. 在本文中,一个简单的场 ...

  5. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  6. 面试:第十二章:所有总结

    Java基础 java基本类型哪些,所占字节 byte :1个字节 short :2个字节 char :2个字节 int :4个字节 long :8个字节 float :4个字节 double :8个 ...

  7. linux内核分析(转自某位大哥网上的笔记)

    启动 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码.BIOS先进行一系列的系统自检,然后初始化位于地址0的中断 ...

  8. vaadin_Vaadin中的简单访问控制

    vaadin 有些事情最好保密. 这也适用于数据. 在本教程中,您将学习如何使用普通的Vaadin和Java实现简单的访问控制系统. 我们分四个步骤进行操作:创建登录视图,授权用户,对用户进行身份验证 ...

  9. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

最新文章

  1. Bzoj3509 [CodeChef] COUNTARI
  2. WINCE下如何设置/删除/查询这些环境变量
  3. 线程(Thread,ThreadPool)、Task、Parallel
  4. 关于跨DB增量(增、改)同步两张表的数据小技巧
  5. SSY and JLBD
  6. 第一章:渗透测试之信息搜集
  7. 关于工厂模式---转发
  8. 有趣的反直觉的“三门问题”
  9. java 查询windows进程_Oracle查询语句,你知道几个?(下)
  10. Linux中usr目录
  11. Ubuntu下 UltraEdit 破解/显色
  12. 如何查看计算机硬盘规格大小,台式机硬盘如何查看大小
  13. Excel批量自动填充行号
  14. java实践课程感想_JAVA课程学习感想
  15. NCA: Neighbourhood Components Analysis
  16. 企业员工生日提醒短信怎么发送
  17. 【ASE入门学习】ASE入门系列——序章
  18. 不知道PDF转PPT转换器哪个好用?分享三个简单好用的办公用具
  19. autoware 1.14 lgvsl simulator仿真
  20. ~ 如何用C++自制一个日麻游戏 ~ 概述

热门文章

  1. CF1054D-Changing Array【贪心】
  2. P6688-可重集【字符串hash,线段树】
  3. P4764-[CERC2014]Pork barrel【主席树,LCT,最小生成树】
  4. P4989-二进制之谜【堆,贪心】
  5. jzoj4024-石子游戏【SG函数,博弈论】
  6. ssl2331OJ1373-鱼塘钓鱼 之1【纯贪心】
  7. C. Code a Trie(Trie+dfs+贪心)
  8. 2018-2019 ACM-ICPC, Asia Seoul Regional Contest——A - Circuits
  9. Educational Codeforces Round 96 (Rated for Div. 2)
  10. 【模板】分散层叠算法(P6466)