Loading

SpringMVC视图解析原理

上文讲解了SpringMVC对于请求方法的返回值是如何做出响应处理的,大概来讲就是使用ReturnValueHandler返回值处理器产生相应的返回值(json数据,字符串...),这个过程会用到消息转换器将返回值对象实例转换为相应类型的数据。在进行了响应处理之后,SpringMVC就会进行视图解析。那么,SpringMVC是如何进行视图解析的呢?

对于视图处理方式,有这么几种:转发重定向自定义视图

基本流程

  1. 在目标方法处理的过程中,所有数据都会被存放在ModelAndViewContainer中,包括数据和视图地址。如果方法的参数是自定义类型对象(值是从请求参数中确定的),也会被放在ModelAndViewContainer

  2. 任何目标方法执行完成后,SpringMVC都会返回一个ModelAndViewContainer,包含数据和视图地址

  3. 最终执行processDispatchResult()方法,处理派发结果,决定页面该如何响应

底层的关键是执行render(mv, request, response);进行页面渲染

view = resolveViewName(viewName, mv.getModelInternal(), locale, request);根据视图名得到View对象(定义了页面的渲染逻辑)

解析出View对象的过程是使用了ViewResolver视图解析器。可以看到,循环遍历所有的视图解析器,直到根据视图名解析出View对象

最后调用View对象自定义的render()方法进行页面渲染工作

视图解析器

SpringMVC定义好了多个ViewResolver视图解析器

其中的ThymeleafViewResolver是Thymeleaf模板引擎提供的

如果我们使用Thymeleaf模板引擎,那么请求方法

  • 返回值以forward开始,模板引擎会new InternalResourceView(forwardUrl),这个View对象的render方法会调用request.getRequestDispatcher(path).forward(request, response);进行转发
  • 返回值以redirect开始,模板引擎会new RedirectView(),这个View对象的render方法就是进行重定向
  • 返回值是普通字符串,模板引擎会new ThymeleafView(),调用相应的render方法
posted @ 2021-02-12 21:21  Kinopio  阅读(333)  评论(0编辑  收藏  举报