前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring mvc ViewResolver视图解析器实现机制

Spring mvc ViewResolver视图解析器实现机制

作者头像
java404
发布2018-05-18 14:23:53
8490
发布2018-05-18 14:23:53
举报
文章被收录于专栏:java 成神之路java 成神之路

概要

我们在controller里面经常这样return一个ModelAndView。

代码语言:javascript
复制
return new ModelAndView("userList", "users", userList);

DispatcherServlet 靠 ViewResolver 把 userList 解析为 /WEB-INF/jsp/userList.jsp

常用的ViewResolver:InternalResourceViewResolver

ViewResolver配置
代码语言:javascript
复制
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp" />
    <property name="suffix" value=".jsp" />
</bean>
ViewResolver 初始化

继续上一篇Spring mvc DispatchServlet 实现机制 初始化DispatchServlet的时候,执行了初始化ViewResolver操作。

  1. 判断 detectAllViewResolvers 是否为true,如果为true,则加载当前系统中所有实现了ViewResolver接口的bean。
  2. 如果为false,则加载bean名称为“viewResolver”的ViewResolver实现类。
  3. 如果还没有找到ViewResolver,则加载SpvingMVC 配置文件中,默认配置的ViewResolver。
detectAllViewResolvers 设置

detectAllHandlerMappings 默认为true,如果只想加载自己指定的HandlerMapping,请使用下面的方式指定

如果这样指定,则Spring MVC 只会加载这个ViewResolver,而不会加载配置的其它的ViewResolver。

解析视图跳转页面

当处理完成Controller的逻辑后,需要给请求用户一个响应反馈,一般都是返回一个响应的一个页面。

DispatcherServlet执行完Controller的逻辑后会调用render() 方法进行处理视图的跳转工作。

resolveViewName() 方法

查找合适的ViewResolver来获取View。

然后调用AbstractCachingViewResolver.java的resolveViewName() 方法

  1. 首先判断缓存中是否存在View,如果不存在则调用 createView() 方法创建View
  2. 如果有则从缓存中获取View
createView() 方法
loadView() 方法

UrlBasedViewResolver.java

buildView() 方法

在这里我们可以看到,填充View对象中的Url属性时,自动加上配置中ViewResolver的前缀和后缀,拼装成一个完整的Url串。

renderMergedOutputModel() 处理页面跳转
  1. exposeModelAsRequestAttributes() 把ModelAndView中存放的对象,添加到request中
  2. 根据响应的资源获取Servlet中的RequestDispatcher对象
  3. 调用RequestDispatcher的 include 或forward 方法进行响应结果。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.10.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概要
    • ViewResolver配置
      • ViewResolver 初始化
        • detectAllViewResolvers 设置
        • 解析视图跳转页面
          • resolveViewName() 方法
            • createView() 方法
              • loadView() 方法
                • buildView() 方法
                  • renderMergedOutputModel() 处理页面跳转
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档