从表面上看 , 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和DukeScript中的Hello World相关推荐

  1. vaadin_Vaadin和DukeScript中的Hello World

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

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

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

  3. vaadin 10+_Vaadin 10+作为CUBA UI的未来

    vaadin 10+ 从一开始,Vaadin就成为CUBA平台用户界面的基石和重要组成部分. 凭借其创新的方法,它帮助CUBA将企业用户界面开发带到了一个非常有希望(当今是默认)的WEB领域. Vaa ...

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

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

  5. Vaadin 10+作为CUBA UI的未来

    从一开始,Vaadin就成为CUBA平台用户界面的基石和重要组成部分. 由于其创新的方法,它帮助CUBA将企业用户界面开发带到了一个非常有希望的(如今是默认)的WEB领域. Vaadin最令人兴奋的部 ...

  6. Vaadin提示:以声明方式构建UI

    如果您使用了GWT,那么您可能会发现UiBinder对于设计复杂的UI很有用. 在有关Vaadin的系列文章中,我们希望在Vaadin和GWT之间得出相似之处. Vaadin提供了多种开箱即用的工具和 ...

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

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

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

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

  9. Vaadin附加组件和Maven

    介绍 我喜欢Vaadin的 (众多)一件事是它对Vaadin框架的"附加组件"社区-他们称之为Vaadin目录 . "附加组件"是框架中社区贡献的附加组件,可以 ...

最新文章

  1. 用开放地址法中的线性探查法解决冲突实现哈希表的运算
  2. websocket如何区分用户_WebSocket与普通Socket的差异
  3. cpio.gz文件解压方法
  4. 使用vim保存权限不够的文件
  5. linux libssh2 实例
  6. 线性代数 matlab,实用大众线性代数(MATLAB版)
  7. 我来更新了,说说工作中的Java处理异常
  8. left join on and 与 left join on where的区别
  9. Linux文件系统之df
  10. printf 地址_C程序显示主机名和IP地址
  11. 用5毛特效,让1000万人上瘾!这群乡村大妈,打了所有流量明星的脸
  12. 我喜欢用计算机400字,我的电脑400字作文
  13. 海尔智能微型计算机,微型计算机 Microcomputers
  14. java hypot_java.lang.StrictMath.hypot()方法实例
  15. 【教学类-34-01】拼图(运动项目-长方块拼图)3*4格子(中班主题《个别化拼图》健康偏艺术-美术)
  16. Qt OpenGL 旋转、平移、缩放
  17. android九宫格隐藏,android九宫格锁屏控件
  18. 大数据面试题集锦-Hadoop面试题(一)
  19. 哔哩哔哩在Hilt组件化的使用 | 技术探索
  20. 工作流程管理系统,表结构与运行机制

热门文章

  1. 解决idea中xml文件报红问题
  2. 几天没写代码,就……
  3. mmall工程生成dao层的插件出错了出错了 自动生成mapper 的插件出错了
  4. 软件测试遇到的异常情况,豪之诺软件测试项目开发中遇到比较多的Bug总结
  5. delphi7存取配置文件与sqlserver数据库连接_SQL Server基础知识概念要点详细讲解
  6. java集合——树集(TreeSet)+对象的比较
  7. 制作FAT12软盘以查看软盘的根目录条目+文件属性+文件内容
  8. selenium编写脚本_Selenium脚本编写技巧和窍门
  9. run spark pi_Spark Run本地设计模式
  10. aws lambda使用_使用AWS Lambda的CloudWatch事件通知