2014-10-08 66 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