该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-14
spring mvc 为什么只支持一个form对象?难道不会出现一个form里包含多个domain对象的情况,还是本意就是推荐用map或者新建一个VO来做form对象?很怀念Struts2
ongl表达式 |
|
返回顶楼 | |
发表时间:2012-02-14
先下了,有时间再看看啊,在这表示支持下,看样子楼主很用心啊
|
|
返回顶楼 | |
发表时间:2012-02-15
最后修改:2012-02-15
risemanjavaeye 写道 spring mvc 为什么只支持一个form对象?难道不会出现一个form里包含多个domain对象的情况,还是本意就是推荐用map或者新建一个VO来做form对象?很怀念Struts2
ongl表达式 Spring的Bean设置,“表单/命令”对象也完全支持ongl表达式,Spring MVC对处理方法的签名异常灵活,它会根据方法入参类型,“智能地”将Request中的数据绑定到入参中。可以是以下类型的入参对象,且可以任意多个入参,Spring MVC将透明地实现数据绑定:
个人觉得Spring的数据绑定这块是非常灵活的,可能是Java现有MVC框架中做得最好了,只要你去尝试一下,相信你也会和我有相同的看法。 |
|
返回顶楼 | |
发表时间:2012-02-15
stamen 写道 Spring的Bean设置,“表单/命令”对象也完全支持ongl表达式,Spring MVC对处理方法的签名异常灵活,它会根据方法入参类型,“智能地”将Request中的数据绑定到入参中。可以是以下类型的入参对象,且可以任意多个入参,Spring MVC将透明地实现数据绑定:
个人觉得Spring的数据绑定这块是非常灵活的,可能是Java现有MVC框架中做得最好了,只要你去尝试一下,相信你也会和我有相同的看法。 不知你的“表单/命令”对象也完全支持ongl表达式从哪里得到的,最好可以举一个例子。 你对于这个问题的回答是有误的,因为按照目前SpringMVC对于参数绑定的支持,多个POJO在参数列表中共存是很难实现的,必须借助程序员的自行扩展(这种扩展只有在SpringMVC3.1之后才开放接口,3.1之前你连扩展的门路都没有)。如果你要说服别人,还是要拿出真凭实据,把调试通过的源代码列出来。 SpringMVC的数据绑定是建立在方法参数上的,由于Java语法的限制(方法参数在方法签名中实际上是没有名称的),导致了SpringMVC不得不始终借助其它的语法元素(例如Annotation)的帮忙才能完成参数绑定。所以在这个方面SpringMVC是不可能比Struts2做得更好的。 小伙子话可不要说得太满,大家乐意看到的是真凭实据。 |
|
返回顶楼 | |
发表时间:2012-02-15
risemanjavaeye 写道 spring mvc 为什么只支持一个form对象?难道不会出现一个form里包含多个domain对象的情况,还是本意就是推荐用map或者新建一个VO来做form对象?很怀念Struts2
ongl表达式 SpringMVC3.1之后提供了扩展接口可以实现,不过实现起来不是很容易,祝你好运! |
|
返回顶楼 | |
发表时间:2012-02-15
收藏,有时间研究下Spring的MVC
|
|
返回顶楼 | |
发表时间:2012-02-16
stamen 写道 risemanjavaeye 写道 spring mvc 为什么只支持一个form对象?难道不会出现一个form里包含多个domain对象的情况,还是本意就是推荐用map或者新建一个VO来做form对象?很怀念Struts2
ongl表达式 Spring的Bean设置,“表单/命令”对象也完全支持ongl表达式,Spring MVC对处理方法的签名异常灵活,它会根据方法入参类型,“智能地”将Request中的数据绑定到入参中。可以是以下类型的入参对象,且可以任意多个入参,Spring MVC将透明地实现数据绑定:
个人觉得Spring的数据绑定这块是非常灵活的,可能是Java现有MVC框架中做得最好了,只要你去尝试一下,相信你也会和我有相同的看法。 Spring 完全不支持ongl或者类似的方案,他的一个form就对应一个表单对象,不能自主的创建对象树并给相关对象属性设置值。我说的这些就是Struts2和ww的那种方式,假如,事实上,一对一的两个对象,可能其中的一个对象就是另一个对象的属性,只是在抽象的时候抽象成了一个对象,但srping却不能很简单的处理这个真属性假对象的表单,让人很无语,在Struts2里我只要设置name="x.y.z.name",他就能帮我把这个input的值放到z对象的name属性。更不用说那种跨两个domain对象的了属性自动赋值了,我除了把对象树扁平化成一个VO没有其它好方法,请楼主指教 |
|
返回顶楼 | |
发表时间:2012-02-16
感谢作者分享,学习了
|
|
返回顶楼 | |
发表时间:2012-02-16
刚好这段时间比较空闲,下来看看。
|
|
返回顶楼 | |
发表时间:2012-02-16
risemanjavaeye 写道 Spring 完全不支持ongl或者类似的方案,他的一个form就对应一个表单对象,不能自主的创建对象树并给相关对象属性设置值。我说的这些就是Struts2和ww的那种方式,假如,事实上,一对一的两个对象,可能其中的一个对象就是另一个对象的属性,只是在抽象的时候抽象成了一个对象,但srping却不能很简单的处理这个真属性假对象的表单,让人很无语,在Struts2里我只要设置name="x.y.z.name",他就能帮我把这个input的值放到z对象的name属性。更不用说那种跨两个domain对象的了属性自动赋值了,我除了把对象树扁平化成一个VO没有其它好方法,请楼主指教 这个问题我可以给你大致回复一下。 比如你有一个Entity: public class User { private String email; private String password; private User leader; } 这里的User中含有一个复合对象leader。在SpringMVC中可以对leader这个属性中的内部属性进行参数映射的。比如:/register?email=downpour&leader.email=downpourLeader就可以映射到下面的Controller: public class UserController { @RequestMapping("/register") public ModelAndView register(User user) { System.out.println(user.getEmail()); // downpour System.out.println(user.getLeader().getEmail()); // downpourLeader return new ModelAndView("success"); } } 这个并不是SpringMVC的弱项。因为Spring在3.0版本之后引入了SpringEL,有了SpringEL之后复合对象的映射就不成问题了。 但是SpringMVC对于多重entity的映射、List或者Map之类的容器映射是无法直接通过参数绑定完成的。我也可以举个例子,比如在电子商务网站中,有一种需求:账单地址和送货地址不是同一个地址。这种情况下,UserController大概是这样的: public class UserController { @RequestMapping("/register") public ModelAndView register(Address billTo, Address shipTo) { return new ModelAndView("success"); } } 此时,SpringMVC将无法完成映射,因为它不知道email或者某个表达式到底映射到其中的哪一个参数,所以如果你对上面的代码进行调试的话,会发现2个参数同时被映射了!要解决这个问题的方法,就是建立一个大的formbean,把2个Address封装在formbean的内部,在参数中只暴露这个formbean。这就引入了不必要的DTO,是一种反模式。 更绝的是,对于List或者Map之类的容器映射,SpringMVC也无法处理。解决的方法,就是把List放到一个formbean里面去! 所以,那些说所谓SpringMVC在参数绑定上远超Struts2的人,我实在不明白他们的脑子在想什么! 不过SpringMVC3.1提供了针对参数的扩展机制,我们可以提供自己的扩展类来对上述问题进行处理。只是这个扩展类写起来有点麻烦,并且可能和传统的映射方式稍有冲突,有兴趣的可以自行实现。 |
|
返回顶楼 | |