SpringMVC 绑定不同实体

在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!";
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值