SpringMVC在对应绑定不同实体,但具有相同属性名的解决方案....
在springmvc中,可以对前台传递过来的参数进行与后台实体绑定(第二种方式相对较好).
比如:
前台页面:
<form action="${pageContext.request.contextPath}/test/test" method="POST">
用户名:<input type="text" name="name"><br/>
<input type="submit" value="提交">
</form>
实体类:
package com.yemaozi.rms.domain;
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:
@Controller
@Scope(value="prototype")
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
public String test(Student stu){
System.out.println(stu.getName());
return "success";
}
}
这样,在Controller是可以进行绑定的....
但是,若是,要对多个实体数据进行绑定,而且这些实体有同名的属性....
前台页面:
<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>
实体类:
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;
}
}
Controller:
@RequestMapping("/test")
public String test(Student stu, Teacher teacher){
System.out.println(stu.getName() + teacher.getName());
return "success";
5 }
这样,就会明白,name并不是唯一标识了,所以,在后台不能精确的绑定,其实,若是将该表单进行提交,则会将这两个name属性分别都添加到stu 和teacher这两个对象中..
因为springmvc中,是根据属性来进行数据绑定的,不像struts2是基于ognl的数据绑定机制.
要解决现在这样问题的方案一:
复合实体:
即:
public class StuTeacher {
private Student stu;
private Teacher teacher;
public Student getStu() {
return stu;
}
public void setStu(Student stu) {
this.stu = stu;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
创建一个拥有stu和teacher这两个实体对象的类StuTeacher.....
这样我们就可以再前台这样书写.
<form action="${pageContext.request.contextPath}/test/test1" method="POST">
学生姓名:<input type="text" name="stu.name"><br/>
老师姓名:<input type="text" name="teacher.name"><br/>
<input type="submit" value="提交">
</form>
就可以根据复合实体中的属性通过.进行导航绑定数据
在Controller中的代码:
@RequestMapping("/test1")
public String test1(StuTeacher stuTeacher){
System.out.println(stuTeacher);
return "success";
}
这种方法可以简单的处理这种数据绑定问题,好处是不需要添加任何插件代码,缺点是 扩展性不好,后期可能使得代码臃肿.
所以可以在springmvc中可以进行自定义ModelAttributeProcessor来进行数据绑定的扩展.
1,自定义注解:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExtModelAttribute {
String value() default "";
}
2,继承ServletModelAttributeMethodProcessor类,实现自己的数据绑定模式.
import javax.servlet.ServletRequest; import org.springframework.core.MethodParameter;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor; public class ExtServletModelAttributeMethodProcessor extends
ServletModelAttributeMethodProcessor { public ExtServletModelAttributeMethodProcessor() {
super(false);
} public ExtServletModelAttributeMethodProcessor(boolean annotationNotRequired) {
super(annotationNotRequired);
} @Override
public boolean supportsParameter(MethodParameter parameter) {
if (parameter.hasParameterAnnotation(ExtModelAttribute.class)) {
return true;
} else {
return false;
}
} @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);
}
}
3,在springmvc配置文件中添加相应的加载驱动配置
<mvc:annotation-driven>
<!--添加在此处-->
<mvc:argument-resolvers>
<bean class="com.yemaozi.springmvc.ext.databind.ExtServletModelAttributeMethodProcessor"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
4,应用
在前台页面中:
<form action="${pageContext.request.contextPath}/test/test1" method="POST">
学生姓名:<input type="text" name="stu.name"><br/>
老师姓名:<input type="text" name="teacher.name"><br/>
<input type="submit" value="提交">
</form>
在Controller中使用方式:
@RequestMapping("/test2")
public String test2(@ExtModelAttribute("stu") Student stu, @ExtModelAttribute("teacher")Teacher teacher){
System.out.println(stu.getName() + teacher.getName());
return "success";
}
使用刚才自定义的注解来标注对应的属性.
SpringMVC在对应绑定不同实体,但具有相同属性名的解决方案....的更多相关文章
- 尚硅谷面试第一季-11MyBatis中当实体类中的属性名和表中的字段名不一样怎么办
问题: MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 解决方案: 1.写sql语句时起别名 <!-- id属性:必须是接口中方法的方法名 resultType属性:必须是 ...
- java中遍历实体类,获取属性名和属性值
方式一(实体类): //java中遍历实体类,获取属性名和属性值 public static void testReflect(Object model) throws Exception{ for ...
- resultMap自定义映射---8.3.1. 解决列名(表中的字段名称)和实体类中的属性名不一致
1.1.1.1. 步骤一:将驼峰匹配注释掉 --------------测试完成后仍然 回来开启 其他地方可能用到 一旦注释掉驼峰匹配,那么再通过queryUserById查询的结果中,用 ...
- SpringMVC(二) 参数绑定 与 JSON
参数绑定 http请求传输的参数都是String类型,但是Hanlder业务方法中的参数都是我们指定的数据类型,如int,Object等,所以需要处理参数的类型转换.此项工作不需要我们开发人员去完成, ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013307.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这 ...
- MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis——解决字段名与实体类属性名不相同的冲突
原文:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况 ...
- MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突
一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...
随机推荐
- 《随笔》pyqt 获取 TreeWidget 选中项的内容
感谢朋友支持本博客,欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免.欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- php学习之道:WSDL具体解释(一)
WSDL文档使用web服务描写叙述语言来定义服务. 文档包含逻辑(抽象)部分和详细部分. 抽象部分用于定义独立于实现的数据类型和消息,详细部分定义一个endpoint怎样实现一个能够与外界进行交互的服 ...
- NYOJ_268_荷兰国旗问题
荷兰国旗问题 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描写叙述 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红.白.蓝.现有若干由红.白.蓝三种颜色的条块序列.要 ...
- Shell case esac语句【转】
本文转载自:http://c.biancheng.net/cpp/view/7006.html C语言中文网推出辅导班啦,包括「C语言辅导班.C++辅导班.算法/数据结构辅导班」,全部都是一对一教学: ...
- 国内物联网平台初探(三) ——QQ物联·智能硬件开放平台
平台定位 将QQ帐号体系.好友关系链.QQ消息通道及音视频服务等核心能力提供给可穿戴设备.智能家居.智能车载.传统硬件等领域的合作伙伴,实现用户与设备.设备与设备.设备与服务之间的联动. 实现用户与设 ...
- 2014.9.20Hashtable概述
hashtable叫哈希表,用于表示键值的集合,这些键值对根据键的哈希代码进行组织,其每个元素都存储于DictionaryEntry对象中的键值对.键不能为空引用. count:获取包含在hashta ...
- [转载]linux上安装oracle
原文地址:linux上安装oracle作者:天涯恨客 1.创建oinstall组 [root@xieqing ~]# groupadd oinstall 创建dba组 [root@xieqing ~] ...
- Spark Streaming概念学习系列之SparkStreaming性能调优
SparkStreaming性能调优 合理的并行度 减少批处理所消耗时间的常见方式还有提高并行度.有以下三种方式可以提高并行度: 1.增加接收器数目 有时如果记录太多导致单台机器来不及读入并分发的话, ...
- asp.net 字符串过滤
/// <summary> /// 去除HTML标记 /// </summary> /// <param name="Htmlstring">包 ...
- 用命令行在本地创建一个库并上传到Github
1 如何在本地创建一个仓库并上传到github? 基本步骤: $ mkdir blog //在桌面上创建一个叫"blog"的目录 $ cd blog //"cd blo ...