首页 > 代码库 > SpringMVC实现AJax以及RestFull分格

SpringMVC实现AJax以及RestFull分格

1、需要在web.xml中开启put,和delete的支持

  <!-- 浏览器不支持put,delete等method,由该filter将/xxx?_method=delete转换为标准的http delete方法 -->
      <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>   

  2、务必导入jackson的jar包

技术分享

3、jqery发送AJax到springmvc,需要的是json标准格式的字符串,而非json对象,所以得先转成字符串,涉及的发送AJax的几处坑如下:

SpringMVC发送ajax

一般采用$.ajax()方法进行数据发送,主要是因为$.post()方法发送数据的形式得是json对象格式,而$.ajax()方法可以发送字符串形式json另外使用springmvcajax功能千万记得导入jackson2.4版本以上的包,不然报406的错误,采用$.ajax()方法需要注意的几个坑是:

$.ajax({

   url: "${pageContext.request.contextPath}/test.action",

   data:  JSON.stringify(obj), //这也是一处坑,SpringMVC要求为严格形式的json字符串,必须保证json串不能出现畸形

   contentType : ‘application/json;charset=utf-8‘,//这也是一处坑,这里指定发送到服务器端的报文内容形式,默认的urlencoder的,无法传送json,所以传json时必须指定contentType

   type:"post",

   dataType:"json",  //这里是一处坑,dataType为指定响应回来的数据类型,必须是xmljsontexthtml中的一种,不能写错,写错后会造成jqery框架把返回数据转为指定格式失败,而从导致success函数无法调用,但是服务端能接收到数据,也能正常返回,而js端解析数据出错而造成卡死了,但是并没有错误显示

   success:function(data)

      {

        

        }

 });

服务端把json数据装配成pojo对象,是通过@RequestBody注解来实现的,而把pojo对象返回成json对象是通过注解@ResponseBody来实现的,都得一一写上,就算返回的是字符串@ResponseBody也不能漏掉

@RequestMapping("/test.action")

public @ResponseBody User func1(@RequestBody User u)

{ 

return User;

}

其中,发送AJax的contentType 为发送过去的格式,dataType为接收时让jqery转换的格式,一定得指定让其可以正常转换的格式才行,不然不会报错,但是也没有成功的回调响应

4、代码实现:

①、服务端,默认可以不写produces={"application/json;charset=utf-8"},produces是指定响应回客户端的json格式编码,除非返回格式解析乱码

    @RequestMapping(value=http://www.mamicode.com/"/submit",method=RequestMethod.DELETE,produces={"application/json;charset=utf-8"})    
    public @ResponseBody User submit1(@RequestBody User u)
    { 
        System.out.println(u); 
        return new User("004","jerry");
    }
    
    @RequestMapping(value="/submit",method=RequestMethod.POST)    
    public @ResponseBody User submit2( @RequestBody User u)
    { 
        System.out.println(u); 
        return new User("003","jerry");         
    }

②、客户端:

<script type="text/javascript">
	$(function() {
		$("#btn1").click(function() {
			var obj = {
				uid : 1,
				name : ‘jerry1‘
			};
			$.ajax({
				url : ‘${pageContext.request.contextPath}/submit?_method=delete‘,
				type : ‘post‘,
				data : JSON.stringify(obj),
				contentType : ‘application/json;charset=utf-8‘,
				dataType : ‘json‘,
				success : function(data) {
					alert(data.uid);
				}
			});
		});

		$("#btn2").click(function() {
			var obj = {
				uid : 2,
				name : ‘jerry2‘
			};
			$.ajax({
				url : ‘${pageContext.request.contextPath}/submit‘,
				type : ‘post‘,
				data : JSON.stringify(obj),
				contentType : ‘application/json;charset=utf-8‘,
				dataType : ‘json‘,
				success : function(data) {
					alert(data.uid);
				}
			});
		});
	});
</script>

  客户端通过url参数区分RestFull方法,服务端通过RequestMethod来进行限制

SpringMVC实现AJax以及RestFull分格