spring mvc 接受多對象的處理

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>  

 官方方法是用性更強,對於複雜情況如集合多級嵌套對象等處理完美,計較推薦。

發佈了79 篇原創文章 · 獲贊 34 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章