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>
官方方法是用性更强,对于复杂情况如集合多级嵌套对象等处理完美,计较推荐。
相关推荐
9. **异步处理支持**:Spring MVC支持异步处理请求,允许在不阻塞线程的情况下执行耗时的操作,从而提高系统性能。 10. **国际化和本地化**:通过消息源和LocaleResolver,Spring MVC可以轻松实现应用的多语言支持...
6. **数据绑定与验证**:Spring MVC提供了数据绑定和验证功能,允许将表单数据自动绑定到Java对象,并进行校验,简化了业务逻辑处理。 7. **视图解析**:Spring MVC 4.0支持多种视图技术,如JSP、FreeMarker、...
在Spring MVC中,Controller处理请求,Model代表业务对象,View负责渲染视图。 2. **DispatcherServlet**:Spring MVC的核心组件,作为前端控制器,负责接收HTTP请求,调度请求到相应的处理器。 3. **@Controller*...
Spring 4引入了更多的注解,如`@RestController`(用于RESTful服务)、`@PathVariable`(用于处理URL路径变量)、`@RequestParam`(用于处理请求参数)等,这使得代码更加简洁,降低了XML配置的复杂性。 7. **...
Spring MVC支持多语言和主题切换,通过LocaleResolver和ThemeResolver实现。 12. **测试** Spring MVC提供了MockMvc工具,可以在不启动服务器的情况下进行单元测试和集成测试。 这个“spring MVC_快速入门”文档...
14. **Internationalization (i18n) & Localization (l10n)**: Spring MVC 支持多语言和本地化,可以通过消息源(MessageSource)和locale resolver来实现。 15. **Async Support**: Spring MVC 提供异步处理支持,...
在这个“最全的Spring MVC注解例子”中,我们将深入探讨Spring MVC的核心注解,以及如何实现异步请求处理和错误管理。 1. **Spring MVC核心注解** - `@Controller`:标记一个类为处理HTTP请求的控制器。这是Spring...
Spring MVC还提供了许多高级功能,如RESTful支持、上传下载处理、局部化和主题支持等。通过源码,我们可以看到这些功能背后的实现细节,比如如何处理HTTP方法、如何处理文件上传以及如何实现多语言支持。 总的来说...
**Spring MVC IDEA版本...随着对Spring MVC的深入学习,你可以添加更多的功能,如处理POST请求、使用ModelAndView对象、处理异常等。此外,还可以利用Spring Boot的特性,如自动配置、Actuator监控等,进一步优化项目。
综上所述,整合Spring MVC和MyBatis涉及了Web应用的多个层面,从配置到业务逻辑,都需要细心设计和实现。这个过程不仅要求对两个框架有深入理解,还需要熟悉Spring的IoC和AOP原理。通过这样的整合,我们可以构建出...
Spring框架则是一个全面的企业级应用开发平台,它不仅包含Spring MVC,还提供了依赖注入(DI)、AOP(面向切面编程)、事务管理、JDBC抽象、缓存、任务调度等多个核心功能。在全注解开发中,我们可以使用@Autowired...
Spring MVC中的异步处理涉及到多个组件,包括`DispatcherServlet`、`AsyncSupportResolver`、`AsyncHandlerAdapter`和`AsyncHandlerInterceptor`。`DispatcherServlet`接收到请求后,会根据请求类型和处理器适配器来...
12. **国际化与本地化**:Spring MVC 提供了支持多语言的功能,可以根据用户的 locale 选择相应的资源文件。 Spring MVC 是一个强大且灵活的框架,它与 Spring 框架的其他模块(如 Spring JDBC、Spring ORM、Spring...
《Spring MVC Cookbook》是由PACKT Publishing在2016年出版的一本专著,主要针对Spring MVC框架提供了实用的解决方案和技巧。Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用程序提供了一个模型-视图-...
首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求交给一个名为 helloController ...
标题中的"开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp"表明这是一个关于Spring MVC框架的开发教程,其中包含了源代码供学习者参考。Spring MVC是Spring框架的一个核心组件...
Spring MVC 是一个基于Java的...随着你对Spring MVC的深入学习,你可以了解到更多高级特性,如数据验证、国际化、异常处理、Ajax支持、RESTful API设计等。这只是一个起点,Spring MVC的强大功能等待着你去探索和利用。