1.grails create-app trip-planner
2.
class Trip {
String name
String city
Date startDate
Date endDate
String purpose
String notes
}
3.grails generate-all Trip
生成
class TripController{
...
def list() {
params.max = Math.min(params.max ? params.int('max') : 10, 100)
[tripInstanceList: Trip.list(params), tripInstanceTotal: Trip.count()]
}
...
}
4./demo/grails-app/views/trip/list.gsp
<tbody>
<g:each in="${tripInstanceList}" status="i" var="tripInstance">
<tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
<td><g:link action="show" id="${tripInstance.id}">${fieldValue(bean: tripInstance, field: "city")}</g:link></td>
<td><g:formatDate date="${tripInstance.endDate}" /></td>
<td>${fieldValue(bean: tripInstance, field: "name")}</td>
<td>${fieldValue(bean: tripInstance, field: "notes")}</td>
<td>${fieldValue(bean: tripInstance, field: "purpose")}</td>
<td><g:formatDate date="${tripInstance.startDate}" /></td>
</tr>
</g:each>
</tbody>
tripInstance 就是controller list()中的键
[tripInstanceList: Trip.list(params), tripInstanceTotal: Trip.count()]
5.run-app
http://localhost:8080/demo
6. TripController 中
对控制器的理解可以归结为三个 R :return 、redirect 和 render 。有些动作利用隐式的 return 语句将数据返回到具有相同名称的 GSP 页面。有些动作进行重定向。例如,如果 URL 中未指定动作,则将调用 index
:
def index() {
redirect(action: "list", params: params)
}
在此,TripController
重定向到 list
动作,同时传递 params
hashmap 中的所有的参数(或 QueryString
)。
save()方法重定向到create,
def save() {
def tripInstance = new Trip(params)
if (!tripInstance.save(flush: true)) {
render(view: "create", model: [tripInstance: tripInstance])
return
}
flash.message = message(code: 'default.created.message', args: [message(code: 'trip.label', default: 'Trip'), tripInstance.id])
redirect(action: "show", id: tripInstance.id)
}
7.可以通过输入 grails -Dserver.port=9090 run-app
临时进行更改。