视图解析原理流程
- 目标方法处理的过程中,所有的数据都会被保存在
ModelAndViewContainer
里面,包括数据和视图地址。 - 方法的参数如果是一个自定义类型对象,它会封装请求参数,也会重新保存
ModelAndViewContainer
中。 - 任何目标方法执行完成以后都会返回
ModelAndView
,里面包含了数据和视图地址 - 执行
processDispatchResult
方法处理派发结果,响应页面
(1)调用render(mv,request,response)
进行页面渲染逻辑
1)根据目标方法的String
返回值得到View
对象,这个View
对象定义了页面的渲染逻辑
①遍历所有的视图解析器,判断哪个视图解析器可以根据当前返回值得到VIew
对象
②调用view.render(mv.getModelInternal(), request, response)
方法,视图对象调用自定义的render
方法进行页面渲染
2)如果目标方法返回值以forward
开始,会调用new InternalResourceView(forwardUrl)
创建一个视图,底层逻辑是调用的request.getRequestDispatcher(path).forward(request, response)
完成页面跳转
3)如果目标方法返回值以redirect
开始,会调用new RedirectView()
创建一个视图,底层逻辑是调用的是response.sendRedirect(encodedURL)
完成页面重定向
4)如果目标方法返回值是普通字符串,会调用new ThymeleafView()
创建一个视图。Thymeleaf
拿到模板引擎就开始解析,首先获取到给页面渲染的数据保存到mergeModel
,利用模板引擎调用viewTemplateEngine.process()
方法写出页面的内容