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