要将一个图书信息转化为JSON视图的功能,只要传递图书信息给它,它就能将信息转化为视图:
@RequestMapping("/book/showBookJsonInfo")
public ModelAndView showBookJson(Book book){
var mv = new ModelAndView();
mv.addObject("book",book);
mv.setView(new MappingJackson2JsonView());
return mv;
}
现在的需求是,每当新增一个图书信息时,需要将其数据(图书编号会回填)以json视图的形式展示给请求者。在数据保存到数据库后,由数据库返回图书编号,再将图书信息传递给showBookJson方法,就可以展示json视图给请求者了:
@RequestMapping("/book/saveBook")
//Model为重定向数据模型,Spring Mvc会自动初始化它
public String saveBook(Book book,Model model){
service.save(book);// 插入图书后,会回填图书编号
//绑定重定向数据模型
model.addAttribute("book",book);//只能传递简单属性,pojo需要flash属性
return "redirect:./showBookJsonInfo";
}
这里的Model代表一个数据模型,可以给它附加上对应的数据模型。Spring MVC有一个约定,当返回的字符串中带有redirect的时候,它就会认为需要的是一个重定向,而事实上,不仅可以通过返回字符串来实现重定向,也可以通过返回视图来实现重定向
@RequestMapping("/saveBook2")
public ModelAndView saveBook2(ModelAndView mv,Book book){
mv.addObject("book",book);//只能传递简单属性,pojo需要flash属性
mv.setView("redirect:./book/showBookJsonInfo");
return mv;
}
经测试,这样并不能将参数顺利传递给重定向的地址,因为在url重定向的过程中,http的重定向参数是以字符串传递的,如果需要传递图书pojo来完成任务,这个时候Springmvc提供了一个方法-----flash属性,需要提供的数据模型就是一个RedirectAttribute:
@RequestMapping("/saveBook3")
public String saveBook3(RedirectAttributes ra,Book book){
ra.addFlashAttribute("book",book);//绑定重定向数据模型
mv.setView("redirect:./book/showBookJsonInfo");
return "redirect:./showBookJsonInfo";
}
这样就能够传递pojo给下一个地址了,那么它是如何做到的呢?使用addFlashAttribute方法后,springmvc会将数据保存到session中(session在同一个会话有效),重定向后就会将其清除, 这样就能够传递给下一个地址了。