ModelAndView在工作中使用比较频繁,一直没有整理过,概念还有些模糊,今天将其整理一下作为笔记以后看起来方便。
MVC工作流程:
当客户端发出请求,web服务器接收到请求在web.xml中找到DispartcherServlet(前端控制处理器:它负责协同和组织不同组件完成请求处理并返回响应工作)的映射路径并把请求转发到DispartcherServlet处理。DispartcherServlet将请求转发给MVC的控制器,DispartcherServlet查询处理映射(handler mapping)处理映射根据URL信息匹配由哪个控制器来处理请求。controller进行业务处理后返回一个ModelAndView给DispartcherServlet,然后DispartcherServlet借助视图解析器完成modelandview逻辑视图名到真实视图对象view的解析工作。DispartcherServlet根据modelandview中的视图模型对view对象进行视图渲染,最后客户端得到的响应信息可能是普通的HTML文件,或者json串,也有可能是一个图片或者PDF格式文件。
ModelAanView详解:(转载原文:https://blog.csdn.net/qq_36306340/article/details/78542918)
当控制器处理完请求时,通常会将包含视图名称或者视图对象以及一些模型属性的ModelAanView对象返回到DispartcherServlet。所以需要在控制器中构造ModelAndView对象,ModelAndView类提供了一些重载的构造器和一些方便的方法,我们可以根据自己的喜好来构造ModelAndView对象,这些构造器和方法都是相类似的,以类似的方式支持视图名称和视图对象。
当只有一个模型属性要返回时,可以在构造器中指定该属性来构造ModelAndView对象,通过ModelAndView构造方法可以指定返回的页面名称,也可以通过setViewName()方法跳转到指定的页面,使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字,调用addObject()方法将只设置到一个名为ModelMap的类属性,ModelMap是LinkHashMap的子类。
ModelAanView对象被放置在request对象中,jsp页面可以直接通过el表达式直接访问获取参数。
可以在页面中利用${keyName}直接访问存在model中的对象。第一个参数是页面名称
@RequestMapping("SMDetail.htm")
public ModelAndView commonClaimDetail(int id) throws Exception{
// List<Map<String,Object>> list=serDeptManageService.findClaimDetail(id);
List<Map<String,Object>> list=new ArrayList<>();
try {
list=serDeptManageService.findClaimDetail(id);
}catch (Exception e){
logger.error("加载备注信息错误:"+e.getCause());
}
ModelMap modelMap = new ModelMap();
modelMap.addAttribute("list",list);
modelMap.addAttribute("id",id);
ModelAndView modelAndView = new ModelAndView("model",modelMap);
modelAndView.setViewName("claim/commonClaimDetail");
return modelAndView;
}
ModelAndView重定向:
spring web 框架利用ModelAndView也能实现请求妆发(forward)、重定向(redirect)
@RequestMapping("page.htm")
public ModelAndView page(){return new ModelAndView("claim/serDeptManage");}
//第三个参数(UserModel user)默认为绑定对象
@RequestMapping(value = "/user/save", method = RequestMethod.POST)
public ModelAndView saveUser(HttpServletRequest request, HttpServletResponse response,UserModel user) throws Exception {
ModelAndView mv = new ModelAndView("/user/save/result");//默认为forward模式
// ModelAndView mv = new ModelAndView("redirect:/user/save/result");//redirect模式
mv.addObject("message","保存用户成功!");
return mv;
}