Java 开发人员首先会注意到的是,这么少的代码可以实现多少功能。以 list 动作为例。起重要作用的是最后一行。Grails 将返回一个 hashmap,其中只有一个名为 tripList 的元素。(Groovy 方法的最后一行是一个隐式的 return 语句。如果您愿意,也可以手动地输入单词 return)。tripList 元素是 Trip 对象的一个 ArrayList,Trip 对象是通过 Trip.list() 方法从数据库中拉出的。通常该方法将返回表中的全部记录。它上面的一行代码表示 “如果 URL 中提供了一个 max 参数,那么使用它来限制返回的 Trip 的数量。否则,将 Trip 的数量限制为 10”。URL http://localhost:8080/trip-planner/trip/list 将调用这个动作。例如,http://localhost:8080/trip-planner/trip/list?max=3 显示 3 个 trip,而不是通常的 10 个。如果有更多的 trip 要显示,Grails 会自动创建上一页和下一页的分页链接。
那么,如何使用这个 hashmap?看看 grails-app/views/list.gsp,如清单 4 所示:
清单 4. list.gsp
<g:each in="${tripList}" status="i" var="trip">
<tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
<td>
<g:link action="show" id="${trip.id}">${trip.id?.encodeAsHTML()}</g:link>
</td>
</tr>
</g:each>
list.gsp 主要是一些老式 HTML 加上少量 GroovyTagLib。以 g: 为前缀的就是 GroovyTag。在清单 4 中,g:each 遍历 tripList ArrayList 中的每个 Trip,并构建一个格式良好的 HTML 表格。