2009-08-30 120 views
8

許多可用的控制器方法(鏈,轉發,重定向)取一個圖,其可以包括鍵,諸如:Grails的控制器方法

  • ID
  • PARAMS
  • 模型

關於這些的幾個問題:

  • 'id'只是一個一個名爲'id'的請求參數的別名?換句話說,是否有任何區別:

chain(controller: "member", action: "showProfile", params: [id: memberId])

chain(controller: "member", action: "showProfile", id: memberId)

  • chain方法(除其他可能)允許傳遞的模型和/或PARAMS(地圖)從控制器動作A到B.實際上,通過參數和模型地圖將數據從動作A傳遞到B有什麼區別?另外,如果數據在模型圖中傳遞,如何在控制器操作B中訪問它?

回答

7

'id'來自UrlMappings條目,如「/ $ controller/$ action?/ $ id?」 - 使用情況見http://docs.grails.org/latest/guide/single.html#urlmappings

Params是查詢字符串參數或表單發佈參數,可以在非Grails應用程序中使用「request.getParameter('foo')」訪問,但在Grails中簡化爲「params.foo」。模型映射的內容作爲屬性存儲在Request中,使用「request.getAttribute('foo')」在非Grails應用程序中訪問,但在Grails中簡化爲「request.foo」,或者更直接地在GSP中直接訪問。 「$ {}富」。

+1

我看了看文檔,好像id實際上是一個請求參數,即你可以使用'params.id'在控制器中訪問它。這與你的理解一致嗎? – 2009-08-31 16:21:06

9

Burt說的一切都是正確的。另外,你想要做一個鏈(如果你有一個模型)或重定向(如果你沒有模型保留)的原因是因爲這兩個方法都返回一個302重定向響應給瀏覽器。瀏覽器然後知道要求下一頁。

然後它在結果頁面的標題中包含正確的url,而不是來自原始請求所來自的頁面的url。

此模式在POST信息後非常有用,因爲它避免了書籤的各種麻煩,並且在用戶在生成的頁面上點擊刷新時重新提交信息。例如:如果您正在保存一本書,並且您希望在成功保存書籍的情況下呈現列表頁面。如果你只是在你的方法中調用「controller.list()」,它會向用戶顯示被渲染的書的列表,但url欄仍然會顯示「.../book/save」。這不適合書籤或重新加載。相反,調用redirect/chain會向瀏覽器發送302響應,告訴它要求輸入「.../book/list」頁面。所有變量(您的模型和其他Flash消息)都在閃光範圍內,因此它們仍然可供您的模型/視圖使用,並且世界上的任何事情都很快樂。

這種模式被稱爲Post/Redirect/Get