Grails - 重定向如何工作?

时间:2014-10-08 09:41:28

标签: grails grails-2.0 grails-controller

在段落实施'保存'操作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找到答案。

2 个答案:

答案 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连接(如果借用了它)是存储在众所周知的线程本地密钥下的数据的其他示例,以便于访问。

SecurityContextGrailsWebRequest个实例 - 这是您在控制器中看到的GrailsParameterMap地图,如果您从控制器操作中运行params,您会看到除了参数值,控制器和动作名称也在那里。它还引用了请求,响应,会话等。因此很容易从中了解当前的状态。