论坛首页 Java企业应用论坛

Spring 3.0 MVC 开发指南[强烈推荐1个小时掌握精华]

浏览 127161 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-02-14  
spring mvc 为什么只支持一个form对象?难道不会出现一个form里包含多个domain对象的情况,还是本意就是推荐用map或者新建一个VO来做form对象?很怀念Struts2
ongl表达式
0 请登录后投票
   发表时间:2012-02-14  
先下了,有时间再看看啊,在这表示支持下,看样子楼主很用心啊
0 请登录后投票
   发表时间: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将透明地实现数据绑定:
  •    Java原生类型
  •    Map类型
  •    HttpServletRequest/HttpServletResponse
  •    WebRequest(Spring框架提供)
  •    InputStream/OutputStream
  •    POJO的Bean对象(无须继承接口),这种对象作为入参,Spring MVC称之为“命令/表单对象”,支持ONGL
  •    BindingResult/Errors:Spring MVC校验的结果对象
  •    HttpEntity/ResponseEntity:通过HttpMessageConverter对请求或响应进行转换后的对象

  个人觉得Spring的数据绑定这块是非常灵活的,可能是Java现有MVC框架中做得最好了,只要你去尝试一下,相信你也会和我有相同的看法。

  
0 请登录后投票
   发表时间:2012-02-15  
stamen 写道


   Spring的Bean设置,“表单/命令”对象也完全支持ongl表达式,Spring MVC对处理方法的签名异常灵活,它会根据方法入参类型,“智能地”将Request中的数据绑定到入参中。可以是以下类型的入参对象,且可以任意多个入参,Spring MVC将透明地实现数据绑定:
  •    Java原生类型
  •    Map类型
  •    HttpServletRequest/HttpServletResponse
  •    WebRequest(Spring框架提供)
  •    InputStream/OutputStream
  •    POJO的Bean对象(无须继承接口),这种对象作为入参,Spring MVC称之为“命令/表单对象”,支持ONGL
  •    BindingResult/Errors:Spring MVC校验的结果对象
  •    HttpEntity/ResponseEntity:通过HttpMessageConverter对请求或响应进行转换后的对象

  个人觉得Spring的数据绑定这块是非常灵活的,可能是Java现有MVC框架中做得最好了,只要你去尝试一下,相信你也会和我有相同的看法。

  


不知你的“表单/命令”对象也完全支持ongl表达式从哪里得到的,最好可以举一个例子。

你对于这个问题的回答是有误的,因为按照目前SpringMVC对于参数绑定的支持,多个POJO在参数列表中共存是很难实现的,必须借助程序员的自行扩展(这种扩展只有在SpringMVC3.1之后才开放接口,3.1之前你连扩展的门路都没有)。如果你要说服别人,还是要拿出真凭实据,把调试通过的源代码列出来。

SpringMVC的数据绑定是建立在方法参数上的,由于Java语法的限制(方法参数在方法签名中实际上是没有名称的),导致了SpringMVC不得不始终借助其它的语法元素(例如Annotation)的帮忙才能完成参数绑定。所以在这个方面SpringMVC是不可能比Struts2做得更好的。

小伙子话可不要说得太满,大家乐意看到的是真凭实据。
0 请登录后投票
   发表时间:2012-02-15  
risemanjavaeye 写道
spring mvc 为什么只支持一个form对象?难道不会出现一个form里包含多个domain对象的情况,还是本意就是推荐用map或者新建一个VO来做form对象?很怀念Struts2
ongl表达式


SpringMVC3.1之后提供了扩展接口可以实现,不过实现起来不是很容易,祝你好运!
0 请登录后投票
   发表时间:2012-02-15  
收藏,有时间研究下Spring的MVC
0 请登录后投票
   发表时间:2012-02-16  
stamen 写道
risemanjavaeye 写道
spring mvc 为什么只支持一个form对象?难道不会出现一个form里包含多个domain对象的情况,还是本意就是推荐用map或者新建一个VO来做form对象?很怀念Struts2
ongl表达式


   Spring的Bean设置,“表单/命令”对象也完全支持ongl表达式,Spring MVC对处理方法的签名异常灵活,它会根据方法入参类型,“智能地”将Request中的数据绑定到入参中。可以是以下类型的入参对象,且可以任意多个入参,Spring MVC将透明地实现数据绑定:
  •    Java原生类型
  •    Map类型
  •    HttpServletRequest/HttpServletResponse
  •    WebRequest(Spring框架提供)
  •    InputStream/OutputStream
  •    POJO的Bean对象(无须继承接口),这种对象作为入参,Spring MVC称之为“命令/表单对象”,支持ONGL
  •    BindingResult/Errors:Spring MVC校验的结果对象
  •    HttpEntity/ResponseEntity:通过HttpMessageConverter对请求或响应进行转换后的对象

  个人觉得Spring的数据绑定这块是非常灵活的,可能是Java现有MVC框架中做得最好了,只要你去尝试一下,相信你也会和我有相同的看法。

  

Spring 完全不支持ongl或者类似的方案,他的一个form就对应一个表单对象,不能自主的创建对象树并给相关对象属性设置值。我说的这些就是Struts2和ww的那种方式,假如,事实上,一对一的两个对象,可能其中的一个对象就是另一个对象的属性,只是在抽象的时候抽象成了一个对象,但srping却不能很简单的处理这个真属性假对象的表单,让人很无语,在Struts2里我只要设置name="x.y.z.name",他就能帮我把这个input的值放到z对象的name属性。更不用说那种跨两个domain对象的了属性自动赋值了,我除了把对象树扁平化成一个VO没有其它好方法,请楼主指教
0 请登录后投票
   发表时间:2012-02-16  
感谢作者分享,学习了
0 请登录后投票
   发表时间:2012-02-16  
刚好这段时间比较空闲,下来看看。
0 请登录后投票
   发表时间: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提供了针对参数的扩展机制,我们可以提供自己的扩展类来对上述问题进行处理。只是这个扩展类写起来有点麻烦,并且可能和传统的映射方式稍有冲突,有兴趣的可以自行实现。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics