RestFull风格就是url路径中不能出现?不能带参数,如https://www.baidu.com/user/item/1234这个格式,也叫url资源定位
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,,另外使用springmvc的ajax功能千万记得导入jackson的2.4版本以上的包,不然报406的错误,采用$.ajax()方法需要注意的几个坑是:
|
其中,发送AJax的contentType 为发送过去的格式,dataType为接收时让jqery转换的格式,一定得指定让其可以正常转换的格式才行,不然不会报错,但是也没有成功的回调响应
JQuery的$.ajax(url,[settings])
1.默认的ContentType的值为:application/x-www-form-urlencoded; charset=UTF-8
此格式为表单提交格式,数据为key1=value1&key2=value2的格式
2.虽然ajax的data属性值格式为:{key1:value1,key2:value2},但最后会转为key1=value1&key2=value2的格式提交到后台
3.如果ajax要和springmvc交互,key1=value1&key2=value2的格式,后台springmvc只需要定义对象或者参数就行了,会自动映射。
4.如果springmvc的参数有@RequestBody注解(接收json**字符串**格式数据),ajax必须将date属性值转为json字符串,不能为json对象(js对象,会自动转为key=value形式)。并且,修改contentType的值为:application/json; charset=UTF-8,这样加了@RequestBody注解的属性才能自定映射到值
4、代码实现:
①、服务端,默认可以不写produces={"application/json;charset=utf-8"},produces是指定响应回客户端的json格式编码,除非返回格式解析乱码:
@RequestMapping(value="/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 = {
_method:'delete', uid : 1, name : 'jerry1' }; $.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); } }); }); $("#btn2").click(function() { var obj = {
// _method:'post', 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>
客户端通过数据参数区分RestFull方法,服务端通过RequestMethod来进行限制,url路径参数可以通过路径匹配注解来获取,以{}包裹具体参数,如下:
jquery发送json数据到controller,ajax上必须制定contentType : 'application/json;charset=utf-8',且controller接受的时候必须用@RequestBody进行对象接受,如果@RequestBody,那么默认是已form表单提交,ajax发送时就不能加contentType : 'application/json;charset=utf-8',采用默认的urlendongding形式就行