近期的项目里面有个功能是:我需要接受前端的参数,但是前端可能是之前需求的时候定义得不够规范,导致有的前端传递过来的参数是驼峰式的。有的是全部小写的。我必须得做相应的处理
我开始想的是,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);
}
}
}
}
小结
- 这个相当于是手动进行了参数的绑定。我觉得Spring肯定应该有相关的设置。不然这个也太傻了
- 后面研究下怎么处理。应该是拦截拦截器和过滤器相关的内容里面