SpringMVC實現AJax以及RestFull風格


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另外使用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",

   traditional:true,

   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轉換的格式,一定得指定讓其可以正常轉換的格式才行,不然不會報錯,但是也沒有成功的回調響應

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形式就行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM