定义注解,用于标志可以解析的参数
import org.springframework.web.bind.annotation.ValueConstants;
import java.lang.annotation.*;
/**
* Description:
* Created by IntelliJ IDEA.
* Created by Administrator on 2016/6/17
* User: Administrator
* Date: 2016/6/17
* Time: 17:21
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FormParam {
String value() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
定义ArgumentResolver,必须直接或间接实现HandlerMethodArgumentResolver
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.MethodParameter;
import org.springframework.util.ClassUtils;
import org.springframework.web.bind.WebDataBinder;
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;
import java.lang.reflect.Field;
/**
* Description:
* Created by IntelliJ IDEA.
* Created by Administrator on 2016/6/17
* User: Administrator
* Date: 2016/6/17
* Time: 17:01
*/
public class MyRequestArgumentProcessor implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(FormParam.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
if (binderFactory == null) {
return null;
}
Class<?> targetType = parameter.getParameterType();
FormParam myForm = parameter.getParameterAnnotation(FormParam.class);
String prefix = getprefix(myForm, targetType);
Object arg = null;
Field[] fields = targetType.getDeclaredFields();
Object target = targetType.newInstance();
WebDataBinder binder = binderFactory.createBinder(webRequest, target, prefix);
for (Field field : fields) {
field.setAccessible(true);
String fieldName = field.getName();
Class<?> fieldType = field.getType();
String webValue = webRequest.getParameter(prefix + "." + fieldName);
if (StringUtils.isNotBlank(webValue)) {
arg = binder.convertIfNecessary(webRequest.getParameter(prefix + "." + fieldName), fieldType, parameter);
field.set(target, arg);
}
}
return target;
}
private String getprefix(FormParam myForm, Class<?> targetType) {
String prefix = myForm.value();
if (prefix.equals("")) {
prefix = getDefaultClassName(targetType);
}
return prefix;
}
private String getDefaultClassName(Class<?> targetType) {
return ClassUtils.getShortNameAsProperty(targetType);
}
}
启用方式,xml配置方式,此方式需要引入3.1版本以上的xml描述文件
<mvc:annotation-driven >
<mvc:argument-resolvers>
<bean class="com.*.MyRequestArgumentProcessor"></bean>
</mvc:argument-resolvers>
</mvc:annotation-driven>
页面编写方式
<div class="list">
<span class="title">角色名称:</span>
<input type="text" class="text_input" name="role.roleName">
</div>
<div class="list">
<span class="title">状态:</span>
<select name="role.cancelFlag">
<option value="">请选择</option>
</select>
</div>
后台使用方式
@RequestMapping(value = "/findRoleList")
public String findRoleList(Model model, HttpServletRequest request, @FormParam(value = "role") Role role) {
return "";
}