Welcome 微信登录

首页 / 软件开发 / JAVA / 精通Grails: 文件上传和Atom联合

精通Grails: 文件上传和Atom联合2011-08-02 IBM Scott Davis在过去几期的 精通 Grails 文章中,您一直在逐步构建一个小型的博客服务(Blogito)。在这篇文 章中,Blogito 将最终完工,成为一个实用的博客应用程序。您将为博客条目主体实现文件上传功能,并 添加自己制作的用于聚合的 Atom feed。

但是,在开始之前,请注意在上一篇文章(“身份验证和授权”)中,我加入的认证使 UI 中出现一 个细小的 bug。在加入新的特性之前,应该修复这个 bug。

修复隐藏的 bug

启动 Grails 时,grails-app/conf/Bootstrap.groovy 增加 2 个用户和 4 个新的博客条目。但是, 如果尝试通过 Web 界面增加博客条目,会发生什么?可以使用下面的步骤试试看:

以用户名 jsmith 和密码 wordpass 登录。

单击 New Entry。

添加标题和摘要。

单击 Create。

您将看到以下错误:Property [author] of class [class Entry] cannot be null。那么,这个 bug 是如何引入到应用程序中的?毕竟,bootstrap 代码还能正常工作。

在第一篇 Blogito 文章(“改变 Grails 应用程序的外观”)中,我让您通过输入 grails generate-views Entry 生成 Groovy Server Pages(GSP)视图。在随后的文章中,我更改了 domain 类 ,但是从未让您再回过头来生成视图。当我添加 Entry 与 User 之间的 1:M 关系时,磁盘上的 create.gsp 视图一直不变,如清单 1 所示。(还记得吗,belongsTo 创建一个名为 author 的字段,该 字段的类型为 User)。

清单 1. 打破 GSP 的 1:M 关系

class Entry {
static belongsTo = [author:User]

String title
String summary
Date dateCreated
Date lastUpdated
}

不得不说,要使一切同步,最安全的方式还是通过动态脚手架生成视图 — 特别是在开发的早期,域 模型不断变化的时候,更是如此。当然,不能仅仅依靠通过脚手架生成的视图,但是,当您在磁盘上生成 GSP 时,使它们保持最新的责任就从 Grails 转移到您自己身上。

如果现在为 Entry 类生成视图的话,Grails 会提供一个组合框,其中显示一个 Author 列表,如清 单 2 所示。您自己不要 这样做 — 这只是为了演示。稍后我将提供两种不同的选项。

清单 2. 为 1:M 关系生成的组合框

<g:form action="save" method="post" >
<div class="dialog">
<table>
<tbody>
<!-- SNIP -->
<tr class="prop">
<td valign="top" class="name">
<label for="author">Author:</label>
</td>
<td valign="top"
class="value ${hasErrors(bean:entryInstance,
field:"author","errors")}">
<g:select optionKey="id"
from="${User.list()}"
name="author.id"
value="${entryInstance?.author?.id}" ></g:select>
</td>
</tr>
<!-- SNIP -->
</tbody>
</table>
</div>
</g:form>