withFormat
用途
根据request的Accept
头信息、格式化的参数或URI的扩展名,执行不同的响应,更多信息参考content negotiation。
举例
import grails.converters.*class BookController {
def books
def list = {
this.books = Book.list()
withFormat {
html bookList:books
js { render "alert('hello')" }
xml { render books as XML }
}
}
}
描述
withFormat
方法可以提供一段程序块,这样你就可以根据不同的content type做出不同的响应(不同的方法),如下:
withFormat {
html bookList:books
js { render "alert('hello')" }
xml { render books as XML }
}
这里调用了3个方法,分别叫html
、js
和xml
,名字使用了配置文件grails-app/conf/Config.groovy
中的MIME类型名(参考content negotiation)。html
方法接受一个model(map)参数传递给视图,Grails会首先查找叫grails-app/views/book/list.html.gsp
的视图,如果没有的话再用回grails-app/views/book/list.gsp
视图。
注意,如果请求的格式是"all"或者accept头信息中不止一个content type拥有相同的"q" rating,不同类型的处理方法的顺序就非常重要了。第一种情况第一个格式处理方法会被调用(上面的例子中执行"html"方法);第二种情况更容易混淆,因为对于多个content type具有最高的"q" rating的情况,你可能只有一个方法处理该"q" rating,或者,你有多个处理方法对应该相同的"q" rating。如果说request有"text/html"和"application/xml",他们的"q" rating都是1.0,那么下面的代码:
withFormat {
xml { … }
html { … }
}
会调用"xml"类型方法处理请求。
如果你希望传入的model用lazily方式运行的话,需要传入一个闭包或程序块而不是map作为参数:
withFormat {
html { [bookList:Book.list()] }
…
}
其中的程序块仅仅在html
格式配置的时候才会被执行。