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>



原文地址:https://www.cnblogs.com/lcchuguo/p/5136842.html