使用render方法輸出XML
Grails支持一些不同的方法來產(chǎn)生XML和JSON響應。第一個是隱式的通過render方法。
render
方法可以傳遞一個代碼塊來執(zhí)行標記生成器產(chǎn)生XML
def list = { def results = Book.list() render(contentType:"text/xml") { books { for(b in results) { book(title:b.title) } } } }
這段代碼的結(jié)果將會像這樣:
<books> <book title="The Stand" /> <book title="The Shining" /> </books>
注意,當你使用標記生成器時,必須小心避免命名沖突。例如,這段代碼將產(chǎn)生一個錯誤:
def list = { def books = Book.list() // naming conflict here render(contentType:"text/xml") { books { for(b in results) { book(title:b.title) } } } }
原因是,這里的一個本地變量books
企圖作為方法被調(diào)用。
使用render方法輸出JSON
render
方法可以同樣被用于輸出JSON:
def list = { def results = Book.list() render(contentType:"text/json") { books { for(b in results) { book(title:b.title) } } } }
在這種情況下,結(jié)果就會是大致相同的:
[ {title:"The Stand"}, {title:"The Shining"} ]
同樣的命名沖突危險適用于JSON生成器。
自動XML列集(Marshalling)
(譯者注:在此附上對于列集(Marshalling)解釋:對函數(shù)參數(shù)進行打包處理得過程,因為指針等數(shù)據(jù),必須通過一定得轉(zhuǎn)換,才能被另一組件所理解。可以說列集(Marshalling)是一種數(shù)據(jù)格式的轉(zhuǎn)換方法。)
Grails同樣支持自動列集(Marshalling)領域類為XML通過特定的轉(zhuǎn)換器。
首先,導入grails.converters
類包到你的控制器(Controllers)中:
import grails.converters.*
現(xiàn)在,你可以使用下列高度易讀的語法來自動轉(zhuǎn)換領域類成XML:
render Book.list() as XML
輸出結(jié)果看上去會像下列這樣:
<?xml version="1.0" encoding="ISO-8859-1"?> <list> <book id="1"> <author>Stephen King</author> <title>The Stand</title> </book> <book id="2"> <author>Stephen King</author> <title>The Shining</title> </book> </list>
一個使用轉(zhuǎn)換器的替代方法是使用Grails的codecs特性。codecs特性提供了encodeAsXML和encodeAsJSON方法:
def xml = Book.list().encodeAsXML() render xml
自動JSON列集(Marshalling)
Grails同樣支持自動列集(Marshalling)為JSON通過同樣的機制。簡單替代XML
為JSON
render Book.list() as JSON
輸出結(jié)果看上去會像下列這樣:
[ {"id":1, "class":"Book", "author":"Stephen King", "title":"The Stand"}, {"id":2, "class":"Book", "author":"Stephen King", "releaseDate":new Date(1194127343161), "title":"The Shining"} ]
再次作為一種替代,你可以使用encodeAsJSON
達到相同的效果