领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多在我的上一篇文章中,我向您介绍了 Spring 3 在 Web 应用程序开发方面的多项增强功能。许多人表达了对关注 Ajax 远程调用的后续文章的兴趣。Spring 3 在这方面提供了许多可利用的优势。继续阅读,我将引导您完成整个过程。
出于本文的目的,当我提到 Ajax 时,我指的是 Web 浏览器使用 JavaScript 异步与 Web 服务器通信的能力。在服务器端,Spring 提供了用于定义 Web 服务的编程模型,包括 JavaScript 客户端使用的服务。在客户端方面,如今没有人会自己构建 Ajax 框架。大多数人使用成熟的 JavaScript 框架,例如jQuery 或Dojo。
在 3.0 版本之前,Spring 并未提供对 Ajax 远程调用的支持。但这并没有阻止我们的用户扩展 Spring 以获得它,或者自己集成其他选项。有些人使用了 DWR,特别是在 JavaScript 框架兴起之前的时期。最近,使用 JSON 作为数据交换格式的 REST 风格远程调用变得越来越流行,特别是因为 jQuery 等框架使其变得非常容易。
现在 Spring 3 发布了,作为 Spring MVC 的一部分,官方提供了对使用 JSON 进行 Ajax 远程调用的支持。这包括支持使用 Spring MVC 的 @Controller 编程模型生成 JSON 响应和绑定 JSON 请求。在本文中,我将重点介绍如何使用此支持来实现多个 Ajax 使用案例。就像我上一篇文章一样,我将通过引导您完成一个您可以自己尝试的示例应用程序来实现这一点。
mvc-ajax 旨在说明 Spring MVC 的 JSON 支持。该项目可在我们的spring-samples Subversion 存储库中找到,可以使用 Maven 进行构建,并且可以导入到STS / Eclipse 中。mvc-ajax 与我在上一篇文章中介绍的 mvc-basic 项目具有相同的结构。事实上,这两个项目的 Spring 配置是相同的。
首先将项目导入 IDE,然后将其部署到内置的 Tomcat/tc-server 实例中,然后将项目部署到您的 Servlet 容器并访问 localhost:8080/mvc-ajax 上的欢迎页面以开始您的审查。由于我使用的是 STS,因此我执行了此操作。
在欢迎页面上,激活“Ajax @Controller 示例”链接。您将看到一个用于创建新帐户的表单。当您从“名称”字段切换到其他字段时,您的浏览器将询问服务器您刚刚输入的名称是否可用。如果不可用,则会显示错误消息,并且表单将保持禁用状态,直到您输入一个可用的名称。处理此操作的客户端 JavaScript 位于 /WEB-INF/views/account/createForm.jsp 中,如下所示
$(document).ready(function() {
// check name availability on focus lost
$('#name').blur(function() {
checkAvailability();
});
});
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 });
}
});
}
这里没有 Spring 特定的内容,只是标准的 jQuery JavaScript。
在服务器端,account/availability 资源的控制器是标准的 Java,带有一些 Spring MVC 注解
@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();
}
AvailabilityStatus 是一个普通的 Java 值对象,具有两个属性:一个可用性标志,告诉客户端用户名是否可用,以及一个替代方案数组,如果所需的名称不可用,则建议使用这些替代方案。@ResponseBody 注解指示 Spring MVC 将 AvailabilityStatus 序列化到客户端。由于客户端接受该内容类型,因此 Spring MVC 自动序列化为 JSON。
在幕后,Spring MVC 委托给HttpMessageConverter 来执行序列化。在这种情况下,Spring MVC 调用了基于Jackson JSON 处理器的MappingJacksonHttpMessageConverter。当您使用mvc:annotation-driven 配置元素并且您的类路径中存在 Jackson 时,此实现会自动启用。
很酷,对吧?尝试创建一个帐户,然后使用相同的名称再创建一个。您应该会看到一条错误消息,建议使用备用名称。打开 Firefox 的 Firebug 或 Safari 的 Web Inspector 以调试异步交互。
Spring MVC 还提供对将 JSON 发送到服务器的支持。我发现对这种需求的频率较低,仅仅是因为发布表单参数通常就足够了。然而,JSON 提供了一种灵活的数据交换格式,更丰富的 JavaScript 客户端可以方便地使用。在这些情况下,能够将 JSON 映射到服务器端 Java 对象以进行处理可能是一个有用的功能。
在示例中,一个 JavaScript 事件处理程序拦截表单提交事件并将表单数据作为 JSON 发布。服务器返回新创建的帐户的 ID,然后将其用于显示模态确认对话框
$("#account").submit(function() {
var account = $(this).serializeObject();
$.postJSON("account", account, function(data) {
$("#assignedId").val(data.id);
showPopup();
});
return false;
});
在服务器端,控制器更标准的 Java,带有一些 Spring MVC 注解
@RequestMapping(method=RequestMethod.POST)
public @ResponseBody Map<String, ? extends Object> create(@RequestBody Account account, HttpServletResponse response) {
Set<ConstraintViolation<Account>> 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());
}
}
这里,@RequestBody 注解指示 Spring MVC 将 HTTP 请求的主体映射到 Account 对象。由于客户端将请求内容类型设置为 application/json,因此 Spring MVC 知道从 JSON 映射。
create 方法还验证 Account 对象。如果存在验证错误,则返回 HTTP 400 和错误消息,否则返回 HTTP 200 和分配的帐户 ID。
Spring 3 提供了将 JSON 作为 Spring MVC 模块的一部分的一流 Ajax 支持。这包括支持使用 Spring MVC 的 @Controller 编程模型结合 Jackson JSON 处理器生成 JSON 响应和绑定 JSON 请求。在本文中,我向您展示了此支持的工作原理。我希望您发现这篇文章有用,并期待听到您在自己的应用程序中使用 Spring 3 的更多经验!