zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MySQL连接数过多登录不上
    Linux中盘符的两种挂载方法
    Linux杀毒软件ClamAV初次体验
    VS2013开发asmx接口根据ID查询对象
    VS2013开发asmx接口返回一个自定义XML
    VS2013开发一个简单的asmx接口程序
    Java编译过程(传送门)
    凡人和神学习和使用软件的七个层次
    CentOS7 限制SSH密码尝试次数
    马云是如何招聘到多隆这样的牛人的?(转)
  • 原文地址:https://www.cnblogs.com/wfy680/p/15042887.html
Copyright © 2011-2022 走看看