1. Grails 利用约定优于配置 将框架的各个部分组合在一起。Grails 用命名直观的文件和目录代替了更容易出错的在外部配置文件中手工对这些链接进行归类的老方法。
2. GSP 不过是标准 HTML 加上一些提供动态内容的 Grails 标记而已。
3.应该看到完整的 BookController
类,带有名为 create
、edit
、list
和show
闭包(以及其他闭包)。还应该看到 grails-app/views/book 目录下有四个 GSP:create.gsp, edit.gsp, list.gsp, and show.gsp. 在这里起作用的是 “约定优于配置”。当访问 http://localhost:8080/zhang/book/list 时,就是要求BookController
填充域模型对象Book 的列表,并将列表传递给book/list.gsp 视图。请在文本编辑器中查看 BookController.groovy
class BookController { def list(Integer max) { params.max = Math.min(max ?: 10, 100) [bookInstanceList: Book.list(params), bookInstanceTotal: Book.count()] } }这个简单的闭包从 数据库中检索到 10 条
Book
记录,将它们转换为 POjO,并将它们保存在名为
bookInstanceList
的
ArrayList
内。list.gsp 页面随后将遍历列表,逐行构建 HTML 表格。
4. Grails标记
<g:each>
是常用的 Grails 标记。它将遍历列表中的每个 项。
<g:each in="${bookInstanceList}" status="i" var="bookInstance"> <tr class="${(i % 2) == 0 ? 'even' : 'odd'}"> <td><g:link action="show" id="${bookInstance.id}"> ${fieldValue(bean: bookInstance, field: "author")}</g:link></td> <td>${bookInstance.name?.encodeAsHtml()}</td> %{--<td>${fieldValue(bean: bookInstance, field: "name")}</td>--}% <td>${fieldValue(bean: bookInstance, field: "price")}</td> </tr> </g:each>
<g:each>
标记的
status
属性是个简单的计数器字段(请注意这个值用在下一行的 ternary 语句中,用来将 CSS 样式设为
even
或
odd
)。
var
属性允许命名用来保存当前项的变量。如果将名称改为
foo
,那么需要将后面的行改为
${foo.author?.encodeAsHTML()}
,依次类推(
?.
操作符是 Groovy 用来避免
NullPointerException
的方法。它可以快捷地表示 “只有在
airline
不为 null 时才调用
encodeAsHTML()
方法,否则返回空字符串”)。
${foo.author?.encodeAsHTML()}
这种方式就等价于${fieldValue(bean:bookInstance,field:"name")}.
另一个常用 Grails 标记是 <g:link>
。顾名思义,它的作用是构建一个 HTML <a href>
链接。当然也可以直接使用 <a href>
标记,但是这个方便的标记还接受属性,例如 action
、id
和controller
。如果只考虑href
的值而不考虑它前后的 anchor
标记,那么可以改用<g:createLink>
。在 list.gsp 顶部能看到返回链接的第三个标记:<g:createLinkTo>
。这个标记接受dir
和 file
属性而不是 controller
、action
和id
属性。例如:
- <div class="nav">
- <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
- <span class="menuButton"><link class="create" action="create">New Book</g:link></span>
- </div>
<g:if>标记.
<g:if test="${flash.message}"> <div class="message" role="status">${flash.message}</div> </g:if>它表示的是如果flash.message不为空,就显示它。
<g:paginate>
标记
在数据库包含的 Book 比当前显示的 10 条记录多时,显示 “前一个” 和 “下一个” 链接。
<g:sortableColume>
标记
使列标题变为可单击,从而支持排序。
另外还有<g:form>
和 <g:submit>标记,还有很多可以参见http://blog.csdn.NET/yss19900512/article/details/47054609