Springmvc 数据传输,参数绑定 查看用

后端开发中会遇到很多前后端参数传递的内容,工作时遇到各种各样的参数传递方式,觉得比较混乱,所以花了一点时间整理总结下来,以便后续开发中能够快速地找到合适的参数绑定方式。

本次主要分为三个模块,一个是基本模式,一个是json模式,一个是通过自定义的工具类处理参数绑定模式。

一、基本模式

1、基本数据类型(以int为例)

在controller中写一个int参数绑定的方法

    @GetMapping("/getInt")
        public BaseResponse getInt(int id){
            BaseResponse baseResponse = new BaseResponse();
            try{
                int param = id;
                baseResponse.setCode(BaseResponse.RESPONSE_SUCCESS_CODE);
                baseResponse.setMsg("获取参数成功");
                baseResponse.setData(param);
            }catch (Exception e){
                baseResponse.setCode(BaseResponse.RESPONSE_ERROR_CODE);
                baseResponse.setMsg("获取参数失败");
            }finally {
                return baseResponse;
            }
        }

总结:1)用基本类型进行参数绑定时,就必须传入key值,且value值必须是声明的基本类型,如果页面提交的数据为null或“”的话会出现数据转换异常,因此最好使用包装类型参数

           2)前端的参数名和controller的参数名保持一致时就能完成数据绑定,不一致可以使用@RequestParam

 

2、包装类型参数绑定(推荐使用)

在controller中写多个包装类型参数绑定的方法

    @GetMapping("/getUser")
        public BaseResponse getUser(String name,Integer age){
            BaseResponse baseResponse = new BaseResponse();
            try{
                String paramName = name;
                Integer paramAge = age;
                Map<String,Object> result = new HashMap<>();
                result.put("name:",paramName);
                result.put("age:",paramAge);
                baseResponse.setCode(BaseResponse.RESPONSE_SUCCESS_CODE);
                baseResponse.setMsg("获取参数成功");
                baseResponse.setData(result);
            }catch (Exception e){
                baseResponse.setCode(BaseResponse.RESPONSE_ERROR_CODE);
                baseResponse.setMsg("获取参数失败");
            }finally {
                return baseResponse;
            }
        }

 

 

 

总结:1)包装类型绑定参数时和基本数据类型一样,传的key值要和里面绑定的参数名一致

           2)包装类型绑定参数时参数的值可以不传为null,也可以为空

3、自定义对象类型参数绑定

自定义实体类

在controller中设置User类型参数

 

总结:1)只要将对象的属性名和前端的input的参数名一致即可

4、自定义复合对象类型参数绑定

增加另一级对象的实体类

在controller层代码和上面一样

总结:1)自定义复合对象类型和自定义对象类型是一样的用法

           2)自定义复合对象类型前端input的参数名要使用“属性名(对象类型的属性).属性名"来命名

5、List参数绑定

List需要绑定在对象上,而不能直接写在Controller方法的参数中

实体类定义List类型参数

controller使用定义了List类型属性的类型的参数

总结:1)list不可以直接写在controller的方法参数中,需要绑定在类中

           2)前端的表单提交需要指定list的下标,命名规则为“controller参数名[i].属性名”,有点和自定义复合对象类型的命名规则

6、Map参数绑定

Map也需要绑定在对象上,而不能直接写在Controller方法的参数中

Map实体类

在这里我只能通过json格式传送,没有找到合适的办法,后续找到再更新

总结:1)Map不可以直接写在controller的方法参数中,需要绑定在类中

           2)在这里使用了@RequestBody,但是基本方式应该也有方法传递Map类型的参数的,后续Map类型的用途更广泛

7、@RequestParam注解解析

@RequestParam注解的作用有参数限制、设置参数默认值、自定义参数名称

1).参数限制(可用required=false关闭)

2)设置参数默认值

3)自定义参数名称

总结:1)@RequestParam注解设置更改参数名称、设置参数限制以及设置参数默认值,可根据不同场景使用

           2)@RequestParam可以多个使用

8、数组类型参数绑定

1)基本数组类型接收参数

总结:很简单,直接用数组类型接收即可

2)List类型接收参数

总结:1)不可以缺少@RequestParam注解,否则会报错

二、Json模式参数绑定

由于前后端分离以及前端的多样性,通常我们使用json数据格式进行参数/数据传递,说到json格式,就得先说一下@RequestBody,这个是使用Json模式进行参数绑定必不可少的一环

1、@RequestBody注解解析

1)@RequestBody注解的作用将json格式的数据转为java对象

2)@RequestBody常用其来处理application/json类型

3)@RequestBody接收的是一个json格式的字符串

2、json模式直接绑定自定义对象类型

总结:1)直接json字符串转换成javaBean,但是前端传的一定是json格式的数据

           2)参数名必须和实体类定义的属性名一直才可以正确获取参数

3、json模式直接绑定自定义复合对象类型

总结:1)两者都需要参数名和实体类定义的属性名一致

            2)直接获取的方式,层级的参数名需要用.指定;@RequestBody形式参数json格式需要用嵌套的形式

4、json模式绑定数组类型(一般用于批量操作)

controller使用@RequestBody+List接收数组(推荐)

总结:1)@RequestBody获取List数组类型参数使用比较广泛

          2)后续可以将list中的内容转化为String类型,以","分割

5、json模式绑定多个对象(参数类型相同)

1)使用List<E>获取

