当前位置:首页 > 开发 > 互联网 > 正文

spring mvc 参数封装

发表于: 2013-01-07   作者:cnge06   来源:转载   浏览:
摘要: 请看这个问题。也许我们会说:通过写vo来解决。确实,使用vo可以很好地解决spring mvc的参数封装的问题,而且,开发者写vo是一个好的习惯(我是一个懒人,如非必要很少写。。。)。 然而,我遇到另一个类似的问题。   请求方法如下: @RequestMapping(value="/admin/website/delete/{id}",method=Requ

请看这个问题。也许我们会说:通过写vo来解决。确实,使用vo可以很好地解决spring mvc的参数封装的问题,而且,开发者写vo是一个好的习惯(我是一个懒人,如非必要很少写。。。)。

然而,我遇到另一个类似的问题。

 

请求方法如下:

@RequestMapping(value="/admin/website/delete/{id}",method=RequestMethod.POST)
public @ResponseBody void delete(@ModelAttribute("user")User user,@PathVariable("id")int id)

(方法里的内容没有贴出来)

 

它所在的Controller定义如下:

 

@Controller
@SessionAttributes("user")
public class WebSiteController

 

@ModelAttribute("user")User user与@SessionAttributes("user")对应,绑定了session中的"user"。

 

接下来,来看看User:

 

public class User {
	private int id;
       //其它属性、get/set方法及注解都省略了
}
 

于是,问题来了:session中user对象的id属性值被"/admin/website/delete/{id}"传进来的值覆盖了。

 

解决办法:

1.当然可以修改"/admin/website/delete/{id}",比如改为:"/admin/website/delete/{websiteId}",这样就不会覆盖user.id了,功能上完全没有问题。可是,这种需要确保各参数的属性名称不同的做法显然很不合理。如果这个user换作session里的其它对象,且属性较多,在执行类似的请求时,极有可能被某个同名参数将其属性覆盖。更糟糕的是,这种改变可能不会影响当前请求中程式的正确性,于是问题被隐藏了,但你不可能担保你在其它请求中使用这个session中的对象时不会有问题。

2.不使用@ModelAttribute("user")的方式来获得session中的user对象,使用HttpSession来取。当然,不好的地方就是使用了servlet的api。但相对于方法1,并且没有找到更好方法之前,更倾向于使用这一办法解决。

 

当前使用的spring版本是:3.1.0.RELEASE

仅作小记,希望对您有用,如果您有更好解决办法,很高兴您能将它分享出来。

spring mvc 参数封装

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号