springMVC傳遞list對象三種方法

前言
概念
           1.ajax請求裏Content-type2個常用類型
           JSON對象和JSON字符串
           dataType與contentType
           對象複雜度
dispatchServlet-mvc.xml配置
最簡單:單個數組對象和key-value就比較簡單了
           前端
           後端
稍微複雜:只接收對象數組
           前端
           後端
最複雜:對象數組與key-value一起傳
           前端
           後臺

前言

springMVC接收List對象以及List對象與其它對象一起傳參數的使用方法

概念

1.ajax請求裏Content-type2個常用類型

  • application/x-www-form-urlencoded:傳遞的key/value會經過URL轉碼,所以如果傳遞的參數存在中文或者特殊字符需要注意。 
    默認編碼方式。
//例子
//b=曹,a=1
POST  HTTP/1.1(CRLF)
Host: www.example.com(CRLF)
Content-Type: application/x-www-form-urlencoded(CRLF)
Cache-Control: no-cache(CRLF)
(CRLF)
b=%E6%9B%B9&a=1(CRLF)
//這裏b參數的值"曹"因爲URL轉碼變成其他的字符串了

-application/json:application/json用來告訴服務端消息主體是序列化後的 JSON 字符串,重點是使用JSON.stringify(data)將json對象轉化是json字符串。

JSON對象和JSON字符串

在使用@RequestBody註解時,在SpringMVC環境中,@RequestBody接收的是一個Json對象的字符串,而不是一個Json對象。然而在ajax請求往往傳的都是Json對象,用 JSON.stringify(data)的方式就能將對象變成字符串。同時ajax請求的時候也要指定dataType: "json",contentType:"application/json" 這樣就可以輕易的將一個對象或者List傳到Java端。 

@RequestBody與contentType:"application/json"必需配合使用,且數據是字符串。

dataType與contentType

contentType:指定向後臺傳遞數據編碼格式 
dataType:指定後臺返回數據格式

對象複雜度

傳單個key-value,或基本類型的數組最簡單,稍微複雜一點的是傳對象數組([object]),最複雜的是對象數組與key-value一起傳到後臺

dispatchServlet-mvc.xml配置

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
        </property>
    </bean>

或者更簡單的寫法

<mvc:annotation-driven/> 

最簡單:單個數組對象和key-value就比較簡單了

前端

$("#test").click(function(){
    var testData={"nameIds": [1,2,3], "age": 18}
    $.ajax({
        type:"POST",
        url: basePath + "/test/testInOut",
        dataType:"json",
        contentType:"application/x-www-form-urlencoded", // 指定這個協議很重要
        data:faultList, //只有這一個參數,json格式,後臺解析爲實體,後臺可以直接用
        success:function(data){
        }
    });
})

重點

  • contentType:"application/x-www-form-urlencoded"一般使用這個當然我們也可以使用application/json(它需要序列化json數據)

後端

//controller層

 @RequestMapping(value = "/test/testInOut")
 @ResponseBody
 public void testInOut(Integer[] nameIds, Integer age){ 
      System.out.println(nameIds, age) ;
 }

重點

  • Integer[] nameIds接收數組

稍微複雜:只接收對象數組

下面要使用到的pojo類

//POJO對象傳輸對象   RepairFaultList.java
public class RepairFaultList{
    private Integer id;
    private String faultName;//故障名稱
    private String employeeGroup;//所屬工組
    //getter  setter
}

下面還會使用RepairFaultList.java,需要傳遞的結構體。

前端

$("#test").click(function(){
     //對象數組
     var faultList=[];
     var data1={id:1,"faultName":"機電有問題","employeeGroup":"機電"};
     var data2={id:2,"faultName":"鈑金有問題","employeeGroup":"鈑金"};
     faultList.push(data1);
     faultList.push(data2);
    $.ajax({
        type:"POST",
        url: basePath + "/test/testInOut",
        dataType:"json",
        contentType:"application/json", // 指定這個協議很重要
        data:JSON.stringify(faultList), //只有這一個參數,json格式,後臺解析爲實體,後臺可以直接用
        success:function(data){
        }
    });
})

重點

  • contentType:"application/json"
  • JSON.stringify(faultList)

這裏傳入的是一個數組,直接使用JSON.stringify(faultList)序列化數據,不是{"faultList":faultList},相應的後端接收數據的地方也只有一個參數。

後端

//controller層
 @RequestMapping(value = "/test/testInOut", method = {RequestMethod.POST })
 @ResponseBody
 public void testInOut( @RequestBody List<RepairFaultList> faultList ){ 
 //此時的faultList是map數據,並沒有解析爲bean // 不建議使用
      System.out.println(users) ;
 }

//使用如下方法,可以使用bean
 @RequestMapping(value = "/test/testInOut", method = RequestMethod.POST)
 @ResponseBody
 public void testInOut( @RequestBody RepairFaultList[] faultList ){ 
     // 此時的faultList是實體bean
      System.out.println(users.getName()) ; 
 }

重點

  • RepairFaultList[]或List<RepairFaultList>
  • method=RequestMethod.POST,指定post請求方式
  • @RequestBody
  • 注意faultList是隨機命名,沒要求。

還有種不需要POJO對象的寫法,比較另類,代碼如下

//前端同上
//controller層
 @RequestMapping(value = "/test/testInOut", method = RequestMethod.POST)
 @ResponseBody
 public void testInOut( @RequestBody List<Map<String,String>> faultList ){ // spring MVC只能解析外層的json格式,內部的bean轉化爲Map格式的鍵值對,需要對map解析
      List<RepairFaultList> result = new ArrayList<RepairFaultList>();
      for(Map<String,String> map : faultList){
          RepairFaultList u = new RepairFaultList();
          //一系列get  set數據
      }
     // 這裏就可以使用 result 了
 }

最複雜:對象數組與key-value一起傳

使用@RequestBody與json一起操作,上面說過,application/json用來告訴服務端消息主體是序列化後的 JSON 字符串。

前端

 //基本數據類型數組對象
     var operatorIds = [1,2,3];
     //對象數組
      var faultList=[];
      var data1={id:1,"faultName":"機電有問題","employeeGroup":"機電"};
      var data2={id:2,"faultName":"鈑金有問題","employeeGroup":"鈑金"};
      faultList.push(data1);
      faultList.push(data2);
      var testData={operatorIds:operatorIds,repairBillId: 110,faultList: faultList};
      $.ajax({
          type:"POST",
          url: basePath + "/test/testInOut",
          dataType:"json",
          contentType: application/json,
          data:JSON.stringify(testData), //只有這一個參數,json格式,後臺解析爲實體,後臺可以直接用
          success:function(data){
          }
      });
  })

重點

  • contentType: application/json,指定數據編碼格式
  • JSON.stringify(testData)序列化數據,字符串

後臺

 

//POJO對象   創建一個對象由於存放key-value和對象數組  AppointPrePersonRo.java
public class AppointPrePersonRo {
    private Integer[] operatorIds;
    private List<RepairFaultList> faultList;
    private Integer repairBillId;
    //getter setter
}

//controller層
@RequestMapping(value = "/test/testInOut")
@ResponseBody
 public String testInOut(@RequestBody  AppointPrePersonRo appointPrePersonRo) {
         return "sucess";
     }
 }

 這樣就可以接收對象數組和key-value混合的數據。 
重點 
- 創建AppointPrePersonRo類,由於保存接收的數據對象 
@RequestBody註解,必需與application/json配合使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章