日期:2014-05-16  浏览次数:20526 次

spring mvc ajax 使用json

spring mvc 3开始,提供了对json的直接支持。这部分的支持功能包括把返回信息转化成json和将request body内容转换成json。
spring 给出了一个svn,里面的一个ajax例子,写的功能挺多的。
https://src.springframework.org/svn/spring-samples/mvc-ajax/trunk/
可以从上面的地址下载下来运行。这是个maven应用。
就以这个事例做讲解。
spring mvc 3.0不需要任何其他配置,添加一个jackson的架包
,既可以支持的。

org.codehaus.jacksonjackson-mapper-asl1.6.4
@RequestMapping(method = RequestMethod.GET)
public String getCreateForm(Model model) {
model.addAttribute(new Account());
return "account/createForm";
}
这个方法,当默认访问/account的时候会进入,它会返回account/createForm,这个逻辑视图是一个叫createForm的页面,会生成表单。
$(document).ready(function() {
??? // check name availability on focus lost
??? $('#name').blur(function() {
??????? checkAvailability();
??? });
});
这个页面中有这段内容。是在name字段丢失焦点,触发检查。
function checkAvailability() {
??? $.getJSON("account/availability", { name: $('#name').val() }, function(availability) {
?????? if (availability.available) {
??????????? fieldValidated("name", { valid : true });
??????? } else {
??????????? fieldValidated("name", { valid : false,
??????????????? message : $('#name').val() + " is not available, try " + availability.suggestions });
??????? }
??? });
}
$.getJSON("account/availability", { name: $('#name').val() }, 这里调用的getJSON比较重要,因为它将请求的头信息写入 accpet : application/json, text/javascript, */*,
accpet : application/json这句是重点。如果没有这句,浏览器解析到的response的ContentType 和 head accpet 都是 ,application/json(因为ResponseBody注解,return 的非String 非ModelAndView类型的时候默认设置为json,它会设置content-type为Content-Type:application/json;charset=UTF-8),而request的头信息的accpet不是application/json,那么浏览器发现application开头的contxt-type就会提醒你是否保存,而对于ajax调用,这个是否保存的按钮不会出现(涉及到安全问题)那么你的这个ajax是无法收到返回的内容的(google chrome浏览器除外)。
如图,非ajax访问,就会出现这个。
[img]http://dl.iteye.com/upload/attachment/501599/07420b54-74c9-37f2-9025-e167d995fb5d.jpg" alt="[/img]
对于以上的js不做详细解释。

@RequestMapping(value = "/availability", method = RequestMethod.GET)
public @ResponseBody
AvailabilityStatus getAvailability(@RequestParam String name) {
for (Account a : accounts.values()) {
if (a.getName().equals(name)) {
return AvailabilityStatus.notAvailable(name);
}
}
return AvailabilityStatus.available();
}
这个叫getAvailability的方法。这个方法的请求参数解析和json没关系,因此请求参数 name没有写@RequestBody。
只看方法的定义之前有一个 @ResponseBody。关于这个注解查看我的的 sping mvc连载文章。
AvailabilityStatus是返回类型。这种返回类型由于有@ResponseBody,那么spring将查找相应的HttpMessageConverter类处理,3.0默认的当然是json转换器了。
post提交json格式数据到服务器
[code="javascript"]
$("#account").submit(function() {
var account = $(this).serializeObject();
$.postJSON("account/create", account, function(data) {
alert(data);
$("#assignedId").val(data.id);
showPopup();
});
return false;
});

var account = $(this).serializeObject();这行代码我不给出了,这个是将form表单的字段序列化成json格式。
$.postJSON("account/create", account, function(data)
是json.min.js提供的方法。是以post方式提交的。
[code="java"]
@RequestMapping(value = "/create", method = RequestMethod.POST)
public @ResponseBody
Map create(@RequestBody Account account,
HttpServletResponse response) {
Set> failures = validator
.validate(account);
if (!failures.isEmpty()) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return validationMessages(failures);
} else {
accounts.put(account.assignId(), account);
return Collections.singletonMap("id", account.getId());
}
}

首先返回值是Map
json怎么处理Map的不解释。
@ResponseBody还是一样
@RequestBody Account account,这里的@RequestBody,关于这个注解的其他信息查看我的spring mvc 第一篇。
这个@Reque