使用Vaadin和Spring Roo进行应用敏捷开发
参考http://vaadin.com/book/-/page/rapid.html
一、要点
使用的快速应用开发工具:
(1)Spring Roo
(2)Vaadin插件 for Eclipse
所开发的应用包括:
(1)使用JPAContainer数据库绑定
(2)国际化
(3)使用Vaadin TestBench进行测试
二、概述
通过开发一个简单应用,来展示开发一个典型的实际应用需要的工作步骤:
(1)使用Roo建立业务数据模型
(2)使用JPA和JAPContainer(一个Vaadin add-on)实现数据绑定
(3)使用Spring Roo的Vaadin插件建立CRUD视图
(4)通过Eclipse的Vaadin插件定制自动生成的视图
(5)使用Vaadin的Calendar add-on
(6)通过登陆进行用户认证与授权
(7)国际化
(8)使用Vaadin的TestBench add-on进行测试
(9)将应用发布到Cloud Foundry
其中:Spring Roo是一个java应用的快速开发工具。它使用Spring框架、JPA和Maven生成代码,也支持通过add-ons进行扩展,例如spring roo下的Vaadin插件,该插件可以基于在Roo下定义的数据模型生成用户界面视图,这些视图可以使用Eclipse下的vaadin插件提供的可视化编辑器定制修改。
JPAContainer是一个vaadin的container,用于JPA实现与数据库之间的通讯,把一个JPAContainer与一个Vaadin的Table关联,设置为可编辑模式,马上就会得到一个CRUD组件,在table界面编辑的数据被更新到JPAVContainer中,该组件连接一种JPA实现,如EclipseLink或Hibernate,你在界面中所做的一切立即反映到后端数据库中。
通过开发一个简单应用,来展示一个完整的开发过程。该应用是一个工时报告系统,允许员工报告各个项目已经完成的工作。为了完成认证,需要一个登录界面,在用户登录界面中可以选择所使用的语言。业务任务在主界面中完成,其中使用一个典型的布局和菜单条。
三、设置开发环境
1、需要开发工具
(1)Spring Roo,与STS一起
(2)Eclipse下的Vaadin插件
(3)Spring Roo下的Vaadin插件
(4)Vaadin Calendar日历插件
(5)Vaadin TestBench测试插件
2、建立一个Spring Roo项目
3、安装Spring Roo下的Vaadin插件
插件安装之后并不是只针对这一个项目,一旦安装,所有项目都可以使用。但是,Roo shell只能在项目下进入。
在Roo shell界面中输入以下命令:
roo>pgp trust --keyId 0xBF0451C0
roo> download accept terms of use
roo> addoninstall bundle --bundleSymbolicNamecom.vaadin.spring.roo.addon
4、设置Roo的数据层
在Roo下设置基于JPA和数据库的数据模型非常简单,持久化的简单设置如下:
roo> persistencesetup --provider ECLIPSELINK --databaseHYPERSONIC_IN_MEMORY
上述命令设置持久化使用EclipseLink实现和HSQLDB内存数据库。可以使用Ctrl-Space获得可以选择的JpA实现和数据库。
当使用一个实际的数据库时,需要配置数据库链接,在下述文件中:
src/main/resources/META-INF/spring/database.properties
四、建立数据模型
Spring Roo自动创建领域模型。使用简单的命令创建实体类及其属性字段。使用前面设置的项目的持久化,创建实体类的同时也创建领域模型与底层数据库之间的JPA映射。
1、领域模型设计
工时报告系统有三个实体,项目中的员工表示为RapidUser实体,同时也是系统的用户,权限通过admin标志区分。
员工使用系统输入工作实体,表示为WorkEntry类,每个条目有开始和结束日期时间和说明。每个工作条目总是与一个项目关联,项目表示为Project类。一个项目有一个名称和是否结束的标志,该标志决定该项目不再被选择。
2、在Roo下建立数据模型
使用Roo shell建立模型对象。entity命令建立一个新的实体类,使用—class参数指定类名。波折号(~)用于指定项目包名。--testAutomatically选项用于建立实体的集成测试。在Roo shell中,总是可以使用Ctrl-Space获得帮助后自动完成命令。
roo>entity --class ~.domain.RapidUser -–testAutomatically
field命令用于建立实体的属性字段,第一个参数是字段类型,像string、boolean或date。用—fieldName指定字段名称,用—notNull指定字段非空,对于string类型,还可以使用可选的参数:--sizeMin和—sizeMax,用于指定字段的最小最大长度。
roo>fieldstring--fieldName username --notNull --sizeMin 2
前面说明的项目的各个数据模型,使用下述命令创建实体类:
entity --class ~.domain.RapidUser --testAutomatically
field string --fieldName username --notNull --sizeMin 2
field string --fieldName password --notNull --sizeMin 4
field boolean --fieldName admin --primitive
entity --class ~.domain.Project --testAutomatically
field string --fieldName name --notNull --sizeMin 2 --sizeMax255
field boolean --fieldName enabled --primitive
entity --class ~.domain.WorkEntry --testAutomatically
field string --fieldName comment --sizeMax 255
field reference --fieldName project --type~.domain.Project --notNull
field reference --fieldName employee --type~.domain.RapidUser --notNull
field date --fieldName startTime --type java.util.Date--notNull
field date --fieldName endTime--type java.util.Date –notNull
reference字段类型用于指定该字段引用的其他实体类,使用—type指定具体引用的实体类名。
由于在创建领域对象模型时指定了—testAutomatically参数,Roo自动生成了相关的测试,为了检验领域模型,使用下述命令进行测试:
roo>performtests
五、创建Vaadin应用和CRUD界面
Spring Roo本质上是一个代码生成器。如前所述,在建立领域模型时生成了一大堆JAP实体代码。也可以使用Roo生成围绕领域模型的简单用户界面。
默认情况下,Roo使用JSP页面建立CRUD视图。这里有所不同的是,使用Roo的Vaadin插件生成基于Vaadin的服务器端RIA用户界面。
1、建立应用框架
首先,使用vaadin setup命令建立基本的应用框架,稍后在其中建立用户界面。在Roo shell中输入下述命令:
vaadin setup --applicationPackage ~.web--baseName RapidWorkHours --themeName rapid --useJpaContainer true
该命令建立了开发过程中所有需要的内容:
(1)一个“web”包,所有与vaadin相关的代码放在这里
(2)一个应用类名
(3)一个web.xml文件,用于配置针对servlet容器的vaadin应用
(4)一个外观主题theme
2、生成CRUD视图
下面,生成实际的CRUD界面,在Roo shell中使用如下命令:
vaadin generate all --package ~.web.ui--visuallyComposable true
该命令针对所有的领域模型生成CRUD界面,代码放在web.ui包中。
--visuallyComposabe参数指示Roo的vaadin插件生成可以在eclipse的vaadin插件中的vaadin可视编辑器中修改的代码结构。如果不指定该参数,所生成的代码略有不同,适合于高级vaadin用户手工修改代码。
在添加了新的领域对象后,需要再次使用该命令生成新领域对象的CRUD界面代码。
3、发布到开发服务器
至此,我们已经拥有了一个可以运行的vaadin应用系统。很自然地我们想看看实际的运行效果。
在STS IDE中,选择Run on Server,可以使用任何servlet容器应用服务器。
如果感觉Maven世界比较合适,项目也可以针对测试进行发布,例如:jetty:run。Jetty插件在生成项目时自动按装。
六、在Roo项目中使用Vaadin扩展
复杂的vaadin应用通常需要在vaadin核心的基础上使用某些扩展。在这里,我们需要Calendar和JPAContainer两个Vaadin的扩展插件。
Roo的Vaadin插件支持从vaadin目录中安装vaadin扩展插件,并且编译包括的任何widget。
(1)安装vaadin的Calendar日历扩展插件
(2)编译相关的widget
(3)配置发布装配
Roo的vaadin插件自动按装JPAContainer插件,但是Calendar日历插件需要手工安装。
1、安装Vaadin扩展插件
在Roo shell中:
roo> vaadin addon install --artifactId vaadin-calendar
在键入命令是,使用Ctrl-Space可以获得帮助和自动完成命令,如下图:
2、编译widget
有些vaadin扩展插件包括定制的widget,例如Calendar日历插件,需要编译这些widget。在Roo shell中使用下述命令:
roo>vaadin widgetsetcreate
该命令执行需要相当长的时间,特别是在首次执行时需要下载maven的以来库。大概需要20到60秒的时间。
编译后的widget set放在target/rapid-0.1.0-SNAPSHOT/VAADIN/widgetsets/com.vaadin.rapid.web.RapidWidgetset目录下,并且在web.xml中引用。
如果在以后又增加了vaadin的扩展插件,使用vaadin widgetset update命令。
3、配置发布装配
widget set在target/rapid-0.1.0.BUILD-SNAPSHOT目录下编译,默认没有包括部署路径。
(1)打开项目属性
(2)选择部署装配
(3)点击Add
(4)选择文件夹
(5)选择target/rapid-0.1.0.BUILD-SNAPSHOT目录
(6)点击完成
七、定制用户界面
对于基本应用,Roo生成的实体界面已经很好了。在某些情况下,修改form或者改变table的可见属性来满足最终用户的要求。
1、 修改Roo生成的实体form
在可视化编辑器中修改生成的实体form,例如:WorkEntryForm.java。在文件名上右键打开文件,进入设计视图,修改界面。
2、 在填写工作条目界面中建立日历视图
在这里,我们构建一个基于vaadin Calendar日历插件的WorkEntry实体的非传统界面。以图形化的日历用户界面,最终用户填写工作条目。在一周期间,用户可以得到一个他做了什么的快速概述,它也很容易发现缺少的条目。用户还可以选择和可视化修改日历的时间范围,从而加快了日常工作。
在可视化编辑器中开始绘制界面:
(1)选择file-new-vaadin-composite
(2)填写适当的包名、类名,例如:~web.ui和CalendarView。
(3)进入可视化设计界面