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
…
}
}