最新版请点击查看
问题描述:
springMVC 数据绑定 多个对象 如何准确绑定?
<form> <input name="student.name" value="Kate" /> <input name="student.type" value="自费" /> <input name="teacher.name" value="Gavin" /> <input name="teacher.level" value="2" /> </form>
@RequestMapping("/school.do") public String school(Student student, Teacher teacher) { return "school"; }
如果还是想刚才的jsp那些写表单,是不能封装参数的,必须把“student.”和“teacher.”去掉,但是这样封装就不能准确封装了。
这个问题最近老是有人问,所以写一个扩展很容易解决这个问题,springmvc和spring一样,预留的扩展点足够多。
我们都知道struts2默认就是这种方案,这是因为struts2采用了OGNL,并通过栈(根对象)进行操作的,而且栈中默认有action实例,所以很自然的没有这种问题。
springmvc不同,没有根对象的概念,而且本身很难来解决这个问题,因此大家在使用时最好避免这种方式或者使用类似于struts1的FormBean组合对象来解决。
解决方案:
扩展spring的HandlerMethodArgumentResolver以支持自定义的数据绑定方式。
1、请下载附件的代码,放到工程中;
2、在RequestMappingHandlerAdapter添加自定义HandlerMethodArgumentResolver Bean;
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <!--线程安全的访问session--> <property name="synchronizeOnSession" value="true"/> <property name="customArgumentResolvers"> <list> <bean class="cn.javass.spring.mvc.method.annotation.RequestJsonParamMethodArgumentResolver"/> <bean class="cn.javass.spring.mvc.method.annotation.FormModelMethodArgumentResolver"/> </list> </property> </bean>
//customArgumentResolvers用于注入自定义的参数解析器,此处我们注了FormModelMethodArgumentResolver;FormModelMethodArgumentResolver我直接修改的org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor;
3、使用方式
public String user(@FormModel("student") Student student, @FormModel("teacher") Teacher teacher)
4、测试控制器
package cn.javass.chapter6.web.controller.formmodel; import java.util.Arrays; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import cn.javass.chapter6.model.UserModel; import cn.javass.spring.mvc.bind.annotation.FormModel; import cn.javass.spring.mvc.util.MapWapper; @Controller @RequestMapping("/formmodel") public class FormModelController { //ok http://localhost:9080/springmvc-chapter6/formmodel/user?user.username=zhang&user.password=123 @RequestMapping("/user/{user.realname}") public String user(@FormModel("user") UserModel user) { System.out.println(user); return "redirect:/success"; } //ok http://localhost:9080/springmvc-chapter6/formmodel/array1?array[0]=zhang&array[1]=li @RequestMapping("/array1") public String array1(@FormModel("array") String[] array) { System.out.println(Arrays.toString(array)); return "redirect:/success"; } //ok http://localhost:9080/springmvc-chapter6/formmodel/array2?array[0].username=zhang&array[0].password=123&array[1].username=li @RequestMapping("/array2") public String array2(@FormModel("array") UserModel[] array) { System.out.println(Arrays.toString(array)); return "redirect:/success"; } //ok http://localhost:9080/springmvc-chapter6/formmodel/list1?list[0]=123&list[1]=234 @RequestMapping("/list1") public String list1(@FormModel("list") List<Integer> list) { System.out.println(list); return "redirect:/success"; } //ok http://localhost:9080/springmvc-chapter6/formmodel/list2?list[0].username=zhang&list[1].username=li @RequestMapping("/list2") public String list2(@FormModel("list") List<UserModel> list) { System.out.println(list); return "redirect:/success"; } //ok http://localhost:9080/springmvc-chapter6/formmodel/map1?map['0']=123&map["1"]=234 @RequestMapping("/map1") public String map1(@FormModel("map") MapWapper<String, Integer> map) { System.out.println(map); return "redirect:/success"; } //ok http://localhost:9080/springmvc-chapter6/formmodel/map2?map['0'].password=123&map['0'].username=123&map["1"].username=234 @RequestMapping("/map2") public String map2(@FormModel("map") MapWapper<Integer, UserModel> map) { System.out.println(map); return "redirect:/success"; } }
具体使用可以下载之前springmvc第六章源代码http://jinnianshilongnian.iteye.com/blog/1683388
将附件中的FormModel.rar解压放到src下进行测试。
支持的spring版本:
springmvc 3.1.x,暂不支持3.0。为什么不支持呢?springmvc 3.1 和 3.0 从架构上发生了变化,而且springmvc3.1更容易扩展。
支持绑定的数据:
模型、集合、数组、MapWapper(Map的一个包装器,通过getInnerMap获取真实Map)
缺点:
spring自定义的参数解析器会放在默认解析器之后,不能指定order,因此如果我们@FormModel("map") Map map,此map会变成Model(请参考http://jinnianshilongnian.iteye.com/blog/1698916 第六部分、Model Map ModelMap),希望未来的版本支持自定义顺序来解决这个问题;此处我们使用MapWapper解决,可以通过MapWapper.getInnerMap()拿到我们需要的Map
其他方案:
[SpringMVC]修改源码使之能够更加智能的自动装配request请求参数.(不建议修改源代码解决)
@rainsoft 也给出了类似的方案, http://www.iteye.com/topic/1124433#2357830
如果你使用的是mvc:annotation-driven,请这样配置
<mvc:annotation-driven> <mvc:argument-resolvers> <bean class="com.sishuok.es.common.web.bind.method.annotation.FormModelMethodArgumentResolver"/> </mvc:argument-resolvers> </mvc:annotation-driven>
欢迎大家反馈问题,我会及时修正。
下一个扩展: 绑定请求参数(JSON字符串,如 deptIds=[{"deptId":4,"isPrimary":true}] ) 到 模型对象。
相关推荐
1.22 扩展SpringMVC以支持更精准的数据绑定1 1.23 扩展SpringMVC以支持绑定JSON格式的请求参数 1.24 扩展SpringMVC以支持绑定JSON格式的请求参数 1.25 在应用层通过spring特性解决数据库读写分离 1.26 context:...
SpringMVC是Spring提供的一个强大而灵活的Web框架 借助于注解 SpringMVC提供了几乎是POJO的开发模式 使得控制器的...4. 功能强大的数据验证 格式化 绑定机制 5. 约定大于配置的契约式编程支持 基于注解的零配置支持等等
Spring MVC(Model-View-Controller)是一个基于Java的MVC...7. 数据绑定(Data Binding) 8. 校验器(Validator) 这些资源描述了Spring MVC框架中不同组件的职责和作用,协同工作以构建可靠和可扩展的Web应用程序。
Spring的数据绑定是高度灵活的: 例如,它把类型不匹配当做验证错误,这样就可以算作应用程序错误,而不是系统错误。因此你不需要简单的重复拷贝您的业务对象的属性,表单对象中的非类型化的字符串只是处理无效的...
在前端方面,使用了Vue.js作为主要的前端框架,Vue.js具有双向数据绑定、组件化开发等特点,能够提升开发效率和代码复用性,同时也使得页面响应更加迅速。 而在后端方面,选用了Spring Boot和SSM框架。Spring Boot...
Vue.js具有双向数据绑定、组件化开发等特点,能够提升开发效率和页面响应速度。 在后端方面,系统采用了Spring Boot和SSM框架。Spring Boot能够快速搭建后端服务,并且集成了大量的开箱即用的功能,简化了开发流程...
SpringMVC:作为Web层框架,处理请求分发和数据绑定,简化了Controller层的开发。 MyBatis:作为持久层框架,实现与数据库的交互操作,提供了灵活的SQL编写方式。 MySQL:作为后端数据库,存储系统所需的各种数据...
和众多其它Web框架一样,它基于MVC设计理念,此外,由于它采用了松散耦合可插拔组件结构,具有比其它MVC框架更多的扩展性和灵活性。 Spring MVC框架围绕DispatcherServlet这个核心展开,DispatcherServlet的作用是...
请求处理流程: 我们将详细解释Spring MVC中的请求处理流程,包括请求映射、参数绑定、数据验证和响应生成。这有助于您理解整个请求生命周期。 配置与注解: 我们将演示如何配置Spring MVC,包括XML配置和注解驱动...
Vue的响应式数据绑定机制,使得前端界面能够实时响应后端数据的变化,提升了用户体验。同时,Vue的路由管理功能也帮助我们实现了页面的灵活跳转与权限控制。 该系统不仅具有基本的美食分享与点评功能,还提供了个性...
Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP .1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的...
简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 ... Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 ...3.Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
通过组件化的方式,实现页面的动态渲染和数据绑定。 功能介绍: 1. 用户注册与登录:用户可以通过微信授权登录,也可以自行注册账号。 2. 马拉松赛事浏览:用户可以查看各个马拉松赛事的详细信息,如比赛时间、地点...
此外,还支持全文检索功能,帮助用户更精确地查找商品。购物车与结算:用户可以将心仪的商品加入购物车,实时查看购物车内的商品数量和总价。在确认无误后,用户可以选择支付方式完成结算。订单管理:用户可以查看...
前端使用Vue.js框架,实现了响应式布局和动态数据绑定,提高了用户界面的交互性和易用性。 后端采用SSM框架,实现了业务逻辑和数据访问的分离,提高了代码的可读性和可维护性。 数据库使用MySQL,提供了可靠的数据...
前端部分采用了Vue.js框架,Vue以其轻量级、响应式的数据绑定和组件化的开发方式,为前端开发者带来了高效的开发体验。通过Vue,系统实现了友好的用户界面和流畅的用户交互,为用户提供了良好的使用体验。 该毕业...
SpringMVC:作为Web层的框架,负责处理用户请求、数据绑定、视图解析等功能,实现了前后端的分离,提高了开发效率。 MyBatis:作为持久层框架,负责与数据库进行交互,简化了SQL语句的编写,提高了数据库操作的效率...