[学习笔记]基于注解的spring3.0.x MVC学习笔记(七)

本次介绍的是@ModelAttribute注解,这个注解可以跟@SessionAttributes配合在一起用,或者单独使用,首先先介绍@ModelAttribute注解,他跟mvc中的modelMap很相似,可以把它当作一个modelmap的简易版,使用@ModelAttribute方法很简单只是@ModelAttribute("保存的名字")就可以了,他只支持以下几种方式: (如果有还有其他方式请留言,谢谢)

@ModelAttribute

第一种:在返回值中使用:

代码如下:

   1:  @RequestMapping("get")
   2:      public @ModelAttribute("user") UserBean getUser(){
   3:          UserBean bean = new UserBean();
   4:          bean.setId(2);
   5:          bean.setUsername("EdwardLau1");
   6:          bean.setPassword("edward1");
   7:          
   8:           
   9:          logger.debug("userbean-------------------------"+bean.getId()+":"+bean.getUsername());
  10:          //map.put("user", bean);
  11:          return bean;
  12:      }

平常我们都是使用ModelMap或者ModelAndView进行保存值传到前台,当如果你需要保存值比较少的时候可以采用这种方式进行保存值并且保存到前台显示。

JSP代码如下:

   1:  <%@ page language="java" contentType="text/html; charset=GB18030"
   2:      pageEncoding="GB18030"%>
   3:  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
   4:  <html>
   5:  <head>
   6:  <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
   7:  <title>调用get方法</title>
   8:  </head>
   9:  <body>
  10:  ${user}
  11:  <br/>
  12:  <a href="get1">调用get1</a>
  13:  <a href="get2">调用get2</a>
  14:  </body>
  15:  </html>

如图所示:

C6A78229-510C-4403-A720-E0A50C60FF2B

在userbean中我重写了toString()方法所以会显示上述内容。

注意:

ModelAttribute的有效范围,相当于HttpServletRequest中的request.setAttribute一样,如果不配合@SessionAttributes注解的话则不能全局读取的,如首先运行上述代码然后运行如下代码:

   1:  @RequestMapping("get1")
   2:      public  UserBean getUser1(@ModelAttribute("user") UserBean bean,ModelMap map){
   3:           
   4:          logger.debug("userbean1-------------------------"+bean.getId()+":"+bean.getUsername());
   5:          //map.put("user", bean);
   6:          return bean;
   7:      }

点击上图调用get1链接看到如下图结果

B308C7C3-D0E1-4966-A0C6-146828387C4A

事实证明ModelAttribute只能保存当前值,传到另外一个地方后没有对获取的值进行再次保存,直接再调用获取之前的值会获取不到,变成null.

调用ModelAttribute注解的话可以放在方法体上面,或者传参的值里面(定义类型需要跟ModelAttribute的保存的值类型一致,因为ModelAttribute会自动转成该参数的)

posted @ 2011-02-28 17:31  EdwardLau  阅读(3104)  评论(1编辑  收藏  举报