在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在对应绑定不同实体,但具有相同属性名的解决方案....的更多相关文章

  1. 尚硅谷面试第一季-11MyBatis中当实体类中的属性名和表中的字段名不一样怎么办

    问题: MyBatis中当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 解决方案: 1.写sql语句时起别名 <!-- id属性:必须是接口中方法的方法名 resultType属性:必须是 ...

  2. java中遍历实体类,获取属性名和属性值

    方式一(实体类): //java中遍历实体类,获取属性名和属性值 public static void testReflect(Object model) throws Exception{ for ...

  3. resultMap自定义映射---8.3.1. 解决列名(表中的字段名称)和实体类中的属性名不一致

    1.1.1.1.      步骤一:将驼峰匹配注释掉 --------------测试完成后仍然 回来开启  其他地方可能用到 一旦注释掉驼峰匹配,那么再通过queryUserById查询的结果中,用 ...

  4. SpringMVC(二) 参数绑定 与 JSON

    参数绑定 http请求传输的参数都是String类型,但是Hanlder业务方法中的参数都是我们指定的数据类型,如int,Object等,所以需要处理参数的类型转换.此项工作不需要我们开发人员去完成, ...

  5. MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013307.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这 ...

  6. MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突

    在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...

  7. MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...

  8. MyBatis——解决字段名与实体类属性名不相同的冲突

    原文:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况 ...

  9. MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突

    一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...

随机推荐

  1. HDU2955_Robberies【01背包】

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. POJ 3628 Bookshelf 2 题解

    本题解法非常多,由于给出的数据特殊性故此能够使用DFS和BFS,也能够使用01背包DP思想来解. 由于一般大家都使用DFS,这里使用非常少人使用的BFS.缺点是比DFS更加耗内存,只是长处是速度比DF ...

  3. Codeforces Round #377 (Div. 2) D. Exams

    Codeforces Round #377 (Div. 2) D. Exams    题意:给你n个考试科目编号1~n以及他们所需要的复习时间ai;(复习时间不一定要连续的,可以分开,只要复习够ai天 ...

  4. Unity3d数据加密

    在unity中能够使用c#自带的对称算法对数据进行加密,以下两种加密算法: using System; using System.Text; using System.Security.Cryptog ...

  5. hihoCoder-1839 榶榶榶 数学

    题面 题意:给你一个500000长度的数字,然后环形的让每位做头,例如123,就有123,231,312三个,然后问这n个数字的和S,S的最小非1因子是多少 题解:每个数字在每个位置都会有一次,如果说 ...

  6. BZOJ 2659 数学

    思路: 一开始以为是真·欧几里德 a,b来回消 (其实用不了那么麻烦) 我们发现 这是一个矩形 求一下整点数 完了.. 要特判 p=q的情况 //By SiriusRen #include <c ...

  7. LeetCode Weekly Contest 26

    写的有点晚了. 我每次都是先看一下这里http://bookshadow.com/leetcode/的思路,然后再开始写我自己的. 1. 521. Longest Uncommon Subsequen ...

  8. C# How to convert MessageBodyStream to MemoryStream?

    通过WCF服务从数据库取文档数据时,返回的是Stream对象,在DevExpress的PDFViewer显示时,用PDFViewer.LoadDocunent(Stream stream);方法时,报 ...

  9. 代理模式(Proxy)C++实现

    代理模式 尽管Decorator的实现部分与代理相似,但Decorator的目的不一样.Decorator为对象添加一个或多个功能,而代理则控制对对象的访问. 意图: 为其他对象提供一种代理以控制对这 ...

  10. java exception 异常错误记录

    //异常:Could not obtain transaction-synchronized Session for current thread 做定时器的时候用ApplicationContext ...