@SessionAttributes与ModelAttribute

 

     @ModelAttribute

  •  1.@ModelAttribute注释在方法上
  •       1.1 @ModelAttribute加再void方法上
@ModelAttribute
	public void setCommonData(@RequestParam String param,Model model){
		model.addAttribute("message", param);
	}
	@RequestMapping(value="/hello")
	public String hello(){
		
		return "attributes";
	}

 在执行/hello所在Controller中的方法之前会先执行setCommonData方法,并且会将请求参数/hello?param=hello解析到message中。这个用法比较适合用于设置公共数据。

     1.2@ModelAttribute加在返回具体对象的方法上

@ModelAttribute
	public User fetchUser(){
		
		return new User();
	}

 这时,虽然model的属性名没有直接指定,但是默认根据返回的对象类型隐式给出。如上,返回为User对象,则model的属性名为user,对应属性对象为new User();

   1.3 上面两种情况的组合使用方法

@ModelAttribute("message")
	public String setCommonData(@RequestParam String param,Model model){
		//model.addAttribute("message", param);
		return param;
	}
	@RequestMapping(value="/hello")
	public String hello(){
		
		return "attributes";
	}

    1.4 @RequestMapping与@ModelAttribute一起加在方法上

    

        @RequestMapping(value="/attributes")
	@ModelAttribute("message")
	public String attributes(){
		
		return "helloattribute";				
	}

   这时,返回值就不是一个View名称了 而是model的属性值。视图名称将会根据/attributes生成

  •  2.@ModelAttribute注释在属性值上
  •    2.1 @ModelAttribute注释在一个方法的参数上
@ModelAttribute("user")
	public User setCommonData(@RequestParam String param,Model model){
		return new User("Rose","123",23);
	}
        @RequestMapping(value="/onParam")
	public String onParam(@ModelAttribute("user") User user){
		user.setUsername("Tom");
		return "attributes";
	}

 user可以从setCommonData中获取 也可以通过url里的参数获取(此时需要user具有无参构造器)

此时,如果在Controller类上有@SessionAttributes("user")

则user的scope为session否则其scope为request。

默认情况下,ModelMap中的属性的scope是request级别的。也即,一个request请求结束,ModelMap中的属性将会被销毁。如果希望将ModelMap中的属性在多个请求中共享,我们需要使用@SessonAttributes注解来完成。

@SessionAttributes

使用方法:

@Controller
@RequestMapping(value="/attributes")
@SessionAttributes("user")//将user对象透明地加入到Session中
public class Attributes {

 其实,

@SessionAttributes允许指定多个属性。如@SessionAttributes({"attr1","attr2"})

@SessionAttributes允许通过属性类型指定要Session化的ModelMap属性。如@SessionAttributes(types=User.class)也可指定多个@SessionAttributes(types={User.class,Company.class})

也可以联合属性名和属性类型来指定@SessionAttributes(types={User.class,Company.class},value={"attr1","attr2"})

只要我们不调用SessionStatus的setComplete方法,这些对象会一直保存在Session中。

       @RequestMapping(value="/complete")
	public String complete(SessionStatus sessionStatus){
		sessionStatus.setComplete();//清除@SessionAttributes在Session中存储的对象信息
		return "complete";
	}

 

 

 

 

 

 

你可能感兴趣的:(springMVC)