`
lee1177
  • 浏览: 117799 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring mvc 接受多对象的处理

阅读更多

spring mvc感觉很好用,尤其是对接收对象参数的自动绑定非常简便,但对于同时传多个对象时有些困扰。同时项目并没有直接使用spring的formtag。从网上学来的多对象传值,自己优化了下,原文找不到出处了这里记录下。

首先声明一个注解类,用于对传值对象的声明

 

/**
 * 处理spring mvc 对象绑定注解
 * @author lee
 *
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBean {
	String value() default "_def_param_name";
}

 然后是一个对WebArgumentResolver的实现类,对象参数绑定主要是这个类来处理

 

 

/**
 * 对象传值的参数绑定处理
 * @author lee
 *
 */
public class BeanArgumentResolver implements WebArgumentResolver {

	@SuppressWarnings("rawtypes")
	public Object resolveArgument(MethodParameter param, NativeWebRequest request){
		RequestBean requestBean = param.getParameterAnnotation(RequestBean.class);
		try{
			if (requestBean != null) {
				String _param = requestBean.value();
				if (_param.equals("_def_param_name")) {
					_param = param.getParameterName();
				}
				Class clazz = param.getParameterType();
				Object object = clazz.newInstance();
				HashMap<String, String[]> paramsMap = new HashMap<String, String[]>();
				Iterator<String> itor = request.getParameterNames();
				while (itor.hasNext()) {
					String webParam = (String) itor.next();
					String[] webValue = request.getParameterValues(webParam);
					List<String> webValueList = new ArrayList<String>();
					for(int i = 0;i<webValue.length;i++){
						if(webValue[i]!=null&&!"".equals(webValue[i])){
							webValueList.add(webValue[i]);
						}
					}
					if (webParam.startsWith(_param)&&!webValueList.isEmpty()) {
						paramsMap.put(webParam, webValueList.toArray(new String[webValueList.size()]));
					}
				}
				BeanWrapper obj = new BeanWrapperImpl(object);
				obj.registerCustomEditor(Date.class, null, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));
				System.out.println(obj.findCustomEditor(Date.class, null).getAsText());

				for (String propName : paramsMap.keySet()) {
					Object propVals = paramsMap.get(propName);
					String[] props = propName.split("\\.");
					if (props.length == 2) {
						obj.setPropertyValue(props[1], propVals);
					} else if (props.length == 3) {
						Object tmpObj = obj.getPropertyValue(props[1]);
						if (tmpObj == null)
							obj.setPropertyValue(props[1], obj.getPropertyType(props[1]).newInstance());
						obj.setPropertyValue(props[1] + "." + props[2], propVals);
					}

				}
				return object;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return WebArgumentResolver.UNRESOLVED;
	}
}

 两个类写好后对mvc配置文件进行配置

 

 

<mvc:annotation-driven>
		<mvc:argument-resolvers>
			<bean class="xx.xx.xx.xx.BeanArgumentResolver" />
		</mvc:argument-resolvers>
		<mvc:message-converters register-defaults="true">
			<!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
		    	<constructor-arg value="UTF-8" />
			</bean>
			<!-- 将Jackson2HttpMessageConverter的默认格式化输出设为true -->
			<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="prettyPrint" value="true"/>
            </bean>	
  		</mvc:message-converters>
	</mvc:annotation-driven>

 接下来就是使用了mvc的controller方法如下

 

@RequestMapping(value="/saveEvent")
@ResponseBody
public AjaxResult saveEvent(@RequestBean Event event){
	event =eventService.saveTemporaryEvent(event);
	return AjaxResult.objectResult(event);
}

 页面form表单代码

<td align="right">客户代码:</td>
            <td><input type="hidden" name="event.submitUser.userId" value="${event.submitUser.userId }" /></td>
            <td align="right">客户电话:</td>
            <td><input class="inpname_" type="text" id="submitTel" name="event.submitTel" value="${event.submitTel }"/></td>

 

-------------------------------------------------------------分割线----------------------------------------------------------------

 

经过一段时间的使用,发现此方法对于传值有很多限制,复杂情况处理很不理想。特意补充官方推荐用法。

controller端直接使用注解声明

@Controller
@RequestMapping("/demo/formbean")
public class FormBeanController {
	@Autowired
	private FormBeanService formBeanService;

	@InitBinder("formBean1")
    public void initBinderFormBean1(WebDataBinder binder) {  
		binder.setFieldDefaultPrefix("formBean1.");  
    }
	@InitBinder("formBean2")
    public void initBinderFormBean2(WebDataBinder binder) {  
		binder.setFieldDefaultPrefix("formBean2.");  
    }
	@RequestMapping("/save12")
	@ResponseBody
	public ModelAndView save12(FormBean1 formBean1, FormBean2 formBean2){
		formBean2 = formBeanService.saveFromBean12(formBean1, formBean2);
		ModelAndView mav = new ModelAndView();
		mav.setViewName("redirect:/demo/formbean/edit12/"+formBean2.getId());
		return mav;
	}
	
}

 html方式相差不大

<form class="form-horizontal" id="formBean1Form" method="post">
	  <div class="control-group">
	    <label class="control-label" for="code">FB1编号</label>
	    <div class="controls">
	      <input type="hidden" id="formBean1.id" name="formBean1.id" value="${formBean2.formBean1.id }" />
	      <input type="text" id="formBean1.code" name="formBean1.code" value="${formBean2.formBean1.code }" />
	    </div>
	  </div>
	  <div class="control-group">
	    <label class="control-label" for="name">FB1名称</label>
	    <div class="controls">
	      <input type="text" id="formBean1.name" name="formBean1.name" value="${formBean2.formBean1.name }" >
	    </div>
	  </div>
	  <div class="control-group">
	    <label class="control-label" for="name">FB2编号</label>
	    <div class="controls">
	      <input type="hidden" id="formBean2.id" name="formBean2.id" value="${formBean2.id }" />
	      <input type="text" id="formBean2.code" name="formBean2.code" value="${formBean2.code }" >
	    </div>
	  </div>
	  <div class="control-group">
	    <label class="control-label" for="name">FB2名称</label>
	    <div class="controls">
	      <input type="text" id="formBean2.name" name="formBean2.name" value="${formBean2.name }" >
	    </div>
	  </div>
	  <div class="control-group">
	    <div class="controls">
	      <button type="submit" class="btn" onclick="this.form.action='${ctx}/demo/formbean/save12'">提交</button>
	    </div>
	  </div>
	</form>

 官方方法是用性更强,对于复杂情况如集合多级嵌套对象等处理完美,计较推荐。

分享到:
评论
2 楼 ly10265139 2015-12-24  
1 楼 chenlei1728 2015-01-13  
没看太懂,能具体的聊一下吗?可以的话,加我QQ:174312406

相关推荐

    Spring MVC 入门实例

    首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求交给一个名为 helloController ...

    深入解析Spring+MVC与Web+Flow.pdf

    《深入解析Spring MVCgn Web Flow》是Spring MVC 和Web Flow 两个框架的权威指南,书中包括的技巧和提示可以让你从这个灵活的框架中汲取尽可能多的信息。书中包含了一些开发良好设计和解耦的Web 应用程序的最佳实践...

    Spring MVC 3.0实战指南.ppt

    《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7...

    Spring MVC 开发一般步骤详述

    本人将Spring MVC的一般开发步骤做了一个详细的记录 有相关截图 相关核心代码 为懂各个java代码但是不会整合开发的朋友提供一个借鉴 希望朋友们看了文档后能够达到用java做系统全程开发的能力 主要涉及的内容有以下...

    Spring MVC 3.0 单表单 同时提交 不同对象到后台

    自定义 RequestBean 注解 及 WebArgumentResolver 完成如下格式表单提交 ...最简单的 是 新定义 一个 过渡对象 Objects 其包含 user group.....等 然后用如上 格式提交 最终 到后台 进行各取所需

    Spring3MVC注解教程.ppt

    《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及...

    Spring+MVC+Mybatis 书城项目

    Spring提供了很多功能,包括事务管理、依赖注入、AOP(面向切面编程)等。 Spring MVC: Spring MVC是Spring框架的一个模块,它实现了MVC(模型-视图-控制器)设计模式,用于构建Web应用。Spring MVC允许你将应用的...

    Spring MVC 员工管理系统

    Spring MVC框架围绕DispatcherServlet这个核心展开,DispatcherServlet的作用是截获请求并组织一系列组件共同完成请求的处理工作。 JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它...

    spring3.0 MVC中文教程

    spring3.0 MVC中文教程 翻译viralpatel.net网站文章...在Spring3 MVC和Hibernate保存/ Retreving BLOB对象等教程使用,希望多大家有帮助。里面可能有部分单词翻译有失误,不过并不影响整体阅读。(文档中有源码下载地址)

    spring mvc 完整示例 前台+后台

    前台使用jquery1.6 后台使用spring mvc 功能: 登陆+显示用户列表

    202305-Spring MVC面试题(2023最新版)思维导图.zip

    - Spring MVC - Spring Data - Spring Security - Spring Cloud 4. Web开发: - HTML、CSS、JavaScript - HTTP协议 - Servlet、JSP - AJAX、JSON、XML 5. 框架和工具: - MyBatis - Hibernate - ...

    spring mvc注释文档

    • 让一个 Controller 处理多个 URL 请求 • 清单 3. 每个请求处理参数对应一个 URL • 处理方法入参如何绑定 URL 参数 • 清单 5. 按参数名匹配进行绑定 • 清单 8. 通过 @RequestParam 注解指定 • 清单 11. 使...

    Spring MVC 学习笔记

    2、 DispatcherServlet把请求转交给HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象.(后面会学习到拦截器) 3、 ...

    SpringMVC接收多个对象的4种方法

    主要为大家详细介绍了SpringMVC接收多个对象的4种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    swiftboot:基于Spring Boot,Spring MVC,Spring Data 的企业Web应用快速开发开发框架。A rapid development framework based on Spring Boot, Spring MVC and Spring Data for enterprise

    基于 Spring Boot,Spring MVC,Spring Data 的企业Web应用快速开发框架。 为什么要有 SwiftBoot 虽然用 SpringBoot 搭建框架进行开发已经简化了很多配置的工作,但是对于大多数中小型的项目来说来,还是有一些重复...

    图书管理系统( Spring+Spring MVC+JdbcTemplate).zip

    Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...

    毕业设计管理系统java服务端,采用spring mvc.zip

    Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,被设计为一种简单、健壮、可移植、多线程、动态的语言。Java的主要特点和优势...

    spring3.0帮助文档(包含REST资料)

    Spring 3.0重要特性总结如下: ...◆对象/XML映射(OXM):原本在Spring Web服务中提供,现在被纳入Spring框架核心。 ◆下一代计划能力:新的TaskScheduler以及Trigger机制,包含第一类cron支持。

    spring4.3.2参考文档(英文)

    Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。 Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,...

Global site tag (gtag.js) - Google Analytics