什么是Spring Json View?
Spring json-view 为Spring-MVC提供了对JavaScript Object Notation (json) 的支持,它深入地集成在Spring MVC模块里,能够适用于所有标准的控制器类。
在Web 2.0 Ajax 时代里常见的方式是客户(浏览器)和服务器的交互。在Java服务器端通常把Spring MVC看成是一个标准的web框架。他们尝试通过Spring MVC和Json方式的视图结合成为一个方案,比如Json-Lib-Ext-Spring。
在我们第一个Web2.0工程里我们寻找一种方式使用服务器端Spring-MVC的知识接收和响应Ajax请求。但是没有一个令苛刻的Spring MVC开发者们感到满意。所以我们开始探索Spring Json-View用于支持所有Spring MVC特性。
spring-json 1.0 增加到Maven2的下载库,地址如下:
http://spring-json.sourceforge.net/repository
哪些不同点?
Spring Json View 深入地集成在Spring MVC模块里。它能够适用于所有的SpringMVC支持(如SimpleFormController)的标准控制器类。
配置
它通过SpringXml方式配置
绑定
它支持用Spring方式把Bean属性转换到View里。(请参见SimpleFormController的initBinder()方法)
集成了普遍的Json组件。它现在默认支持Sojo,当然还有JsonLib
校验
它支持用ValidatorBeans Spring 方式的校验
错误处理
它支持Spring方式错误处理,包括全局、字段和绑定错误。
异常处理
它使用 JsonExceptionResolver支持 Spring 方式的异常处理。
通过它你只要改变视图而不必改变后台编码就能把典型Spring应用转换为典型Web2.0应用。
文档中心
Spring json-view 为Spring-MVC提供了对JavaScript Object Notation (json) 的支持,它能让你像平时使用spring-mvc一样使用。现在它能够让你的基于Ajax的前端工具更容易提取(服务器端)数据。
基本上,它是通过AbstractView实现的。现在它增加了Spring BindingResult(结果绑定),Field 和GlobalErrors(字段和公共错误信息),完成校验和一个将属性值转换成显示字符串的属性编辑器。但是它也可以提供一些有用的特性为Ajax-Frameworks服务。比如,类似prototype的错误处理。当然还有转换成Json 字符串的Model。
查看演示程序可以获得实用的例子。
------------------------目录----------------------------
绑定
1.用法说明
2.JsonStringWriter
1.SojoJsonStringWriter
2.JsonlibJsonStringWriter
3.比较
校验
1. Spring MVC 校验样例
错误处理
1.配置概述
2.Http状态错误
3.模型标记错误
4.自主实现的Json错误处理器
异常处理
1.配置概述
2.Json错误处理器
3.Json异常处理器
1.ExceptionMessageExceptionHandler(异常消息异常处理器)
2.StackTraceExceptionHandler (堆栈异常处理器)
3.自定义实现JsonExceptionHandler
其它配置
1.容器类型支持(ContentType)
2.编码支持(Encoding )
绑定-数据类型转换
1.用法说明
2.JsonStringWriter
2.1.SojoJsonStringWriter
2.2.JsonlibJsonStringWriter
3.比较
1. 用法说明
你可以从Spring Command 和FormController中实现你知道的绑定方式。通常你在ServletRequestDataBander中用控制器的初始绑定方法定义一个自定义对象.
你能绑定的CustomEditor包括默认的Spring-MVC提供了如下对象绑定到CustomEditor:
- 像java.util.Date普通数据类型的类
- 能按CommensBeanUtils-Syntax匹配ComandBean字段的类
@Override
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws Exception{
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
CustomDateEditor editor = new CustomDateEditor(dateFormat, true);
binder.registerCustomEditor(Date.class, editor);
binder.registerCustomEditor(Date.class, "birthday", editor);
}
2. JsonStringWriter
JsonStringWriter 控制 模型/Command对象间值的转换,当然,还有生成Json字符串。JsonStringWriter 最大限度地保持着这种在Spring MVC所知道的自定义编辑器的注册方式。在已经存在Json库的那些数据格式转换的特性没有找到完全符合我们需要的特性。在另外协助的库支持的特殊特性你又不得不使用。所以你将发现依照JsonStringWriter的实现绑定支持的不同。在下面的章节你会发现它们如何帮助你去选择一个JsonStringWriter。
2.1 SojoJsonStringWriter - Sojo Json 支持
SojoJsonWriter 是Spring Json-View 的默认实现。它是一个通过Sojo Json 方式传输和接近默认Spring-MVC绑定方式的整合方案。
你可以按如下方式绑定自定义编辑器:
1. 像java.util.Date普通数据类型的类
2. 能按CommensBeanUtils-Syntax匹配ComandBean字段的类
3. 可选:像那些附加referenceData-method的Model中任意其它类
2.2 JsonlibJsonStringWriter - Json-Lib支持
JsonlibJsonStringWriter 提供了Json-Lib框架到Spring Json-View的集成。我没有发现它有按CommensBeanUtils-Syntax匹配ComandBean实现本地化属性的方法。但是你可以通过注册一个JsonlibJsonWriterConfiguratorTemplat从而操纵Json-Lib框架。它被封装在一个net.sf.json.JsonConfig对象里。更多信息请参见Json-lib 主页。
你可以按如下方式绑定自定义编辑器:
1. 像java.util.Date普通数据类型的对象 (it converts the howl model map.)
2. 可选:通过JsonlibJsonWriterConfiguratorTemplate注册一个自定义的"net.sf.json.JsonConfig" 对象。
3 比较
|
SojoJsonStringWriter |
JsonlibJsonStringWriter |
Supported library |
SOJO-0.5.0 |
JSON-lib-2.2.1 |
Default Writer |
yes |
no |
ComandBean conversion |
|
|
Convert class types |
yes |
yes |
Properties located by Commons BeanUtils syntax |
yes |
no |
Other model map properties conversion |
|
|
Convert class types |
optional |
always |
Properties located by |
optional |
no |
JsonWriterConfiguratorTemplate |
optional |
optional |
SojoJsonWriter - Sojo Json 支持
1. 绪论
2. 简单绑定
3. 使用CommandBean-Property绑定
4. 转换所有Model Values.
1. Model-Map通过CustomEditor转换所有值
2. Model-Map通过CustomEditor转换特殊值
1. 绪论
SojoJsonWriter 是Spring Json-View 的默认实现。它是一个通过Sojo Json 方式传输和接近默认Spring-MVC绑定方式的整合方案。
你可以按如下方式绑定自定义编辑器:
1. 像java.util.Date普通数据类型的类
2. 能按CommensBeanUtils-Syntax匹配ComandBean字段的类
3. 可选:像那些附加referenceData-method的Model中任意其它类
注意:
Spring Json View 不能绑定如下例Bean中Collection类型中的属性
* Spring提供的写法:
bean.list.property
这个语法是找出conllection中从0-n的所有属性
* Spring Json View 能找出像下面这样使用解释型索引的Collection-Beans的属性:
bean.list[0].property
bean.set[1].list[2].property
2. 简单绑定
initBinder 源文件:
=================
@Override
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws Exception{
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
CustomDateEditor editor = new CustomDateEditor(dateFormat, true);
binder.registerCustomEditor(Date.class, editor);
}
结果:
=======
{"command":{
"birthday":"30-01-2008",
"marriage":"30-01-2008",
"placeofbirth":"Sydney"
}}
3. 使用CommandBean-Property绑定
按CommonsBeanUtils-Syntax 找出CommandBean中的属性
initBinder 源文件:
==================
@Override
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder) throws Exception{
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
CustomDateEditor editor = new CustomDateEditor(dateFormat, true);
binder.registerCustomEditor(Date.class, "birthday", editor);
}
结果:
======
{"command":{
"birthday":"30-01-2008",
"marriage":"Wed Jan 30 00:00:00 GMT 2008",
"placeofbirth":"Sydney"
}}
4. 转换所有Model的值
SojoJsonStringWriter 已经提供对非CommandBean-Values在Model Map 随意的转换。你可以利用这个特性在view.xml用JsonWriter- Bean设置convertAllMapValues 属性。
你能在一个CustomEditor定义的字段利用non_commandbean_key找到它们。
* (name_in_model_map_key).property
* (key).list[1].property
配置文件
<beans>
<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">
<property name="jsonWriter"><ref bean="jsonWriter"/></property>
</bean>
<bean name="jsonWriter"
class="org.springframework.web.servlet.view.json.writer.sojo.SojoJsonStringWriter">
<property name="convertAllMapValues"><value>true</value></property>
</bean>
</beans>
4.1 Model-Map通过CustomEditor转换所有值