Controller接口获取前端传递的参数,而不区分参数的名字的大小写

近期的项目里面有个功能是:我需要接受前端的参数,但是前端可能是之前需求的时候定义得不够规范,导致有的前端传递过来的参数是驼峰式的。有的是全部小写的。我必须得做相应的处理

我开始想的是,Spring 里面有没有配置,例如拦截器或者过滤器什么的。请参数处理下。但是我在网上找了一圈,也没有操作了一下。结果没有成功

后面换了一种思路。通过一个Map获取所有的参数(K-V)。然后将K小写。在绑定到我的Vo对象里面去。相当于手动替框架做了一次参数绑定

涉及的知识点

HttpServerletRequest,集合变量,反射

前提:我这种方式只对get方法有效

request转化为Map

get方法一般提供参数的方式就是K-V结构,存储在request的parametermaps里面。
形式是参数名字,参数值 例如 id = 10086
我们需要的就是讲讲所有的参数获取下来,然后进行转化到我们的VO对象里面。首先获取map

/**
     * 获取连接里面的的参数
     */
    public static Map<String,String> getParameterMap(HttpServletRequest request) {
        Enumeration<String> keys = request.getParameterNames();
        // 存放进过处理后的参数 :将K小写
        Map<String,String> targetMap = new HashMap<>(16);
        String key = null;
        while (keys.hasMoreElements()) {
            key = keys.nextElement();
            targetMap.put(key.toLowerCase(),request.getParameter(key));
        }
        return targetMap;

    }
    /**
     * 获取请求头的参数
     */
    public static Map<String,String> getHeaderMap(HttpServletRequest request) {
        Enumeration<String> heads = request.getHeaderNames();
        String headName = null;
        Map<String,String> headerMap = new HashMap<>(16);
        while (heads.hasMoreElements()){
            headName = heads.nextElement();
            headerMap.put(headName.toLowerCase(),request.getHeader(headName));
        }
        return headerMap;
    }

上面两个方法是获取请求头和请求参数表里面的参数
简单就是先创建一个Map<String,String>对象。
然后获取请求里面所有的K,在通过K获取value
将K转化为小写,V原值存储到map中。

将Map转化为Vo对象

这里用到了反射,这个函数的功能是:
将map的参数存储到Vo里面,代码比较短,我觉得应该是可以自解释的

/**
     * 目前只能处理String和Integer
     */
    public static void fillVo(Map<String,String> map, Object vo) throws IllegalAccessException {
        Class<?> clazz = vo.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            // 首先观察map里面是否有这个域所要的值,如果有,进行获取
            String value = map.get(field.getName());
            if (value != null && (!"".equals(value.trim()))){
            	// 将字段设置成可操作,因为这些是private的
                field.setAccessible(true);
                // 判断域的类型,然后进行填充
                if (field.getType() == Integer.class) {
                    // 将数据填充到 vo对象的域里面
                    field.set(vo,Integer.valueOf(value.trim()));
                }
                if (field.getType() == String.class) {
                    field.set(vo, value);
                }
            }
        }
    }
小结
  1. 这个相当于是手动进行了参数的绑定。我觉得Spring肯定应该有相关的设置。不然这个也太傻了
  2. 后面研究下怎么处理。应该是拦截拦截器和过滤器相关的内容里面
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值