Spring MVC 接受多對象的處置

g3mc 9年前發布 | 26K 次閱讀 Spring MVC Web框架

spring mvc 接受多對象的處理

spring mvc感覺很好用,尤其是對接收對象參數的自動綁定非常簡便,但對于同時傳多個對象時有些困擾。同時項目并沒有直接使用spring的formtag。從網上學來的多對象傳值,自己優化了下,原文找不到出處了這里記錄下。

首先聲明一個注解類,用于對傳值對象的聲明

    /**

 * 處理spring mvc 對象綁定注解  
 *  
 */  
@Target(ElementType.PARAMETER)  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
public @interface RequestBean {  
    String value() default "_def_param_name";  
}  </pre><br />

 然后是一個對WebArgumentResolver的實現類,對象參數綁定主要是這個類來處理

    /**

 * 對象傳值的參數綁定處理 
 * 
 */  
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());  </pre><br />

                                    //以下為給對象屬性賦值  
                    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配置文件進行配置</span></span></span>
    <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>

來自:http://blog.csdn.net/wj512416359/article/details/37567449

 本文由用戶 g3mc 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!