spring mvc MultiActionController 兑现 SimpleFormController 自动封装form
spring mvc MultiActionController 实现 SimpleFormController 自动封装form
一直没在这写过 今天突然高兴 ,昨天搜到 大家在用spring mvc时 对 multi controller 对form的搜集并没有好的处理方法 尤其是 对子对象的操作
废话不说了先说 思路
1 通过测试我发现 如果对象结构 是这样
那么
即可 因此为了 通用 我用 我就想用反射 取出 主对象中的从对象然后调用set方法 终于功夫不负苦心人 几经摸索 终于探索出几行代码 用的java.beans 里的类 要是不看spring 还真知道这个类
既然如此 就干脆 override bind方法 吧 呵呵 刚开始写了 这个
为了继续验证 是否正确 我定义了近可能多的 属性
发现 不对 集合类和 非声明的对象还是有问题 于是继续改代码
到现在已经是 晚上12点多 ,不做测试了 等以后有bug了 再继续吧 欢迎 朋友们提bug 最后发布最终版(今日)代码
至于 view层 的form 可以直接 xx.xx了 <input type="text" name="address.name"
好累 以后再写吧
我还写过 一个 ext的封装组件思路 不过一直欣赏 renren网 有兴趣的同志可以 搜下啊哈
http://blog.renren.com/blog/225311006/479329473?isDeclare=false
一直没在这写过 今天突然高兴 ,昨天搜到 大家在用spring mvc时 对 multi controller 对form的搜集并没有好的处理方法 尤其是 对子对象的操作
废话不说了先说 思路
1 通过测试我发现 如果对象结构 是这样
public class User { private String username; private String password; private Address address;
那么
public ModelAndView saveHandler(HttpServletRequest request,HttpServletResponse response,Object command) throws Exception{ User user=new User(); user.setAddress(new Address()); bind(request, user); System.out.println(user); return new ModelAndView(); }
即可 因此为了 通用 我用 我就想用反射 取出 主对象中的从对象然后调用set方法 终于功夫不负苦心人 几经摸索 终于探索出几行代码 用的java.beans 里的类 要是不看spring 还真知道这个类
既然如此 就干脆 override bind方法 吧 呵呵 刚开始写了 这个
@Override protected void bind(HttpServletRequest request, Object command) throws Exception{ BeanInfo beanInfo= Introspector.getBeanInfo(command.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); for(PropertyDescriptor pd:pds){ if(!BeanUtils.isSimpleProperty(pd.getPropertyType())){ pd.getWriteMethod().invoke(command,pd.getPropertyType().newInstance()); } } super.bind(request, command); }最后 找了找发现 BeanUtils 类里方法真全 而且 写的也比用apache 本身的好(个人感觉啊 ) 所以 得出代码
package com.llb.web; import java.beans.PropertyDescriptor; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.BeanUtils; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; public class BaseController extends MultiActionController { @Override protected void bind(HttpServletRequest request, Object command) throws Exception{ PropertyDescriptor[] pds=BeanUtils.getPropertyDescriptors(command.getClass()); for(PropertyDescriptor pd:pds){ if(!BeanUtils.isSimpleProperty(pd.getPropertyType())){ pd.getWriteMethod().invoke(command,pd.getPropertyType().newInstance()); } } super.bind(request, command); } }
为了继续验证 是否正确 我定义了近可能多的 属性
public class User { private String username; private String password; private Address address; private boolean flag; private int count; private Date createDate; private double doubleParam; private float floatParam; private byte byteParam; private short shortParam; private long longParam; private char charParam; private Collection collection; private List<String> list=new ArrayList<String>(0);; private ArrayList arrayList; private LinkedList linkedList; private Set set; private HashSet<String> hashSet=new HashSet<String>(0); private LinkedHashSet linkedHashSet; private com.sun.xml.xsom.impl.scd.Iterators.Map map; private java.util.Map mapp; private HashMap hashMap; private LinkedHashMap<String, String> linkedHashMap=new LinkedHashMap<String, String>(0); private Boolean boolean1; private Integer interger1; private Double double1; private Float float1; private Character char1; private String[] strArray; private int[] intArray;
发现 不对 集合类和 非声明的对象还是有问题 于是继续改代码
Class<?> clas=pd.getPropertyType(); boolean isSimpleProperty=BeanUtils.isSimpleProperty(clas); boolean isInterface=clas.isInterface(); boolean hasConstruct=clas.getConstructors().length==0?false:true; if(!isSimpleProperty&&!isInterface&&hasConstruct){ pd.getWriteMethod().invoke(command,clas.newInstance()); }
到现在已经是 晚上12点多 ,不做测试了 等以后有bug了 再继续吧 欢迎 朋友们提bug 最后发布最终版(今日)代码
package com.llb.web; import java.beans.PropertyDescriptor; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.BeanUtils; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; public class BaseController extends MultiActionController { @Override protected void bind(HttpServletRequest request, Object command) throws Exception{ PropertyDescriptor[] pds=BeanUtils.getPropertyDescriptors(command.getClass()); for(PropertyDescriptor pd:pds){ Class<?> clas=pd.getPropertyType(); boolean isSimpleProperty=BeanUtils.isSimpleProperty(clas); boolean isInterface=clas.isInterface(); boolean hasConstruct=clas.getConstructors().length==0?false:true; if(!isSimpleProperty&&!isInterface&&hasConstruct){ pd.getWriteMethod().invoke(command,clas.newInstance()); } } super.bind(request, command); } }
至于 view层 的form 可以直接 xx.xx了 <input type="text" name="address.name"
好累 以后再写吧
我还写过 一个 ext的封装组件思路 不过一直欣赏 renren网 有兴趣的同志可以 搜下啊哈
http://blog.renren.com/blog/225311006/479329473?isDeclare=false