1. 程式人生 > 其它 >springboot 後臺接收map型別引數

springboot 後臺接收map型別引數

https://blog.csdn.net/eeeeasy/article/details/81708600

有時候可能需要發ajax到後臺,並且攜帶一些引數,如果引數數量少,我們可以直接在後臺寫引數。如果前臺提交的是表單,我們可以利用spring mvc提供的封裝引數的方法進行接收,但假如前臺向後臺傳送ajax請求並且攜帶很多引數,而後臺並沒有對應的實體類進行接收,這時可以根據請求中攜帶的引數,在後臺定義一個實體類,再根據mvc的封裝特性接收引數,這樣的做法是可以實現的,但是假如很多地方都是這樣的多引數請求,建立對應的實體類就不是很好的方法了,會導致後臺變得臃腫,冗餘。這種情況可以採用map引數傳遞到後臺接收。

例如搜尋框表單,搜尋框內有多個搜尋條件,這時可以使用map引數來解決。因為map的資料結構為key-value形式,可以遍歷搜尋框表單,將表單的name作為map的key,表單的value作為map的value。


首先:遍歷表單組成map,在通過map轉化成json字串

//得到搜尋框資料
function  getFromData() {
    var dataMap = new Map();
    $("#form_id input,select").each(function(){
        var value= $(this).val();      //input 值
        var name= $(this
).attr('name'); dataMap.set(name,value); }); //Map轉為Json的方法 let obj= Object.create(null); for (let[k,v] of dataMap) { obj[k] = v; } return obj; } //傳送ajax請求(第一種方式,推薦):1.contentType 可以不填 2.傳送資料為json物件 let obj=getFromData(); $.ajax({ url: "srarch_data/search_data_detail.action", type:
"post", dataType:'json', data: {"jsonData":JSON.stringify(obj)}, success: function (json) { } }); //傳送ajax請求(第二種方式):1.必須填寫contentType 2.傳送資料為json字串 $.ajax({ url: "srarch_data/search_data_detail.action", type: "post", dataType:'json', contentType : 'application/json;charset=utf-8', data: JSON.stringify(obj), success: function (json) { } });

後臺接收

 //第一種ajax請求對應的後臺介面
  @RequestMapping("search_data_detail")
  @ResponseBody
  public void searchInfo(@RequestParam Map<String,String> map){
 
    Map<String, Object> jsonMap= JsonToMap.jsonToMap(map.get("jsonData"));
 
    for (Map.Entry<String,Object> entry:jsonMap.entrySet()){
      System.out.print("得到鍵為:==="+entry.getKey());
      System.out.println("得到值為:==="+entry.getValue());
    }
 
  }
   //第二種ajax請求後臺對應的後臺介面
    @RequestMapping("search_data_detail")
    @ResponseBody
    public void searchInfo(@RequestBody Map<String,String> map)  {
   
      for (Map.Entry<String,String> entry:map.entrySet()){
          System.out.print("得到鍵為:==="+entry.getKey());
          System.out.println("得到值為:==="+entry.getValue());
      }
    }

@RequestParam,可以獲取請求中所有的引數,包括我傳的jsondata,貼一下JsonToMap,是一JSON轉換為map物件的工具類方法,因為在後臺我們用map更方便,包括傳入mybatis時也可以直接傳Map。

/**
 * @Auther: HeJD
 * @Date: 2018/8/6 18:26
 * @Description:JSON轉MAP工具類
 */
public class JsonToMap{
 
    /**
     * 將json字串轉為Map物件
     * 如果json複雜,結果可能是map巢狀map
     * @param jsonStr 入參,json格式字串
     * @return 返回一個map
     */
    public static Map<String, Object> jsonToMap(String jsonStr) {
        Map<String, Object> map = new HashMap<>();
        if(jsonStr != null && !"".equals(jsonStr)){
            //最外層解析
            JSONObject json = JSONObject.fromObject(jsonStr);
            for (Object k : json.keySet()) {
                Object v = json.get(k);
                //如果內層還是陣列的話,繼續解析
                if (v instanceof JSONArray) {
                    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
                    Iterator<JSONObject> it = ((JSONArray) v).iterator();
                    while (it.hasNext()) {
                        JSONObject json2 = it.next();
                        list.add(jsonToMap(json2.toString()));
                    }
                    map.put(k.toString(), list);
                } else {
                    map.put(k.toString(), v);
                }
            }
            return map;
        }else{
            return null;
        }
    }
 
 
}
json裡的null與"null"。

處理物件:將Json形式的字串轉換成JSONObject物件。

問題:如果在Json串中存在value是“null”的情況下,下面的語句根據不同狀況會生成不同結果。

執行語句:

JSONObject Jsob =JSONObject.fromObject(sJson);

情景1:sjson =”{name:\”null\”}”

情景2:sjson =”{name: \”null\”}” 注意:冒號後面有空格

執行結果:

在情景1的情況下,生成的Jsob中,name的value是”“null””

在情景2的情況下,生成的Jsob中,name的value是null

總結:

沒有空格的情況下,JSONObject會把”null”作為一個字串來處理,也就會加上轉義符號。

有空格的情況下,JSONObject會把”null”轉換為JSONNULL,也就是沒有引號。

 既然知道是由空格引發的問題,所以我們的解決方案便是去掉空格,所以我們將修改後的js如下:

//得到搜尋框資料
function  getFromData() {
    var dataMap = new Map();
    $("#form_solo_id input,select").each(function(){
        var value= $.trim($(this).val());      //去空格後的input 值
        var name= $(this).attr('name');
        dataMap.set(name,value);
    });
 
    let obj= Object.create(null);
    for (let[k,v] of dataMap) {
        obj[k] = v;
    }
    return obj;
}

spring框架中有個一個工具類:WebUtils

裡面有一個靜態方法: WebUtils.getParametersStartingWith(ServletRequest request, String prefix);

原來別人早就考慮好了這種類似的情況,具體使用如下:

假如你有一個這樣的表單

<form class="layui-form">
        <div class="layui-inline">
            <input type="text" value="" name="s_roleName" placeholder="輸入角色名" class="layui-input search_input">
 <input type="text" value="" name="s_nickNAME" placeholder="輸入暱稱" class="layui-input search_input">
        </div>
</form>

那麼提交不用像前面那樣子了,可以直接在後臺:

    public ServerResponse list(ServletRequest request){
        //獲取所有字首為s_的name存入map中
        Map<String,Object> map = WebUtils.getParametersStartingWith(request, "s_");
        for (Map.Entry<String,Object> entry :map.entrySet()){
            System.out.println("遍歷map得到鍵為:"+entry.getKey());
            System.out.println("遍歷map得到值為:"+entry.getValue());
        }
}

鍵值不帶字首,是去掉字首的!!!!

最後貼一篇參考文章,寫的很好:https://blog.csdn.net/LostSh/article/details/68923874