博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring mvc ViewResolver视图解析器实现机制
阅读量:6813 次
发布时间:2019-06-26

本文共 1330 字,大约阅读时间需要 4 分钟。

hot3.png

概要

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

return new ModelAndView("userList", "users", userList);

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

常用的ViewResolver:InternalResourceViewResolver

ViewResolver配置

ViewResolver 初始化

继续上一篇 初始化DispatchServlet的时候,执行了初始化ViewResolver操作。

78099e69774e4d9f5b0569959d1be15fdb2.jpg

cc3ca21fc2b210795eae9bff12759fe1e59.jpg

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

detectAllViewResolvers 设置

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

39eb5920de859250f41545b235a7abd3134.jpg

df3f34b150ee1d5dbfb7f217d50e13b70e7.jpg

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

解析视图跳转页面

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

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

f8f870bba419b7d0c3ca05d9060b8dbad30.jpg

resolveViewName() 方法

53d64c3dfd6bd306a08460ca20ed28fac4b.jpg

查找合适的ViewResolver来获取View。

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

861ad7207fef384f3968da2e3a32be022dd.jpg

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

createView() 方法

d7400a0d10e9640373ab012f591c67ef0b3.jpg

loadView() 方法

UrlBasedViewResolver.java

9a79f26779b93c72950b513e74c7e5c1a24.jpg

buildView() 方法

e3fa9642e15e269105fe9a8fd46d3c2a561.jpg

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

renderMergedOutputModel() 处理页面跳转

f57f1653f497cb533725753b50bf0d4a00a.jpg

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

转载于:https://my.oschina.net/u/2307589/blog/1834469

你可能感兴趣的文章
Swing(Java)--维基百科
查看>>
中间人攻击——ARP欺骗的原理、实战及防御
查看>>
webpack入门
查看>>
shell实现除法,保留小数点后N位
查看>>
查看和改动MySQL数据库表存储引擎
查看>>
服务器路由配置--Route
查看>>
Linux下更换jdk和配置环境变量
查看>>
【shell】shell编程(二)-运算符
查看>>
DNS_PROBE_FINISHED_NXDOMAIN
查看>>
BZOJ5104 : Fib数列
查看>>
MySQL Replication 主从复制全方位解决方案
查看>>
Nginx+upstream针对后端服务器容错的运维笔记
查看>>
使用SQL_TRACE进行数据库诊断
查看>>
风控8-收码平台
查看>>
SQL Server 中心订阅模型(多发布单订阅)
查看>>
Vue父组件接收不到子组件$emit事件的原因分析
查看>>
工作总结的字体和格式要求
查看>>
CentOS 6.9永久设置静态路由表以及路由表常用设置
查看>>
解决Docker时区与主机时区不一致的问题
查看>>
思考与知识
查看>>