先讲两者一起使用的情况(以下情况都是在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中,前端可以使用该内容。