spring mvc 接受多对象的处理

来源:互联网 发布:阿里云dns地址 编辑:程序博客网 时间:2024/05/16 20:29

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

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

 

Java代码  收藏代码
  1. /** 
  2.  * 处理spring mvc 对象绑定注解 
  3.  * @author lee 
  4.  * 
  5.  */  
  6. @Target(ElementType.PARAMETER)  
  7. @Retention(RetentionPolicy.RUNTIME)  
  8. @Documented  
  9. public @interface RequestBean {  
  10.     String value() default "_def_param_name";  
  11. }  

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

 

 

Java代码  收藏代码
  1. /** 
  2.  * 对象传值的参数绑定处理 
  3.  * @author lee 
  4.  * 
  5.  */  
  6. public class BeanArgumentResolver implements WebArgumentResolver {  
  7.   
  8.     @SuppressWarnings("rawtypes")  
  9.     public Object resolveArgument(MethodParameter param, NativeWebRequest request){  
  10.         RequestBean requestBean = param.getParameterAnnotation(RequestBean.class);  
  11.         try{  
  12.             if (requestBean != null) {  
  13.                 String _param = requestBean.value();  
  14.                 if (_param.equals("_def_param_name")) {  
  15.                     _param = param.getParameterName();  
  16.                 }  
  17.                 Class clazz = param.getParameterType();  
  18.                 Object object = clazz.newInstance();  
  19.                 HashMap<String, String[]> paramsMap = new HashMap<String, String[]>();  
  20.                 Iterator<String> itor = request.getParameterNames();  
  21.                 while (itor.hasNext()) {  
  22.                     String webParam = (String) itor.next();  
  23.                     String[] webValue = request.getParameterValues(webParam);  
  24.                     List<String> webValueList = new ArrayList<String>();  
  25.                     for(int i = 0;i<webValue.length;i++){  
  26.                         if(webValue[i]!=null&&!"".equals(webValue[i])){  
  27.                             webValueList.add(webValue[i]);  
  28.                         }  
  29.                     }  
  30.                     if (webParam.startsWith(_param)&&!webValueList.isEmpty()) {  
  31.                         paramsMap.put(webParam, webValueList.toArray(new String[webValueList.size()]));  
  32.                     }  
  33.                 }  
  34.                 BeanWrapper obj = new BeanWrapperImpl(object);  
  35.                 obj.registerCustomEditor(Date.classnullnew CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));  
  36.                 System.out.println(obj.findCustomEditor(Date.classnull).getAsText());  
  37.   
  38.                 for (String propName : paramsMap.keySet()) {  
  39.                     Object propVals = paramsMap.get(propName);  
  40.                     String[] props = propName.split("\\.");  
  41.                     if (props.length == 2) {  
  42.                         obj.setPropertyValue(props[1], propVals);  
  43.                     } else if (props.length == 3) {  
  44.                         Object tmpObj = obj.getPropertyValue(props[1]);  
  45.                         if (tmpObj == null)  
  46.                             obj.setPropertyValue(props[1], obj.getPropertyType(props[1]).newInstance());  
  47.                         obj.setPropertyValue(props[1] + "." + props[2], propVals);  
  48.                     }  
  49.   
  50.                 }  
  51.                 return object;  
  52.             }  
  53.         }catch(Exception e){  
  54.             e.printStackTrace();  
  55.         }  
  56.         return WebArgumentResolver.UNRESOLVED;  
  57.     }  
  58. }  

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

 

 

Xml代码  收藏代码
  1. <mvc:annotation-driven>  
  2.         <mvc:argument-resolvers>  
  3.             <bean class="xx.xx.xx.xx.BeanArgumentResolver" />  
  4.         </mvc:argument-resolvers>  
  5.         <mvc:message-converters register-defaults="true">  
  6.             <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->  
  7.             <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
  8.                 <constructor-arg value="UTF-8" />  
  9.             </bean>  
  10.             <!-- 将Jackson2HttpMessageConverter的默认格式化输出设为true -->  
  11.             <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
  12.                 <property name="prettyPrint" value="true"/>  
  13.             </bean>     
  14.         </mvc:message-converters>  
  15.     </mvc:annotation-driven>  

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

 

Java代码  收藏代码
  1. @RequestMapping(value="/saveEvent")  
  2. @ResponseBody  
  3. public AjaxResult saveEvent(@RequestBean Event event){  
  4.     event =eventService.saveTemporaryEvent(event);  
  5.     return AjaxResult.objectResult(event);  
  6. }  

 页面form表单代码

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

 

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

 

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

controller端直接使用注解声明

Java代码  收藏代码
  1. @Controller  
  2. @RequestMapping("/demo/formbean")  
  3. public class FormBeanController {  
  4.     @Autowired  
  5.     private FormBeanService formBeanService;  
  6.   
  7.     @InitBinder("formBean1")  
  8.     public void initBinderFormBean1(WebDataBinder binder) {    
  9.         binder.setFieldDefaultPrefix("formBean1.");    
  10.     }  
  11.     @InitBinder("formBean2")  
  12.     public void initBinderFormBean2(WebDataBinder binder) {    
  13.         binder.setFieldDefaultPrefix("formBean2.");    
  14.     }  
  15.     @RequestMapping("/save12")  
  16.     @ResponseBody  
  17.     public ModelAndView save12(FormBean1 formBean1, FormBean2 formBean2){  
  18.         formBean2 = formBeanService.saveFromBean12(formBean1, formBean2);  
  19.         ModelAndView mav = new ModelAndView();  
  20.         mav.setViewName("redirect:/demo/formbean/edit12/"+formBean2.getId());  
  21.         return mav;  
  22.     }  
  23.       
  24. }  

 html方式相差不大

Html代码  收藏代码
  1. <form class="form-horizontal" id="formBean1Form" method="post">  
  2.       <div class="control-group">  
  3.         <label class="control-label" for="code">FB1编号</label>  
  4.         <div class="controls">  
  5.           <input type="hidden" id="formBean1.id" name="formBean1.id" value="${formBean2.formBean1.id }" />  
  6.           <input type="text" id="formBean1.code" name="formBean1.code" value="${formBean2.formBean1.code }" />  
  7.         </div>  
  8.       </div>  
  9.       <div class="control-group">  
  10.         <label class="control-label" for="name">FB1名称</label>  
  11.         <div class="controls">  
  12.           <input type="text" id="formBean1.name" name="formBean1.name" value="${formBean2.formBean1.name }" >  
  13.         </div>  
  14.       </div>  
  15.       <div class="control-group">  
  16.         <label class="control-label" for="name">FB2编号</label>  
  17.         <div class="controls">  
  18.           <input type="hidden" id="formBean2.id" name="formBean2.id" value="${formBean2.id }" />  
  19.           <input type="text" id="formBean2.code" name="formBean2.code" value="${formBean2.code }" >  
  20.         </div>  
  21.       </div>  
  22.       <div class="control-group">  
  23.         <label class="control-label" for="name">FB2名称</label>  
  24.         <div class="controls">  
  25.           <input type="text" id="formBean2.name" name="formBean2.name" value="${formBean2.name }" >  
  26.         </div>  
  27.       </div>  
  28.       <div class="control-group">  
  29.         <div class="controls">  
  30.           <button type="submit" class="btn" onclick="this.form.action='${ctx}/demo/formbean/save12'">提交</button>  
  31.         </div>  
  32.       </div>  
  33.     </form>  

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

0 0
原创粉丝点击