Grails 1.1 Web层 - Models(模型)与Views(视图) - 重定向与链接

Redirects

使用redirect方法,Actions(操作)可在所有的控制器(Controller)中重定向:class OverviewController { def login = {} def find = { if(!session.user) redirect(action:login) … } }redirect 方法内部使用HttpServletResonse 对象的sendRedirect方法。

redirect 方法可以选择如下用法之一:

• 同一个控制器(Controller)类中的其他闭包:// 调用同一个类的login action redirect(action:login)• 一个控制器(Controller)和一个操作(Action)的名字:// 重定向到home 控制器(Controller)的index action redirect(controller:'home',action:'index')• 相对于应用程序上下文路径的一个URI资源:// 明确的重定向到URI redirect(uri:"/login.html")• 或者一个完整的URL:
// 重定向到一个URL redirect(url:"http://grails.org")使用方法的params 参数,参数可以选择性的从一个 action传递到下一个:redirect(action:myaction, params:[myparam:"myvalue"])通过 params动态属性,这些方法变得可用,同样也接受request参数。

如果指定一个名字与request参数的名字相同的参数,则 request参数被隐藏,控制器(Controller)参数被使用。

因为 params对象也是一个 map,可以使用它把当前的request参数,从一个 action传递到下一个:redirect(action:"next", params:params)最后,你也可以在一个目标URI上包含一个片段(fragment):redirect(controller: "test", action: "show", fragment: "profile")将(依靠 URL mappings) 导航到/myapp/test/show#profile"。

h4. 链接

Actions同样可以被链接。链接允许model在一个操作(Action)到下一个操作(Action)中保留。

例如下面调用first action :class ExampleChainController { def first = { chain(action:second,model:[one:1]) } def second = { chain(action:third,model:[two:2]) } def third = { [three:3]) } }model的结果:[one:1, two:2, three:3]通过chainModel map,这个 model在chain中会被随后的 控制器(controller)操作(actions)存取. 这个动态属性只存在于随后调用chain方法的操作(actions)中:class ChainController { def nextInChain = { def model = chainModel.myModel … } }