前言
鉴于现在开发多是返回json数据为主,以下的知识点应该只做了解即可。
问:SpringMVC除过在方法上传入原生的request和session外还能怎么样把数据带给页面?
SpringMVC 输出模型数据分类
ModelAndView:
处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
Map、Model、ModelMap: 入参为 org.springframework.ui.Model、
org.springframework.ui.ModelMap 或 java.uti.Map 时,
处理方法返回时,Map 中的数据会自动添加到模型中。
@SessionAttributes:
将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性
@ModelAttribute:
方法入参标注该注解后, 入参的对象就会放到数据模型中
ModelAndView
控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
添加模型数据方法:
添加视图方法:
eg:
@RequestMapping("/handle04")
public ModelAndView handle04(@ModelAttribute("book") Book book
){
ModelAndView mv = new ModelAndView();
//设置返回的视图名称
mv.setViewName("success");
//添加要返回的信息
mv.addObject("msg","modelandview");
return mv;
}
ModelMap、Model、Map
*
* 1)、在方法处传入Map、或者Model或者ModelMap。
* 给这些参数里面保存的所有数据都会放在请求域中。可以在页面获取
* 关系:
* Map,Model,ModelMap:最终都是BindingAwareModelMap在工作;
* 相当于给BindingAwareModelMap中保存的东西都会被放在请求域中;
*
* Map(interface(jdk)) Model(interface(spring))
* || //
* || //
* \/ //
* ModelMap(class) //
* \\ //
* \\ //
* ExtendedModelMap
* ||
* \/
* BindingAwareModelMap
eg:
@RequestMapping("/handle01")
public String handle01(Map map){
map.put("msg","map测试");
//class org.springframework.validation.support.BindingAwareModelMap
System.out.println(map.getClass());
map.put("book",new Book());
return "success";
}
@RequestMapping("/handle02")
public String handle02(Model model){
model.addAttribute("msg","model测试");
//class org.springframework.validation.support.BindingAwareModelMap
System.err.println(model.getClass());
return "success";
}
@RequestMapping("/handle03")
public String handle03(ModelMap modelMap){
modelMap.put("msg","modelmap测试");
//class org.springframework.validation.support.BindingAwareModelMap
System.err.println(modelMap.getClass());
return "success";
}
SessionAttributes 注解
若希望在多个请求之间共用某个模型属性数据,
则可以在控制器类上标注一个 @SessionAttributes,
Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。
@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,
还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
如果满足类型或者value值,则会在session域中也存放一份设置的键值对
eg:
value:指对应属性名的值
type:对应属性的类型,只要是这种类型的值,都会被放入session中
@SessionAttributes(value = {"book"},types = {String.class})
ps:这个注解不建议和下面说到的ModelAttribute使用,因为如果你标注了某个value的值存在于session中,且如果某个参数标注了ModelAttribute注解,如果在隐含模型中取不到这个参数的数据,那么就会在session中取,这时候也取不到的话会报错。
eg:
@RequestMapping("/handle04")
//标注@ModelAttribute告诉springmvc先在隐含模型中找haha这个对象,
//找不到---->去session中找
如果你还标注了@SessionAttributes(value = {"book","haha"})
就相当于告诉Springmvc在session中一定有haha这个对象,但如果session中压根没有的话
会报错
public ModelAndView handle04(@ModelAttribute("haha") Book book
){
ModelAndView mv = new ModelAndView();
mv.setViewName("success");
System.err.println(book);
mv.addObject("msg","modelandview");
return mv;
}
所以使用这个注解,要么就一定要有某个属性值,要么就不要标,不标的话SpringMVC还可以自动new一个对象
SessionAttribute注解
这个注解和上一个注解很像,就多了一个s,但此注解只作用在参数上
注释将方法参数绑定到会话属性。 主要动机是通过可选/必选检查和转换到目标方法参数类型,
提供对现有的永久会话属性(例如,用户身份验证对象)的方便访问。
对于需要添加或删除会话属性的用例,考虑将org.springframework.web.context.request.WebRequest或javax.servlet.http.HttpSession注入到控制器方法中。
对于在会话中临时存储模型属性作为控制器工作流的一部分,请考虑使用SessionAttributes代替
总结就是:这个是从session中取对象的,建议用在用户验证方面,可以设置是否为必须,但不提供添加删除功能
eg:@SessionAttribute(value="book") Book book
从session中获取名为book的Book对象,没有就抛异常。可以设置required = false
ModelAttribute注解
作用:
在方法定义上使用 @ModelAttribute 注解:
Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法。
在方法的入参前使用 @ModelAttribute 注解:
可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参
将方法入参对象添加到模型中
eg:
同上:
这个注解不用深入了解,知道就可以。作用就是从隐含模型中提前取出数据进行绑定,
就不使用mvc的自动new一个对象,以至于什么属性都没有,或者说使某个方法在标注,
可以使某个方法提前运行