import grails.converters.XML
class BookController {
def list() {
def books = Book.list()
withFormat {
html bookList:books
js { render "alert('hello')" }
xml { render books as XML }
}
}
}
withFormat
目的
根據傳入請求的 Accept
標頭、格式參數或 URI 副檔名,呈現不同的回應。請參閱 內容協商 以取得更多資訊。
範例
說明
withFormat
接受一個 Closure,其中包含與您想要回應的不同內容類型對應的方法。例如
withFormat {
html bookList: books
js { render "alert('hello')" }
xml { render books as XML }
}
在此,我們呼叫三個方法,分別稱為 html
、js
和 xml
,這些方法使用在 grails-app/conf/application.yml
中設定的 MIME 類型名稱(請參閱 內容協商 以取得更多資訊)。呼叫 html
會接受一個模型(一個 Map),並傳遞給檢視。Grails 會搜尋一個稱為 grails-app/views/book/list.html.gsp
的檢視,如果找不到,就會退回到 grails-app/views/book/list.gsp
。
請注意,如果請求格式為「全部」或在接受標頭中有多個內容類型具有相同的「q」評級,則類型順序很重要。在前一種情況下,會執行區塊中的第一個類型處理常式(在上述簡短範例中為「html」)。後一種情況比較令人困惑,因為它僅適用於下列情況:有多個內容類型具有最高的「q」評級,而您有一個類型處理常式,而且您有多個類型處理常式符合該「q」評級。例如,如果請求具有「q」評級為 1.0 的「text/html」和「application/xml」,則此程式碼
withFormat {
xml { ... }
html { ... }
}
將對請求使用「xml」類型處理常式。
另一個要注意的重要因素是,withFormat
方法處理的是回應格式,而不是請求格式。從 Grails 2.0 開始,request
上提供了一個獨立的 withFormat
方法,您可以使用它來處理請求格式,而請求格式是由請求的 CONTENT_TYPE
標頭決定的
request.withFormat {
form { .. }
xml { .. }
json { .. }
}
form 的請求格式用於處理內容協商中的表單提交,而不是 html 。
|
如果您需要模型被延遲執行,您可以傳遞一個 Closure 而不是一個 Map
withFormat {
html { [bookList: Book.list()] }
...
}
這樣,只有在 html
格式匹配時,才會執行 html
Closure。
除非您在 application.groovy 檔案中新增 grails.mime.use.accept.header = true 設定,否則 Grails 會忽略 HTTP Accept 標頭。換句話說,沒有該設定,withFormat() 將完全不受 Accept 標頭影響。
|