Spring 笔记 - @SessionAttribution和@ModelAttribute的作用

【最好去看一下原文

    @SessionAttribution和@ModelAttribute 这两个注解的作用使用联系的。这2个注解除了功能上的区别外,要注意的是:

1】 @SessionAttribution  【从request中拿,放到session中去】

        是类级别的注解。在上标注@SessionAttribution("userA"),作用是:将request中的userA属性保存到session中。

       此外,还可以以数组的形式保存多个属性:

       1)    @SessionAttribution({"a","b"..});按照name取出,并保存到session中。

    2)    @SessionAttribution(type={A.class,B.class,..},value={"a","b"..});按照类型取出,保存到session中,key是对应的value数组上的name值。

2】 @ModelAttribute【从session中拿,放到ModelMap中去】

       是方法、参数级别的注解。在方法、参数上标注@ModelAttribute("user"),作用是:从    session/方法返回值/或某处(我也不是特别了解)    取出user,并注入到ModelMap中。

    @ModelAttribute类似于@RequestParam,只是一个request中拿,一个从session中拿。

      以上所述仅是@ModelAttribute的小部分功能,@ModelAttribute的功能很强大,详解请看spring学习之@ModelAttribute运用详解

      2.1】@ModelAttribute注释一个方法,这个方法的返回值非空

@Controller
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@RequestMapping("/user")
public class UserController {

	@Resource
	private IUserService userService;

	User user;

	@ModelAttribute("key")
	public String in(@RequestParam String id) {// 1.先执行
		Long longId = Long.parseLong(id);
		user = userService.getById(longId);
		return "value";
	}

	@RequestMapping("/list.do")
	public String list(String id, HttpServletRequest request) {// 2. 后执行
		request.setAttribute("user", user);
		return "success";
	}
}


请求路径:localhost:8080/user/list.do?id=1

先执行methodA,将methodA的返回值以<Key,Value>的形式,存入到ModelMap中,再执行list方法


         2.2】@ModelAttribute注释一个方法,这个方法的返回值为void

        将上一页代码中的methodA的返回类型改为void,去掉return语句,去掉@ModelAttribute的参数。


         2.3】@ModelAttribute注释一个参数

@Controller
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@RequestMapping("/user")
public class UserController {

	@Resource
	private IUserService userService;

	User user;

	
	public void in(@ModelAttribute String id) { // 这个方法不会预先执行了!!!
		Long longId = Long.parseLong(id);
		user = userService.getById(longId);
	}

	@RequestMapping("/list.do")
	public String list(String id, HttpServletRequest request) { // 1.直接执行此方法
		request.setAttribute("user", user);
		return "success";
	}
}


    小结:@ModelAttribute注释方法,就是存属性到ModelMap中;@ModelAttribute注释参数,就是从ModelMap和request中拿属性,注入到该参数中

       如果@ModelAttribute注释一个方法:先看这个注解有没有value参数,如果有注解参数,@ModelAttribute会将该参数作为key,将方法返回值作为value存入ModelMap【若方法返回类型为空,则value为NULL】。如果没有注解参数,就不会存储属性到ModelMap。仅仅预先执行该方法。

       如果@ModelAttribute注释一个参数,则从ModelMap和request中注入属性到这个参数中。注意:此时,不会预先执行该参数所在的方法(methodA)。

     

参考文章:http://www.360doc.com/content/13/0531/01/12565168_289361857.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值