spring mvc Ajax 的运用以及遇到的问题

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-Typeapplication/json,记得在Ajax里设置好请求头。基本到现在就可以了。





你可能感兴趣的:(spring mvc Ajax 的运用以及遇到的问题)