@ModelAttribute跟@SessionAttributes的应用

 

http://www.cnblogs.com/edwardlauxh/archive/2011/03/11/1981639.html

原本打算将@ModelAttribute跟@SessionAttributes一起写的发现有些例子不可以重复使用,所以决定再开一篇文章写

顾名思义SessionAttributes就是保存session的,SessionAttributes使用方法很简单,@SessionAttributes 允许指定多个属性。你可以通过字符串数组的方式指定多个属性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes 还可以通过属性类型指定要 session 化的 ModelMap 属性,如 @SessionAttributes(types = User.class),当然也可以指定多个类,如 @SessionAttributes(types = {User.class,Dept.class}),还可以联合使用属性名和属性类型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})。

以下例子使用:@SessionAttribute必须配合@ModelAttribute一起使用,

第一种方式,采用@SessionAttributes(“变量名”)

代码如下

1: @Controller 2: @SessionAttributes("user") 3: publicclass testSessionAttribute { 4: 5: private Logger logger = LoggerFactory.getLogger(testSessionAttribute.class); 6: 7: @RequestMapping("test") 8: public String test(ModelMap map){ 9: UserBean userBean = new UserBean(); 10: userBean.setId(1); 11: userBean.setUsername("EdwardLau"); 12: userBean.setPassword("Hello World !"); 13: map.put("user", userBean); 14: return"sessionattribute"; 15: } 16: 17: 18: @RequestMapping("test1") 19: public String test(@ModelAttribute("user") UserBean userBean){ 20: logger.debug("test1 方法调用----------"); 21: logger.debug(userBean.getId()+":"+userBean.getPassword()+":"+userBean.getUsername()); 22: logger.debug("test1 方法调用结束----------"); 23: return"users"; 24: } 25: 26: }

在浏览器运行http://localhost:8080/SpringMVC/system/test得到如下图所示:

点击调用test1方法后,看后台如下:

通过注解@ModelAttribute可以获得之前保存的值。

第二种方式,采用@SessionAttributes(types={指定class})

采用这种方式的话系统会默认保存指定class的名字(头字母小写),如UserBean.class,modelmap会仅仅会保存名字为userBean或者userbean的对应的class,其余则不会保存,代码如下:

当在在页面上输入http://localhost:8080/SpringMVC/system/test时候,会把对应的内容保存到modelmap中,但后点击如下图,调用test1方法的时候,

得到如下图结果:

事实证明:调用sessionAttriubte只适用types参数的时候只是,默认保存以类名为名字的值,其中类名第一个字母为小写,而他只是能保存当前对象的值,而对象中存在了那个外一个对象的时候则不能保存

第三种:采用@SessionAttributes(value={指定名称},types={指定class})

使用这种方法则对指定的类,进行特定名称保存,一对一的形式进行保存,代码如下:

1: @Controller 2: @SessionAttributes(value={"test","dept"}, types={UserBean.class,DeptBean.class}) 3: publicclass testSessionAttribute { 4: 5: private Logger logger = LoggerFactory.getLogger(testSessionAttribute.class); 6: 7: @RequestMapping("test") 8: public String test(ModelMap map){ 9: UserBean userBean = new UserBean(); 10: userBean.setId(1); 11: userBean.setUsername("EdwardLau"); 12: userBean.setPassword("Hello World !"); 13: map.put("aaa", "aaa"); 14: map.put("test", userBean); 15: UserBean userBean1 = new UserBean(); 16: userBean.setId(2); 17: userBean.setUsername("EdwardLau1"); 18: userBean.setPassword("Hello World1 !"); 19: map.put("user", userBean1); 20: DeptBean deptBean = new DeptBean(); 21: deptBean.setDeptId(120); 22: deptBean.setDeptname("综合管理"); 23: deptBean.setUserBean(userBean1); 24: map.put("dept", deptBean); 25: return"sessionattribute"; 26: } 27: 28: 29: @RequestMapping("test1") 30: public String test(@ModelAttribute("test") UserBean userBean, @ModelAttribute("aaa") String aaa 31: ,@ModelAttribute("user") UserBean bean,@ModelAttribute("dept") DeptBean deptBean){ 32: logger.debug("test1 方法调用----------"); 33: logger.debug(userBean.getId()+":"+userBean.getPassword()+":"+userBean.getUsername()); 34: logger.debug("aaaa:"+aaa+"bean:"+bean.getId()+":"+bean.getUsername()+":"+bean.getPassword()); 35: logger.debug("deptBean:"+deptBean.getDeptId()+":"+deptBean.getUserBean().getUsername()+":"+deptBean.getDeptname()); 36: logger.debug("test1 方法调用结束----------"); 37: return"testsession"; 38: } 39: 40: }

同样运行第二种方式的地址,得到的结果如下图:

采用这种方式只是把要保存的类定义到固定的名字而已,用法与第二种一样

posted on 2011-07-28 11:26  dhj  阅读(194)  评论(0编辑  收藏  举报

导航