在springmvc中,可以对前台传递过来的参数进行与后台实体绑定(第二种方式相对较好).
比如:
前台页面:
1 <form action="${pageContext.request.contextPath}/test/test" method="POST">
2 用户名:<input type="text" name="name"><br/>
3 <input type="submit" value="提交">
4 </form>
Java:
public class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Controller
@Scope(value="prototype")
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
public String test(Student stu){
System.out.println(stu.getName());
return "success";
}
}
但是,若是,要对多个实体数据进行绑定,而且这些实体有同名的属性....
前台页面:
<form action="${pageContext.request.contextPath}/test/test" method="POST">
学生姓名:<input type="text" name="name"><br/>
老师姓名:<input type="text" name="name"><br/>
<input type="submit" value="提交">
</form>
Java:
public class Teacher {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@RequestMapping("/test")
public String test(Student stu, Teacher teacher){
System.out.println(stu.getName() + teacher.getName());
return "success";
}
可以在springmvc中可以进行自定义ModelAttributeProcessor来进行数据绑定的扩展.
自定义注解:
@Target({ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExtModelAttribute {
String value() default "";
}
继承ServletModelAttributeMethodProcessor类,实现自己的数据绑定模式.
public class ExtModelAttributeArgumentResolver extends
ServletModelAttributeMethodProcessor {
public ExtServletModelAttributeMethodProcessor() {
super(false);
}
public ExtServletModelAttributeMethodProcessor(boolean annotationNotRequired) {
super(annotationNotRequired);
}
@Override
public boolean supportsParameter(MethodParameter parameter) {
return methodParameter.getParameterAnnotation(ExtModelAttribute.class) != null;
}
@Override
protected void bindRequestParameters(WebDataBinder binder, NativeWebRequest request) {
ServletRequest servletRequest = request.getNativeRequest(ServletRequest.class);
ServletRequestDataBinder servletBinder = (ServletRequestDataBinder) binder;
servletBinder.setFieldDefaultPrefix(servletBinder.getObjectName() + ".");
servletBinder.bind(servletRequest);
}
}
@Configuration
public class MvcConfigureAdapter extends WebMvcConfigurationSupport
{
@PostConstruct public void init()
{
}
@Override protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers)
{
resolvers.add(new FormModelArgumentResolver(false));
List<HandlerMethodArgumentResolver> argumentResolvers = super.getArgumentResolvers();
System.out.println(argumentResolvers);
}
}
在springmvc配置文件中添加相应的加载驱动配置
<mvc:annotation-driven>
<!--添加在此处-->
<mvc:argument-resolvers>
<bean class="com.yemaozi.springmvc.ext.databind.ExtServletModelAttributeMethodProcessor"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
Controller:
@RestController
public class UserController {
private final static Logger logger = LoggerFactory.getLogger(UserController.class);
@PostMapping("/test")
public String testfpExcutor(@ExtModelAttribute("user") User user) {
System.out.println("userName:" + user.getUsername());
return "ok!";
}
}