Spring mvc 3.x版本,在支持Ajax方面还是不错的,看文档我们发现,只要我们在Controller里添加@RequestBody 和@ResponseBody两个标签后,就能把前台传过来的JSON对象进行转换成我们的java对象,也能将spring mvc里面的model直接返回回Ajax请求,转换器会自动的帮我们将java对象转换成JSON对象。
需要的jar包 : jackson-mapper-asl-1.8.4.jar
jackson-core-asl-1.8.5.jar
这是DispatcherServlet的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置这个component-scan 的时候,会隐式的配置了下面2个bean AutowiredAnnotationBeanPostProcessor :用于@Autowired标签为field注入依赖。 CommonAnnotationBeanPostProcessor --> <context:component-scan base-package="com.line.web.*"/> <!-- 配置注解式的Handler spring 3.1之前使用的是下面两个 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> spring 3.1之后默认注入的是 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> --> <!-- 默认配置注解式的Handler--> <mvc:annotation-driven/> <!-- 配置视图处理器,用于处理controller返回的视图 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="WEB-INF/view/"/> <property name="suffix" value=".jsp"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> </bean> <!-- 配置静态文件处理器 --> <mvc:resources location="/public/img/" mapping="public/img/**"/> <mvc:resources location="/public/js/" mapping="public/js/**"/> <mvc:resources location="/public/css/" mapping="public/css/**"/> <mvc:resources location="/public/file/" mapping="public/file/**"/> </beans>
想要让我们的项目支持JSON数据的话,必须做一些配置
//spring 3.1之前的需要这样配置 //方案一 <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" p:supportedMediaTypes="*/*" /> </mvc:message-converters> </mvc:annotation-driven> //方案二 显式的定义messageConverters <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> </list> </property> </bean>
//spring 3.1之后的版本 //方案一 <mvc:annotation-driven/> //方案二 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" p:ignoreDefaultModelOnRedirect="true" > <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/> </list> </property> </bean>
配置好后,我们的Controller只要这样配置就星了
package com.line.web.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import com.line.web.model.User; import com.line.web.service.UserService; @Controller @RequestMapping("/user") public class UserManagerController{ @Autowired private UserService userService; @RequestMapping(value="/login",method=RequestMethod.POST) public @ResponseBody ModelMap login(@RequestBody User a,ModelMap model){ String account = a.getAccount(); String password = a.getPassword(); System.out.println("account: " + account); System.out.println("password: " + password); if( !userService.checkFormat(account, password)){ model.addAttribute("errorMsg","账号和密码不能为空,且不带特殊字符"); return model; } User user = userService.verification(account, password); if(user != null){ model.addAttribute("user",user); model.addAttribute("userId",user.getId()); }else{ model.addAttribute("errorMsg","账户不存在或密码错误!"); } return model; } }
class User{ private String account; private String password; public String getAccount(){ return account; } public String getPassword(){ return password; } public void setPassword(String password){ this.password = password; } public void setPassword(String account){ this.account = account; } }
页面的ajax只要向下面写就行
$.ajax({ url: "user/login", type:"POST", cache:false, headers:{ 'Content-Type':'application/json', 'Accept':'application/json' }, dataType:"json", /* 有问题的版本 data: { 'account' : $("#lg-account").val(), 'password' : $("#lg-psw").val() }, */ data: JSON.stringify({ 'account' : $("#lg-account").val(), 'password' : $("#lg-psw").val() }), error: function(){}, success: function(data){} });
这里再说一下在配置中可能出现的错误,比如406和415,分别是“无法接受”以及“不支持媒体类型”,看到这里大家都可能猜到可能是json的问题,我们首要排除的是,我们的jar包引进来了没有,因为这个和json的转换息息相关,这部分没有问题后,前面Ajax代码注释里有提到一个有问题的版本,本来查了一下JQuery它的ajax函数里的data只接受spring或者plainObject ,这里的plainObject在经过spring 转换器转换的时候就有问题了,所以我们必须要先将我们的JSON序列化了,也就是JSON.stringify()这个方法。如果到这里还有406的问题,那么看一下你的http请求头里面Content-Type是application/json,记得在Ajax里设置好请求头。基本到现在就可以了。