精通 Grails: 用 Groovy 服务器页面(GSP)改变视图
Grails 标记
是常用的 Grails 标记。它将遍历列表中的每个 项。要查看它的效果,请在文本编辑器中打开 grails-app/views/trip/list.gsp(如清单 3 所示):
清单 3.list.gsp 视图
<tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
<td><link action="show" id="${trip.id}">${trip.id?.encodeAsHTML()}</g:link></td>
<td>${trip.airline?.encodeAsHTML()}</td>
<td>${trip.name?.encodeAsHTML()}</td>
<td>${trip.city?.encodeAsHTML()}</td>
<td>${trip.startDate?.encodeAsHTML()}</td>
<td>${trip.endDate?.encodeAsHTML()}</td>
</tr>
</g:each>
标记的 status 属性是个简单的计数器字段(请注意这个值用在下一行的 ternary 语句中,用来将 CSS 样式设为 even 或 odd)。var 属性允许命名用来保存当前项的变量。如果将名称改为 foo,那么需要将后面的行改为 ${foo.airline?.encodeAsHTML()},依次类推( ?. 操作符是 Groovy 用来避免 NullPointerException 的方法。它可以快捷地表示 “只有在 airline 不为 null 时才调用 encodeAsHTML() 方法,否则返回空字符串”)。
另一个常用 Grails 标记是 。顾名思义,它的作用是构建一个 HTML 链接。当然也可以直接使用 标记,但是这个方便的标记还接受属性,例如 action、id 和 controller。如果只考虑 href 的值而不考虑它前后的 anchor 标记,那么可以改用 。在 list.gsp 顶部能看到返回链接的第三个标记: 。这个标记接受 dir 和 file 属性而不是 controller、action 和 id 属性。清单 4 显示了 link 和 createLinkTo 的作用:
清单 4. link 标记 vs. createLinkTo 标记
<span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
<span class="menuButton"><link class="create" action="create">New Trip</g:link></span>
</div>
注意,在清单 4 中,可以交替使用两种不同的形式调用 Grails 标记 — 一种是在尖括号内包含标记,一种是仿效方法调用在大括号内包含标记。当在另一个标记的属性中调用方法时,大括号表示法(正式名称为表达式语言或 EL 语法)更合适。
在 list.gsp 下面的几行,能够看到另一个流行的 Grails 标记:,如清单 5 所示。在这个示例中,它的意思是 “如果 flash.message 属性不为 null,就显示它。”
清单 5. 标记
<if test="${flash.message}">
<div class="message">${flash.message}</div>
</g:if>
在浏览生成的视图时,还会看到其他许多 Grails 标记。 标记在数据库包含的 Trip 比当前显示的 10 条记录多时,显示 “前一个” 和 “下一个” 链接。 标记使列标题变为可单击,从而支持排序。看看其他 GSP 页面中与 HTML 表单有关的标记,例如 和 。Grails 的联机文档中列出了所有可用的 Grails 标记,并提供了它们的用法示例(请参阅 参考资料)。