@SessionAttributes与@ModelAttribute

先讲两者一起使用的情况(以下情况都是在sessionAttribute注解在类上时):

一.

@Controller
@RequestMapping(value = "/migucactivites")
@SessionAttributes("tmodel")
public class MigucActivityController {	    
        @RequestMapping(value = "/activity_view2", method = RequestMethod.GET)
	    public String f3(@ModelAttribute("tmodel") TModel email){
	        return "migucactivites/migucactivites_config";
	    }
}

1. 这种情况下,@ModelAttribute一定会去session中找对应的tmodel对象。如果找不到,就会报错,请求在后台直接抛出异常。

org.springframework.web.HttpSessionRequiredException: Expected session attribute 'tmodel'
	at org.springframework.web.method.annotation.ModelFactory.initModel(ModelFactory.java:103)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:601)

2. 如果session中有tmodel对象,传入连接中没有传入email字段,则email直接得到的是session中值,并且会把值再set回model中,并放到session中。

3. 如果session中有tmodel对象,并且传入参数也有email值。例如url:http://127.0.0.1:8081/migucactivites/activity_view2.htm?email=2d,这种情况下,代码email的值为2d,并且也会把tmodel=2d放到model中,放到session中。

二.@ModelAttribute和@RequestMapping一起使用

	   @RequestMapping(value = "/migucactivites_config", method = RequestMethod.GET)
	   @ModelAttribute("tmodel")
	    public TModel f2(TModel email){
	       TModel t = new TModel();t.setEmail("dfdafdasf");
	       return t;
	    }

返回的内容就直接放入到session和model中。而对应的页面就是请求的地址一致:请求地址为/migucactivites_config.html,返会的页面也是:/migucactivites_config.vm

三. @ModelAttribute单独在方法上使用

	@ModelAttribute("tmodel")
	public TModel t(){
	    TModel t = new TModel();t.setEmail("dfdafdasf");
	    return t;
	}

这种情况下,所有的RequestMapping都首先需要经过这个t方法处理,该方法设置t值到model中。

四. @ModelAttribute单独在方法上使用,同时结合@ModelAttribute使用在形参上

	@ModelAttribute("tmodel")
	public TModel t(){
	    TModel t = new TModel();t.setEmail("dfdafdasf1");
	    return t;
	}
	    @RequestMapping(value = "/activity_view2", method = RequestMethod.GET)
	    public String f3(@ModelAttribute("tmodel") TModel email){
	        return "migucactivites/migucactivites_config";
	    }

这种情况下,根据debug,也是在requestmapping处理完毕以后,才真正写入到session中的。

但是,这里spring Mvc做了处理,在形参处,可以获取到在t方法中设置的tmodel值。虽然此时session中其实没有这个内容。

如果代码写成

	@ModelAttribute("tmodel")
	public TModel t(){
	    TModel t = new TModel();t.setEmail("dfdafdasf1");
	    return t;
	}	    
@RequestMapping(value = "/activity_view2", method = RequestMethod.GET)
	    public String f3(@ModelAttribute("tmodel") TModel email,Model m){
	        return "migucactivites/migucactivites_config";m
	    }

则Model m中已经有了tmodel的key。

 

如果取消sessionAttribute注解。

使用到上文中四的方式,依然可以成功获取到t方法中设置的tmodel值。

	@ModelAttribute("tmodel")
	public TModel t(){
	    TModel t = new TModel();t.setEmail("dfdafdasf1");
	    return t;
	}
	   @RequestMapping(value = "/migucactivites_config", method = RequestMethod.GET)
	   @ModelAttribute("tmodel")
	    public TModel f2(TModel email){
	       TModel t = new TModel();t.setEmail("dfdafdasf");
	       return t;
	    }

两个方法上都设置了ModelAttribute,则f2设置的覆盖t设置的。f2方法TModel在外部没有传入的时候,这里值是一个new出来的对象,但是里面的email值为null。

2. 

	@ModelAttribute("tmodel")
	public TModel t(){
	    TModel t = new TModel();t.setEmail("dfdafdasf1");
	    return t;
	}	   
 @RequestMapping(value = "/activity_view2", method = RequestMethod.GET)
	    public String f3(@ModelAttribute("tmodel") TModel email,Model m){
	        return "migucactivites/migucactivites_config";
	    }

如果传入的url为:http://127.0.0.1:8081/migucactivites/activity_view2.htm?email=2ere,则email的TMode会最终被覆盖为2ere。

并写入到Model中。进入到方法f3这里m和email中的值都是2ere。

3.

注释掉上文中的t方法。不再经过t方法。

则url不输入email参数,f3获取的Tmodel email中的email字段为null。输入email参数,则email字段有值,同时会写入到Model中。

4. 

	    @RequestMapping(value = "/activity_view2", method = RequestMethod.GET)
	    public String f3(@ModelAttribute("tmodel") TModel email,Model m){
	      email.setEmail("emal");
	        return "migucactivites/migucactivites_config";
	    }

则此时email设置的内容可以传递到model中,前端可以使用该内容。

 

你可能感兴趣的:(@SessionAttributes与@ModelAttribute)