注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

Grails对JSON的处理  

2010-09-15 22:10:38|  分类: Groovy |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
利用Grails中的render就可以返回JSON数据
例如:

render(contentType:"text/json") { book(title:b.title,author:b.author)}

直接看Grails文档 6.18 More on JSONBuilder

Grails1.2以前用的是一个旧的JSONBuilder 现在已经不建议使用

如果要使用1.2以后的新的JSONBuilder 需要配置

Config.groovy 中的 grails.json.legacy.builder=false

先看一下官方给的简单的例子

render(contentType:"text/json") {
hello = "world"
}
生成的JSON {"hello":"world"}

Grails的JSONBuilder就介绍这麽多 (更详细的介绍直接看文档吧)

如何利用JSONBuilder
现在就来一个复杂的例子(应用YUI2.8 的DataTable)

YUI的DataTable 动态数据例子的URL地址
http://developer.yahoo.com/yui/examples/datatable/dt_dynamicdata.html

它的JSON数据形式如下
1 {"recordsReturned":25, 
2     "totalRecords":1397, 
3     "startIndex":0, 
4     "sort":null, 
5     "dir":"asc", 
6     "pageSize":10, 
7     "records":[ 
8         {"id":"0", 
9         "name":"xmlqoyzgmykrphvyiz", 
10         "date":"13-Sep-2002", 
11         "price":"8370", 
12         "number":"8056", 
13         "address":"qdfbc", 
14         "company":"taufrid", 
15         "desc":"pppzhfhcdqcvbirw", 
16         "age":"5512", 
17         "title":"zticbcd", 
18         "phone":"hvdkltabshgakjqmfrvxo", 
19         "email":"eodnqepua", 
20         "zip":"eodnqepua", 
21         "country":"pdibxicpqipbsgnxyjumsza"}, 
22         ... 
23     ] 
24
看来我们只需要用render 返回类似于上面的结构的JSON数据
先写一个DataTable的gsp页面(引入的CSS最后没起作用)
code如下

<%@ page import="racetrack.Race" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="layout" content="main" />
<g:set var="entityName" value="${message(code: 'race.label', default: 'Race')}" />
<title><g:message code="default.list.label" args="[entityName]" /></title>
<link rel="stylesheet" href="${resource(dir:'css/yui/fonts',file:'fonts-min.css')}" />
<link rel="stylesheet" href="${resource(dir:'css/yui/paginator/assets/skins/sam',file:'paginator.css')}" />
<link rel="stylesheet" href="${resource(dir:'css/yui/datatable/assets/skins/sam',file:'datatable.css')}" />
<g:javascript src="yui/yahoo-dom-event/yahoo-dom-event.js" />
<g:javascript src="yui/connection/connection-min.js" />
<g:javascript src="yui/json/json-min.js" />
<g:javascript src="yui/element/element-min.js" />
<g:javascript src="yui/paginator/paginator-min.js" />
<g:javascript src="yui/datasource/datasource-min.js" />
<g:javascript src="yui/datatable/datatable-min.js" />

</head>
<body
<div id="dataTable"></div>
<script type="text/javascript">
dynamicData = function() {
// Column definitions
var myColumnDefs = [ // sortable:true enables sorting
{key:"name", label:"Name", sortable:true},
{key:"startDateTime", label:"startDateTime", sortable:true},
{key:"city", label:"City", sortable:true},
{key:"state", label:"State", sortable:true},
{key:"distance", label:"Distance", sortable:true},
{key:"cost", label:"Cost", sortable:true},
{key:"maxRunners", label:"Max Runners", sortable:true}
];


// DataSource instance
var myDataSource = new YAHOO.util.DataSource("yuiList?");
myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
myDataSource.responseSchema = {
resultsList: "records",
fields: [
{key:"name"},
{key:"startDateTime"},
{key:"city"},
{key:"state"},
{key:"distance",parser:"number"},
{key:"cost",parser:"number"},
{key:"maxRunners",parser:"number"}
],
metaFields: {
totalRecords: "totalRecords" // Access to value in the server response
}
};

// DataTable configuration
var myConfigs = {
initialRequest: "sort=name&dir=asc&startIndex=0&results=10", // Initial request for first page of data
dynamicData: true, // Enables dynamic server-driven data
sortedBy : {key:"name", dir:YAHOO.widget.DataTable.CLASS_ASC}, // Sets UI initial sort arrow
paginator: new YAHOO.widget.Paginator({ rowsPerPage:10 }) // Enables pagination
};

// DataTable instance
var myDataTable = new YAHOO.widget.DataTable("dataTable", myColumnDefs, myDataSource, myConfigs);
// Update totalRecords on the fly with value from server
myDataTable.handleDataReturnPayload = function(oRequest, oResponse, oPayload) {
oPayload.totalRecords = oResponse.meta.totalRecords;
return oPayload;
}

return {
ds: myDataSource,
dt: myDataTable
};

}();
</script>

</body>
</html>


Action端的代码

def yuiList={

render(contentType:"text/json") {
recordsReturned = params.results
totalRecords = Race.count()
startIndex = params.startIndex
sort = params.sort
dir = params.dir
pageSize = 5
records = Race.list(max:params.results,offset:params.startIndex,sort:params.sort,order:params.dir)
}
}


结果如图

  Grails对JSON的处理 - zhenghaoju700 - zhenghaoju700 的博客

最后发现YUI的CSS样式没有起到作用 而是用的Grails本身的样式
可能是SiteMesh的原因 具体原因还没找到 等以后在解答

如果去掉页面中加的SiteMesh的
<meta name="layout" content="main" />
YUI的CSS样式便会恢复 如图

  Grails对JSON的处理 - zhenghaoju700 - zhenghaoju700 的博客

因为不了解Sitemesh的用法 所以原因暂时还不知道
  评论这张
 
阅读(2039)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017