在段落实施'保存'操作的grails documentation中,有以下代码段:
book.save flush:true
withFormat {
html {
flash.message = message(code: 'default.created.message', args: [message(code: 'book.label', default: 'Book'), book.id])
redirect book
}
'*' { render status: CREATED }
}
还有一点需要注意:
在HTML的情况下,向原始资源发出重定向,对于其他格式,返回状态代码201(CREATED)。
我很想知道重定向部分和HTML。在代码中有域对象(book)作为参数传递给redirect方法。执行后,我们将被重定向到已保存图书的详细信息。
我认为上面的重定向代码相当于:
redirect(action: "show", id: book.id)
那么Grails如何知道什么是“原始资源”?对于响应方法和内容协商,是否存在类似的行为?
很遗憾,我无法在redirect method documentation找到答案。
答案 0 :(得分:3)
经过一段时间的重新布局和grepping Grails代码后,我找到了答案。我也发现了这篇文章:http://www.bl-nk.net/2014/04/explicit-redirect-grails/这很有帮助。
重定向方法已重载,有两种形式:
public Object redirect(Object instance,Map args)
获取参数图并有详细记录。public Object redirect(Object instance,Object object)
获取一个对象,如果它是一个域类,则grails重定向以显示相应控制器的视图。这是我正在寻找的方法。它是在提交750b360bb242605c1e701a78af9d1bb7e42eeeca中引入的可以找到最新(2.4.3)版本的重定向方法的实现here
答案 1 :(得分:1)
在org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
中为每个请求创建了这些信息,部分由Grails创建,部分由Spring创建(Grails类扩展了Spring的org.springframework.web.servlet.handler.DispatcherServletWebRequest
),实例在{{{ 1}}。因此,由于每个请求都在自己的线程上,因此它们彼此隔离,如果您知道线程本地的位置,则访问数据很方便。 Spring Security的ThreadLocal
,Hibernate的Session,任何当前正在运行的事务,以及活动的JDBC连接(如果借用了它)是存储在众所周知的线程本地密钥下的数据的其他示例,以便于访问。
SecurityContext
有GrailsWebRequest
个实例 - 这是您在控制器中看到的GrailsParameterMap
地图,如果您从控制器操作中运行params
,您会看到除了参数值,控制器和动作名称也在那里。它还引用了请求,响应,会话等。因此很容易从中了解当前的状态。