package com.haogrgr.test.mvc;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.core.MethodParameter;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
/**
* 使用方法,
* 1.注册PrefixMapMethodArgumentResolver到<mvc:argument-resolvers>中
* 2.Controller参数类型为MapWapper且打上本注解 eg:(@PrefixMapParam("prop") MapWapper prop)
* 3.前台表单字段名使用 PrefixMapParam.value() + PrefixMapParam.split() + 参数名 eg: (prop.param1.param2) ==> MapWapper{param1=MapWapper{param2:value}}
*
* Spring使用这个方法来设置@PathVariable
* org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleMatch(RequestMappingInfo, String, HttpServletRequest)
*
* TODO: MapWapper{param1=MapWapper{param2:value}} 改为 MapWapper{param1=HashMap{param2:value}}, 并提供MapWapper.toHashMap()
*/
public class PrefixMapMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
PrefixMapParam ann = parameter.getParameterAnnotation(PrefixMapParam.class);
return ann != null && StringUtils.hasText(ann.value()) && MapWapper.class.isAssignableFrom(parameter.getParameterType());
}
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory)
throws Exception {
PrefixMapParam ann = parameter.getParameterAnnotation(PrefixMapParam.class);
String prefix = ann.value() + ann.split();
MapWapper resultMap = new MapWapper();
Map<String, String[]> parameterMap = webRequest.getParameterMap();
for (Entry<String, String[]> entity : parameterMap.entrySet()) {
if(entity.getKey().startsWith(prefix)){
String key = getKey(entity.getKey(), prefix);
if(key.indexOf(ann.split()) == -1){
resultMap.put(key, entity.getValue().length == 1 ? entity.getValue()[0] : entity.getValue());
continue;
}
String tempkey = key;
MapWapper tempmap = resultMap;
while(tempkey.indexOf(ann.split()) != -1){
String newkey = tempkey.substring(0, tempkey.indexOf(ann.split()));
MapWapper param = (MapWapper) tempmap.get(newkey);
if(param == null){
param = new MapWapper();
tempmap.put(newkey, param);
}
if(tempkey.indexOf(ann.split()) != -1){//还有.
tempkey = getKey(tempkey, newkey + ".");
tempmap = param;
}
}
tempmap.put(tempkey, entity.getValue().length == 1 ? entity.getValue()[0] : entity.getValue());
}
}
return resultMap;
}
private String getKey(String src, String prefix){
return src.substring(prefix.length(), src.length());
}
}