2)使用Map<String,Object>接收

三、Json解析

1、关于json

1)json可以分json字符串和json对象(JsonObject),使用@RequestParam可以接收JsonObject的参数,但是使用@RequestBody只能接收json字符串

2)json可以理解为键值对,除了以上通过pojo/List接收,通常也可以用Map<String,Object> map进行接收(常用),但是要用@RequestBody注解

3)在上传Json对象,也可以绑定pojo,但是不要使用@RequestParam注解

2、json解析

1)JSONObject的常用方法

a.put(String key, Object value):设置(增加)键值对,key相同的话保留后面的值

b.Object get(String key)::根据key值获取JSONObject对象中对应的value值,返回类型是Object

c..int size():获取JSONObject对象中键值对的数量

d.containsKey(Object key):判断是否有需要的key值

e.boolean containsValue(Object value):判断是否有需要的value值

f.JSONObject getJSONObject(String key):如果JSONObjct对象中的value是一个JSONObject对象,即根据key获取对应的JSONObject对象;

g.JSONArray getJSONArray(String key) :如果JSONObject对象中的value是一个JSONObject数组,既根据key获取对应的JSONObject数组;

h.Object remove(Object key):根据key清除某一个键值对。

i.Set<String> keySet() :获取JSONObject中的key,并将其放入Set集合中

j.Set<Map.Entry<String, Object>> entrySet():在循环遍历时使用,取得是键和值的映射关系,Entry就是Map接口中的内部接口

k.boolean isEmpty():判断该JSONObject对象是否为空

2)JSONString和JSONObject相互转化

a.   .toJSONString() /toString():将JSONObject对象转换为json的字符串

b.   JSONObject.fromObject():将json的字符串转换为JSONObject对象

四、常用工具类

1、从request中获取键值对,通过get(key)方法直接获取value值

    public class HttpServletUtil extends HashMap implements Map{
     
        Map map = null;
     
        HttpServletRequest request;
     
        public  HttpServletUtil(HttpServletRequest request){
            this.request = request;
            Map dataMap = request.getParameterMap();
            Map returnMap = new HashMap();
            String valueStr ="";
            for(Iterator iterator = dataMap.entrySet().iterator(); iterator.hasNext();){//entrySet.iterator生成迭代器
                Map.Entry<String, JSONObject> entry  = (Map.Entry<String, JSONObject>) iterator.next();//从迭代器获取Map.Entry的单元对象
                String name = entry.getKey();//获取key
                Object value = entry.getValue();//获取value
                if(null == value){//把键值对转化为map<String,String>格式,单层
                    valueStr ="";
                }else if(value instanceof String[]){
                    String[] values =(String[]) value;
                    for(int i=0;i<values.length;i++){
                        valueStr = values[i]+",";
                    }
                    valueStr = valueStr.substring(0, valueStr.length()-1);
                }else{
                    valueStr=value.toString();
                }
                returnMap.put(name,valueStr);
            }
            map=returnMap;
        }
     
        public Map getMap() {
            return map;
        }
     
        public String getString(String key) {
            String str =(String) getMap().get(key);
            return str;
        }
    }

2、复杂json(多层)转Map

    public class JsonUtil {
     
        /*
        复杂json转map
         */
        //递归调用json转map
        public static Map populate(JSONObject jsonObject, Map map) {
            for (Iterator iterator = jsonObject.entrySet().iterator(); iterator
                    .hasNext(); ) {//取得jsonObject的映射关系放在set中,实例化生成迭代器,遍历
                String entryStr = String.valueOf(iterator.next());//获取每个键值对
                String key = entryStr.substring(0, entryStr.indexOf("="));//获取key
                String value = entryStr.substring(entryStr.indexOf("=") + 1,
                        entryStr.length());//获取value值
                if (jsonObject.get(key).getClass().equals(JSONObject.class)) {//判断根据key在JSONObject对象中对应的value值是否是JSONObject类型
                    HashMap _map = new HashMap();
                    map.put(key, _map);
                    populate(jsonObject.getJSONObject(key), ((Map) (_map)));//根据key获取对应的JSONObject对象,递归调用json转map
                } else if (jsonObject.get(key).getClass().equals(JSONArray.class)) {//判断根据key在JSONObject对象中对应的value值是否是JSONArray类型
                    ArrayList list = new ArrayList();
                    map.put(key, list);
                    populateArray(jsonObject.getJSONArray(key), list);//根据key获取对应的JSONObject对象,递归调用json转数组
                } else {
                    map.put(key, jsonObject.get(key));
                }
            }
     
            return map;
        }
     
     
        //json转数组
        public static void populateArray(JSONArray jsonArray, List list) {
            for (int i = 0; i < jsonArray.size(); i++)
                if (jsonArray.get(i).getClass().equals(JSONArray.class)) {
                    ArrayList _list = new ArrayList();
                    list.add(_list);
                    populateArray(jsonArray.getJSONArray(i), _list);//递归调用json转数组
                } else if (jsonArray.get(i).getClass().equals(JSONObject.class)) {
                    HashMap _map = new HashMap();
                    list.add(_map);
                    populate(jsonArray.getJSONObject(i), _map);
                } else {
                    list.add(jsonArray.get(i));
                }
        }
     
    }

3、拼接json字符串处理

其余的后续有遇到再更新
————————————————
版权声明:本文为CSDN博主「aliyacl」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aliyacl/article/details/85089035

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值