在在spring web项目中使用json视图中,写了个最简单的json示例。现在输出的内容复杂一些,比如类图关系如下:
代码见:
http://easymorse.googlecode.com/svn/tags/spring.json.demo-0.2
返回值如下:
{"page":{"results":[{"authors":[{"name":"张三","id":"1"},{"name":"李四","id":"2"}],"name":"五百年来谁著史","id":"1"}],"pageNo":2}}
在在gwt json中使用复杂结构的对象及相关日志中,尝试了在gwt中使用json数据。那么如何通过服务器端生成json数据呢?
因为以前一直使用spring和spring web框架,因此希望有一种办法,可以集成到spring中生成json视图。
比较成熟的办法是,使用spring-json view,见:
在试用该api时出现了一些问题,比如war示例文件下载不全,缺少最新版本的maven支持等,其实这些都不是什么大问题。
spring-json比较复杂,和spring 3.0中的REST方式使用json比较起来。因此,决定直接升级使用spring3.0的json支持。
在只适用gwt的情况下,我这里是2.0版本,占用带宽还是很小的。
如果使用smartgwt,则需要很大的带宽。
如果是做互联网应用项目,第一次加载是十分耗时的。
gwt提供了一套完整的本地化/国际化机制。
如果要在日期组件上使用比如中文,需要做简单的设置。
最简单的办法是直接在url中增加参数,比如我这里:
http://localhost:8888/Gwt_json_demo.html?gwt.codesvr=127.0.1.1:9997&locale=zh_CN
这里增加了locale=zh_CN,即可让组件显示中文。这里还要配置一个内容在module xml文件中:
<extend-property name="locale" values="zh_CN" />
如果不想在url中设置locale参数,也可以在module xml文件中增加一个默认设置:
<set-property-fallback name="locale" value="zh_CN"/>
这样日期组件,比如DatePicker,将显示中文。
在使用gwt javascript overlay types特性编写json应用中使用了简单对象,在gwt json使用集合类型中使用了集合。那么,一般来说一个名词对象(领域模型对象)是个复杂的对象,即不是简单的基本型数据键值对,也不是一个简单的集合。而是成员包括复杂对象和集合的对象。比如,表示一个分页的对象的json表示:
{
"pageNumber":"2",
"results":[
{ "name" : "张三"},
{ "name" : "李四"}
]
}
在使用gwt javascript overlay types特性编写json应用中使用了javascript overlay types特性,但是只从服务器端返回了单一的avascript对象。如果是一个集合呢?比如:
[
{ "name" : "张三"},
{ "name" : "李四"}
]
在gwt使用json替代rpc的简单示例中,使用gwt json可以将json字符串解析为java对象,但是这比较繁琐。比如:
JSONParser.parse(response.getText()).isObject().get("name").isString().stringValue()
从gwt 1.5开始引入了javascript overlay types特性,见:
http://code.google.com/intl/zh-CN/webtoolkit/doc/latest/DevGuideCodingBasicsOverlay.html
gwt可以通过rpc方式实现客户端和服务器端的通信,而且实现简单快速。
rpc方式很适合一个人开发整个应用,包括服务器端和客户端部分。
但是如果多人分工开发,有写客户端部分的,有写服务器端部分的,就比较麻烦。主要是实体类(域对象)由谁来写。如果是服务器端人员写,那么一定要放在指定的包下,而且要提供源代码。
这样限制了服务器端开发必须和客户端开发必须是写一个项目。当然也可以分开成不同项目,那样客户端开发人员要写自己的实体类,很麻烦。
spring集成gwt,没有官方的解决方案,无论spring还是gwt。
在这里使用了第三方的一个集成方法,见:
使用的步骤为,首先,需要将该项目的jar文件放置到WEB-INF/lib目录下。
使用spring 2.5,以前用junit 4.4,这次在maven中将依赖类库写为4.7版本,结果看到类似这样的报错:
org.apache.maven.surefire.booter.SurefireExecutionException: org/junit/Assume$AssumptionViolatedException; nested exception is java.lang.NoClassDefFoundError: org/junit/Assume$AssumptionViolatedException
java.lang.NoClassDefFoundError: org/junit/Assume$AssumptionViolatedException
at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:240)
查了一下原因,见:
这个问题在最新的spring 3.0版本中得到解决。
但是我们依然用2.5.6版本的spring,因此将junit改回为4.4版本。问题解决。