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个方法,分别叫htmljsxml,名字使用了配置文件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格式配置的时候才会被执行。