struts 中LazyValidatorForm特别适用于FormBean中并不包含POJO商业对象所有属性的情况,因为通常项目里都属于这种情况,所以springside默认使用lazyValidatorForm. 比如User对象 有 id,name,status三个属性,而form表单中只有id和name两个input框,如果使用其他模式,直接把user 作为 form bean, user对象的status因为没设值,将为null, copy 到作为商业对象的user时,就会以null覆盖原值。而lazyBean就没有这个问题,如果form中没有status属性,它不会将它copy给商业对象。 实际工程中将封装beanUtils中的copyProperties方法,用于将form中的属性绑定到实体对象中, /** * 将FormBean中的内容通过BeanUtils的copyProperties()绑定到Object中. * 因为BeanUtils中两个参数的顺序很容易搞错,因此封装此函数. */ protected void bindEntity(ActionForm form, Object object) { if (form != null) { try { BeanUtils.copyProperties(object, form); } catch (Exception e) { ReflectionUtils.handleReflectionException(e); } } } 注意实体对象被自动绑定,默认Integer id 在空值时会被赋值为0,需要增加converter,让其默认为null,虽然也可以在web.xml里进行相关配置,但还是在基类里配置了比较安全。在工程中可以这样实现 /** * 设置Struts 中数字<->字符串转换,字符串为空值时,数字默认为null,而不是0. * 也可以在web.xml中设置struts的参数达到相同效果,在这里设置可以防止用户漏设web.xml. */ public static void registConverter() { ConvertUtils.register(new StringConvert("yyyy-MM-dd"), String.class); ConvertUtils.register(new IntegerConverter(null), Integer.class); ConvertUtils.register(new LongConverter(null), Long.class); ConvertUtils.register(new FloatConverter(null), Float.class); ConvertUtils.register(new DoubleConverter(null), Double.class); ConvertUtils.register(new DateConvert("yyyy-MM-dd"), Date.class); }