Spring mvc 前端表单传递来的数据被后台的两个entity的相同名字的属性谁获取的问题
2017-10-30 19:22
381 查看
原文地址:http://blog.csdn.net/outlook008/article/details/8455710当我们的input标签里面写着如下的代码是这样的 <input type='text' name='orderId' /> 会赋值到Springmvc的方法上的实体的orderId的属性上。当然,后台拥有属性名为orderId的实体只有一个那还好说,如果是两个的话,那就有点麻烦。当然也是有办法的。加入一个实体的变量是order 里面含有orderId属性 worker实体也含有orderId属性。我们可以这样写 <input type='text' name='order.orderId' /> 和 <input type='text' name='worker.orderId' />来区分是哪个实体的成员变量我们先写一个自定义的注解package com.thinkgem.jeesite.modules;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface RequestBean {String value() default "_def_param_name";}我们再为这个注解写一个解析器package com.thinkgem.jeesite.modules;import org.springframework.beans.BeanWrapper;import org.springframework.beans.BeanWrapperImpl;import org.springframework.beans.propertyeditors.CustomDateEditor;import org.springframework.core.MethodParameter;import org.springframework.web.bind.support.WebArgumentResolver;import org.springframework.web.context.request.NativeWebRequest;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Iterator;public class BeanArgumentResolver implements WebArgumentResolver {@SuppressWarnings("rawtypes")public Object resolveArgument(MethodParameter param, NativeWebRequest request) throws Exception {RequestBean requestBean = param.getParameterAnnotation(RequestBean.class);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);if (webParam.startsWith(_param)) {paramsMap.put(webParam, webValue);}}BeanWrapper obj = new BeanWrapperImpl(object);//obj.findCustomEditor(paramClass, paramString)obj.registerCustomEditor(Date.class, null, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));//WebDataBinder.System.out.println(obj.findCustomEditor(Date.class, null).getAsText());for (String propName : paramsMap.keySet()) {String[] 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);}}/** Field[] fields = clazz.getDeclaredFields(); for(Field* field:fields){ obj.setPropertyValue(field.getName(),* paramsMap.get(_param +"."+field.getName())); }** for(String porpName:paramsMap.keySet()){ String[] params =* paramsMap.get(porpName); if (null != params) { Object* field=obj.getPropertyValue(porpName.replaceFirst(_param+".",* "")); Class* clz=obj.getPropertyType(porpName.replaceFirst(_param+".", ""));* System.out.println(porpName.replaceFirst(_param+".",* "")+":"+field+" "+clz); if(field==null){* //field=obj.getPropertyType(porpName.replaceFirst(_param+".",* "")).newInstance(); }* obj.setPropertyValue(porpName.replaceFirst(_param+".", ""),* params); } }*//** Method[] methods = clazz.getMethods(); for (Method m : methods) {* Class[] parClazzs = m.getParameterTypes(); String methodName =* m.getName(); if (parClazzs.length == 1 &&* methodName.startsWith("set")) {** String[] params = paramsMap.get(_param +* methodName.toLowerCase().replace("set", "."));** if (parClazzs[0].equals(String.class)) { if (null != params) {* m.invoke(object, new Object[] { params[0] }); } } else if* (parClazzs[0].equals(String[].class)) { if (null != params) {* m.invoke(object, new Object[] { params }); } } }** }*/return object;} else {return WebArgumentResolver.UNRESOLVED;}}}在Spring的xml配置文件上加上一些xml片段<mvc:argument-resolvers><bean class="com.thinkgem.jeesite.modules.BeanArgumentResolver"/></mvc:argument-resolvers>在我们的Controller中就可以这样写得以区分@RequestMapping(value = {"hehe", ""})public String hehe(@RequestBean("order") Order order, @RequestBean("workerDepositInfo") WorkerDepositInfo workerDepositInfo) {
}
相关文章推荐
- 表单中多个请求参数名字相同,服务器到底获取的是哪个请求参数的值,表单的action和get和post提交方式的关系以及提交数据的不同点
- Spring MVC前台属性数据的传递和后台属性数据的接收
- 记录问题:表单元素设置disabled属性后台不能获取该值
- ajax提交file表单,spring mvc后台获取file表单数据
- spring mvc 前台属性数据的传递和后台属性数据的接收
- 关于先后两个方法从后台获取数据,传参报空的问题
- post表单提交后,后台获取数据为null 大量数据的时候会出现这个问题
- java后台设置可跨域访问,前端ajax获取json数据,解决浏览器限制跨域访问的问题
- 关于前台合并获取后台动态table中数据相同的单元格的问题;th td合并
- liferay6.2 spring mvc表单数据无法传递到后台
- Android两个Activity传递数据,onActivityResult获取结果时Intent为空问题
- java 后台实现ajax post跨域请求传递json格式数据获取json数据问题
- PHP无法获取表单post方式提交的数据问题
- GET方式传递表单数据需要注意的一个问题
- Request 分别获取具有相同 name 属性表单元素值
- struts2 + ajax(由前台的form提交数据到后台,再根据form所调用返回获取的后台json格式的数据返回到前端,然后前端用jquery对json数据进行解析)==》》涉及文件上传的部分
- 前端传递数据超过2M不能传给后台
- python MySQLdb 问题 - 程序已的后台运行每90秒获取数据,却无法获取最新的值
- struts2 + ajax(由前台的form提交数据到后台,再根据form所调用返回获取的后台json格式的数据返回到前端,然后前端用jquery对json数据进行解析)==》》涉及非文件上传的部分
- ThinkPHP定时ajax获取后台数据,使用javascript动态修改前端页面的表格来显示数据