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
临时进行更改。