2014-10-08 65 views
2

grails documentation实施“拯救”行动有下面的代码片段:Grails - 重定向如何工作?

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(创建)返回。

我很好奇重定向部分和HTML。在代码中有域对象(书)作为参数传递给重定向方法。执行后,我们被重定向到保存的书的详细信息。

我想,上面的重定向代码就相当于:

redirect(action: "show", id: book.id) 

那么如何的Grails知道什么是“原产资源”?是否有与响应方法和内容协商相似的行为?

很抱歉,我无法在redirect method documentation找到答案。

回答

3

经过一段时间的debbuging和grepping Grails代码,我找到了答案。我也发现这个帖子:http://www.bl-nk.net/2014/04/explicit-redirect-grails/这是有帮助的。

Redirect方法超载并有两种形式:

  • 首先public Object redirect(Object instance,Map args)需要的参数图和是有据可查的。
  • public Object redirect(Object instance,Object object)需要一个对象,如果它是一个域类,然后grails重定向显示相应的控制器的视图。这是我正在寻找的方法。它是在引进提交的最新版本(2.4.3)发布重定向方法的750b360bb242605c1e701a78af9d1bb7e42eeeca

实施可以发现here

1

即信息是其中针对每个请求创建的,部分地由Grails和部分地由所述弹簧可用org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest(Grails的类扩展Spring的org.springframework.web.servlet.handler.DispatcherServletWebRequest)和实例在一个ThreadLocal提供。因此,由于每个请求都在它自己的线程上,它们都是彼此隔离的,并且如果知道线程本地机器的位置,访问数据很方便。 Spring Security的SecurityContext,Hibernate的Session,任何当前正在运行的事务以及活动的JDBC连接(如果借用的)都是存储在众所周知的线程本地密钥下的数据的其他示例,以方便访问。

GrailsWebRequestGrailsParameterMap实例 - 这是params地图,你在控制器看,如果你从一个控制器操作运行println params你会看到,除了你的放慢参数值,控制器和动作的名称是有太多。它还具有对请求,响应,会话等的引用。因此,从中很容易知道当前状态。

+0

当我重定向我看到'之前运行'的println params' [动作:保存,控制器:书]'。所以我很好奇,下一步如何将'save'这个动作替换为'show',因为我现在从未创建实体。例如,为什么它是'表演'而不是'索引'?我知道重定向到'show'的约定,但是当我调用'redirect bookList'时会发生什么? – 2014-10-08 10:59:21

+0

控制器方法在编译时被添加,主要来自'org.codehaus.groovy.grails.plugins.web.api.ControllersApi'。 'public object redirect(Object instance,Object object)'是你在这种情况下调用的那个;在第一个参数中合并代码集“this”(当前控制器)的AST转换,而域类在第二个参数中。从那里你最终会在'org.codehaus.groovy.grails.web.metaclass.RedirectDynamicMethod'完成一些工作,并将它交给'ResponseRedirector'来发送重定向。 – 2014-10-08 12:12:05

+0

谢谢。在调试的第一时间,我跳过了'ControllersApi',感觉到'RedirectDynamicMethod'和'ResponseRedirector'。然后我甚至见过'DefaultLinkGenerator'。所以我忽略了'ControllersApi'中最重要的部分。 – 2014-10-08 12:45:44