本文转引自http://www.infoq.com/cn/articles/grails-ejb-tutorial
作者 Jason Rudolph 译者 胡键
这是grails很好的一个入门教程,对比JAVA应用可以省略大量的代码
下面是最关键的关系管理部分
步骤5 —— 增加关系管理
关于关系管理,我们对应用有哪些期望?嗯,要我说,我们应该能……
查看分配给某个员工的所有计算机。
查看单个计算机的细节(包括它的分配状况)。
能增加、修改和删除计算机(包括它的分配状况)。
准备好了吗?让我们开始吧。
在员工页列出计算机没有什么意义,因此让我们把这列移除。打开grails-app/views/employeeBean/list.gsp,并移除该列。现在,刷新浏览器,验证修改。
【附件1】
接下来,点击显示(Show),查看员工的细节。
【附件2】
最少,我们需要整理显示每个计算机的文本。但是,可能我们根本就不愿直接在这个页面上看到计算机。与其在该页显示计算机,不如包含一个指向该员工的计算机列表的链接。
打开该页模板(即,grails-app/views/employeeBean/show.gsp),移除显示当前员工计算机列表的行。接着增加以下行,链接到显示该员工的计算机列表的单独页面。
<tr class="prop">
<td colspan="2" align="left" class="name">
<g:link controller='computerBean' action='showComputersByEmployee' id='${employeeBean.id}' >Show Computers</g:link>
</td></tr>
此处,我们使用了Grails标签库。link标签将产生指向ComputerBeanController的链接,并调用一个我们需要定义的新动作,showComputersByEmployee。该链接还包含了所请求员工的ID。
让我们刷新浏览器,看看变化。
很好,我们得到链接了。现在,我们需要为链接定义一个新动作。在编辑器中打开grailsapp/controllers/ComputerBeanController.groovy,因为新动作将通过员工查找计算机,我们首先需要增加引用EmployeeBean类的import语句。
import com.jasonrudolph.ejb3example.entity.EmployeeBean
接着,我们增加新动作。
def showComputersByEmployee = {
render(view:'list', model:[ computerBeanList:
ComputerBean.findAllByEmployeeBean(EmployeeBean.get(params.id)) ])
}
这个动作让我们好好见识了一下Groovy(和Grails)的能力,通过简单的几行代码,你的表现力究竟有多大。在以上几行代码中,我们告诉Grails,任何showComputersByEmployee的调用应该......
使用params.id从request中获得员工
使用EmployeeBean#get方法获得员工ID对应的员工
使用ComputerBean#findAllByEmployeeBean方法找出与员工相关的所有计算机
将结果放入名为computerBeanList的对象
展现(render)视图,在一个名为list的模板中,使用computerBeanList对象作为模型。
记得曾在EmployeeBean中定义get方法,以及ComputerBean中定义findAllByEmployeeBean方法吗?没有?答对了。这些方法只是Grails为你的领域对象所提供的众多动态方法的一小部分而已。之后,我们将更多的探讨这些条目。现在,我们准备点击显示计算机链接了。
我们越来越接近完工了。我们仍然需要修改Employee Bean列中的文本。我们需要在此显示些更让人明白点儿的东西。
同样,我们可能更愿意标出这些计算机所属的员工。我们当前重用了list模板(作为ComputerBean的脚手架代码的一部分产生),而那个模板最初是为了列出所有计算机而设计的。另一方面,我们总能定义一个单独的模板,它用于显示计算机的子集,或能使list模板更动态一些以支持两个场景。就现在而言,我们将去掉这个特性,将其作为“有则更好”,而非必要的特性。
我们应该完成了管理员工所需的所有改变。现在,我们只需整理计算机管理的特性。
既然我们就在这儿,让我们整理一下计算机list模板。替换Employee Bean列的当前文本,改为显示员工的网络ID。打开grails-app/views/computerBean/list.gsp。找到在展现Employee Bean列文本的Groovy脚本…… ${it.employeeBean}
……将它改为显示员工的网络ID。
${it.employeeBean.networkId}
刷新浏览器,让我们看看它的样子。(Employee列在Brand列和Model列之间显得有些不合适,所以我调换了一下它们的位置。不愿这样做也可以。)
list模板完成了,现在该show模板了。
点击显示(Show)链接,并访问我们需要改变的页面。
看起来,我们只需改变员工链接的文本就行了。对此,我们完全赞同。那么,打开grailsapp/views/computerBean/show.gsp,并找到展现当前链接文本的那段脚本。
${computerBean?.employeeBean}
就象我们为list模板所做的那样,改变代码以显示员工的网络ID。
${computerBean?.employeeBean.networkId}
让我们再次刷新浏览器,并验证我们的改变。(同样,Employee行在Brand行和Model行之间显得有些不合适。因此,只要觉得合适,你可以随意重新调整这些行。)
让我们转到编辑(edit)功能。
我们着手查看这儿的一个主题。我们需要改变选择框,以提供一组网络ID的列表。在grails-app/views/computerBean/edit.gsp中找到<g:select>标签,把它修理成以下内容:
<g:select optionKey="id"
from="${com.jasonrudolph.ejb3example.entity.EmployeeBean.list()}"
name='employeeId'
optionValue='networkId'
value='${computerBean.employeeBean?.id}'></g:select>
通过给标签增加optionValue参数,选择框中的文本会更具有含义。
现在,视图被修正了,但是更新(update)功能还需要除了视图之外的一点努力。我们同样需要增强控制器(即ComputerBeanController.groovy)。如果用户改变关联了计算机的员工,我们需要确保正确地持久化这些关联的变化。换句话说,我们需要从当前的员工去除关联,而将它分配给新的员工。这个增强型的更新方法需要一点额外的代码行。
def update = {
def computerBean = ComputerBean.get( params.id )
if(computerBean) {
if (computerBean.employeeBean) {
computerBean.employeeBean.computers.remove(computerBean)
}
computerBean.properties = params
def employeeBean = EmployeeBean.get(params.employeeId)
employeeBean.computers.add(computerBean)
computerBean.employeeBean = employeeBean
if(computerBean.save()) {
redirect(action:show,id:computerBean.id)
}
else {
render(view:'edit',model:[computerBean:computerBean])
}
}
else {
flash.message = "ComputerBean not found with id ${params.id}"
redirect(action:edit,id:params.id)
}
}
保存你的改变,我们准备试验它了。让我们改变这台计算机的品牌——现在是联想(Lenovo)了——并将它重新分配给John Doe。
当然,我们也需要能够给我们的库存增加新的计算机。因此,让我们点击新建计算机(New ComputerBean)。
我们经过上次更改编辑(Edit)页之后,我们已具有很好的资格来整理这一页。我们需要对选择框做些相同的调整。打开grails-app/views/computerBean/create.gsp,调整<g:select>标签,并刷新你的浏览器。
<g:select optionKey="id"
from="${com.jasonrudolph.ejb3example.entity.EmployeeBean.list()}"
name='employeeId' optionValue='networkId'
value='${computerBean.employeeBean?.id}'></g:select>
正如我们看到的编辑(edit)功能,我们需要对控制器进行轻微的增强。当我们创建新计算机时,我们需要在保存它之前分配给一个员工。编辑ComputerBeanController.groovy,以包含这个被更新的保存(save)方法。
def save = {
def computerBean = new ComputerBean()
computerBean.properties = params
def employeeBean = EmployeeBean.get(params.employeeId)
employeeBean.computers.add(computerBean)
computerBean.employeeBean = employeeBean
if(computerBean.save()) {
redirect(action:show,id:computerBean.id)
}
else {
render(view:'create',model:[computerBean:computerBean])
}
}
回到浏览器,我们准备创建一个新计算机了。填写空的域,并创建。
现在,Jane有一台崭新的膝上电脑了。
7. 最后,只剩下删除(delete)功能了。这次我们不需要改变任何模板。我们只需要给控制器增加一行。当我们在ComputerBeanController.groovy中删除一台计算机时,我们同样需要移除对应的计算机与员工的关联。以下的第四行代码负责这些。
def delete = {
def computerBean = ComputerBean.get( params.id )
if(computerBean) {
computerBean.employeeBean.getComputers().remove(computerBean)
computerBean.delete()
flash.message = "ComputerBean ${params.id} deleted."
redirect(action:list)
}
else {
flash.message = "ComputerBean not found with id ${params.id}"
redirect(action:list)
}
}
看起来Jane的新MacBook被回收了。我们应该删除它吗?
此时,我们完成它了!使用快捷的几步,我们现在已经有了一个功能完备的Web应用,它构建于我们的实体Bean上。当然,它还需一些打磨。但至少,作为一个可工作的原型,它已经足够了。尽管仍需改良,但它是个完全能发展成完美产品的一个原型。
分享到:
相关推荐
Machine Learning: Step-by-Step Guide To Implement Machine Learning Algorithms with Python By 作者: Rudolph Russell ISBN-10 书号: 1719528403 ISBN-13 书号: 9781719528405 出版日期: 2018-05-22 pages ...
Jason Rudolph,著有《Grails入门》,认为本书是将Groovy融入每个Java开发者工具箱的必备指南。Dierk König,Canoo Engineering AG的成员,则将其比作在Groovy“烘焙”中不可或缺的秘方集,能让开发者迅速掌握解决...
- **Jason Rudolph (《Getting Started with Grails》作者)**:认为本书是快速掌握Groovy元编程的最佳资源之一。 - **Scott Davis (aboutGroovy.com 编辑)**:强调本书不仅仅停留在语法层面,而是深入探讨了Groovy...
Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,从而为大家带来一套能实现超高生产力的一站式框架。 本书作者 Jason Rudolph 译者 陈俊 林...
- **Grails框架**: Jason Rudolph介绍的Grails框架示例,不仅讲解了框架本身的优势,也展示了如何利用现代编程语言和框架提升开发效率。 #### 四、对软件工程师的意义 - **启发创新思维**: 通过对代码之美的探索...
一个新的标签画廊,从经典的圣诞节特别鲁道夫图像! 请给我们评分! 如果您觉得我们不值得5星级,请给我们发送电子邮件或先致电给我们! 我们希望收到你的来信! support@brandthunder.com或614.321.9316 *高分辨率...
Node.js-Rudolph-
《MetaTrader 5脚本与Axel Rudolph水平线绘制技术》 MetaTrader 5(MT5)是一款广泛应用于外汇、股票和其他金融市场的交易平台,它提供了丰富的交易功能和强大的技术分析工具。在MT5中,用户可以利用MQL5编程语言...
**鲁道夫(Rudolph)** 是一个专注于纯函数式编程(Pure Functional Programming, PFP)的路由器库,它采用经典的功能响应式编程(Functional Reactive Programming, FRP)范式构建。鲁道夫的核心是利用TypeScript...
NativeScript-Bored-Rudolph :recycling_symbol_selector: 用于拉动刷新布局内的自定义隐藏游戏的NativeScript插件。 演示版 本机图书馆 安装 从命令提示符/终端转到应用程序的根文件夹并执行: tns plugin add ...
1. 文档标题:“Foundations of Semantic Web Technologies”表明这是一本关于语义网技术基础的教程资源。语义网是互联网的一个扩展,它通过使用标准的、可相互理解的方式来交换信息,使得网络上的数据能够被机器...
这篇论文研究了一种新的认证协议分析和设计逻辑,该逻辑是对传统BAN逻辑的扩展。BAN逻辑由Burrows, Abadi和Needham提出,是基于逻辑的认证协议分析方法中的一种重要手段。本文的作者缪祥华和张云生,通过对BAN逻辑的...
杰森·鲁道夫(Jason Rudolph)的点文件 这些是用于以我喜欢的方式设置系统的配置文件。 安装 git clone git://github.com/jasonrudolph/dotfiles ~/.dotfiles cd ~/.dotfiles rake install 环境 我在macOS上运行,...
此外,网络上还有许多教程和在线练习资源可以帮助你提升正则表达式的使用技能。 通过以上介绍,我们可以看到正则表达式是一种功能强大且灵活多变的文本处理工具,它不仅能够简化文本匹配的过程,还能够提高数据处理...
该期杂志包含了软件行业的多个主题内容,其中重点介绍了一项名为“FeaturePlan 3.0”的新发布,以及一篇关于安全测试与管理的文章。 ### 二、“FeaturePlan 3.0”发布详情 **发布方:** - 发布方为Ryma Technology...
公司在半导体设备领域表现出色,其精密金属结构件已被广泛应用到全球半导体行业的领军企业,如AMAT、Lam Research、Rudolph Technologies以及国内的中微半导体等公司的核心产品中。 在国际市场,华亚智能的产品在...