文档章节

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

Line
 Line
发布于 2014/02/27 23:59
字数 965
阅读 3361
收藏 5

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里设置好请求头。基本到现在就可以了。





© 著作权归作者所有

共有 人打赏支持
Line
粉丝 4
博文 13
码字总数 9580
作品 0
汕头
程序员
私信 提问
java web 项目,想在jsp中随时取到一些公共数据, 怎么做?

我在做一个高校社团交流系统,使用spring + spring mvc + hibernate + shiro + sitemesh + maven,现在是这个样子的, 导航条使用了sitemesh 框架统一去装饰 现在遇到的问题就是,导航条中的内...

change_solider
2015/06/02
1K
6
如何成为一名合格的Java工程师?

你想要成为一名合格的Java工程师吗,你知道作为一个Java工程师需要具备哪些核心技能吗,你知道在面试Java岗位的时候面试官会问你哪些专业技能吗? 一、专业技能 1、熟练的使用Java语言进行面...

紫魅编程
2016/09/27
598
2
spring mvc @RequestBody接受post json对象

jq ajax通过post json对象 遇到的HTTP 415/400问题错误解决方案:http://www.linuxidc.com/Linux/2014-04/99928.htm 客户端: <html><head><meta http-equiv="Content-Type" content="text/......

Nob
2014/08/08
0
3
Spring MVC 遇到的问题集锦

本文主要记录一些作者在使用spring mvc过程中遇到的一些以及解决办法,以备日后查询或者供其他网友阅读,每个问题的解决办法肯定不止一种,如果你也遇到过类似问题,并且有独特的见解,我会很...

汉唐
2013/06/15
0
4
springmvc开发过程中遇到的奇怪浏览器问题

最近个人开发一个小的OA项目,属于复习阶段.使用的技术主要是spring mvc作为前端框架,mybatis作为数据库持久化技术.前台使用jquery和一些jquery的插件. 在开发到中间阶段时候发现自己好像忽略...

一个大土豆
2013/08/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos 最小化安装后安装vmtools故障后解决方法

本文测试环境是centos7最小化安装方式。 安装vmtools时提示错误: What is the location of the "ifconfig" program on your machine?。 安装net-tools即可。 安装过程中可能还需要安装gcc,直...

白豆腐徐长卿
16分钟前
0
0
《人月神话》读后感

前两天看完了《人月神话》,最初是被这本书的名字吸引了,然后再在上搜了一下,人月确实是一个神话,那种不可能实现的神话……(!| ̄▽ ̄) 好久没有看过这种每章开始都引用一段名人名言的书了...

ninjaFrog
昨天
4
0
matlab-线性代数 施密特正交化

  matlab : R2018a 64bit     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   code clearclc% 施密特正......

志成就
昨天
3
0
08 分支管理 —— 多人协作

08 分支管理 —— 多人协作 多人协作 本节内容: 查看远程库信息,使用git remote -v;本地新建的分支如果不推送到远程,对其他人就是不可见的;从本地推送分支,使用git push origin bra...

lwenhao
昨天
6
0
开始使用Filebeat

认识Beats Beats是用于单用途数据托运人的平台。它们以轻量级代理的形式安装,并将来自成百上千台机器的数据发送到Logstash或Elasticsearch。 (画外音:通俗地理解,就是采集数据,并上报到...

北极南哥
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部