zoukankan      html  css  js  c++  java
  • spring mvc 接受多对象的处置

    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配置文件进行配置

    <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>



  • 相关阅读:
    servlet多线程同步问题
    servlet之request
    servlet方法
    非静态内部类不能有静态成员
    接口与抽象类的区别
    枚举
    Install CUDA 6.0 on Ubuntu 14.04 LTS
    Introduction to Deep Learning Algorithms
    codeblocks 使用汇总
    矩阵奇异值分解(SVD)及其应用
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5136842.html
Copyright © 2011-2022 走看看