Spring MVC 接受多对象的处置

g3mc 9年前

spring mvc 接受多对象的处理

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

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

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

 然后是一个对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());  

                                    //以下为给对象属性赋值                        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