IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> SpringMVC源码分析(使用多个视图解析器)附详细SpringMVC工作流程图 -> 正文阅读

[JavaScript知识库]SpringMVC源码分析(使用多个视图解析器)附详细SpringMVC工作流程图

DispatherServlet类分析

首先,我们看DispatherServlet类中的初始化试图解析器的方法
在这里插入图片描述
我们逐步来看代码:

this.viewResolvers = null;
//首先上方的代码表示可以加载多个视图解析器

		//detectAllViewResolvers表示加载容器中所有的视图器
		if (this.detectAllViewResolvers) {
			// Find all ViewResolvers in the ApplicationContext, including ancestor contexts.
			在容器的上下文中寻找所有的视图解析器
			Map<String, ViewResolver> matchingBeans =
					BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false);
			if (!matchingBeans.isEmpty()) {
				this.viewResolvers = new ArrayList<>(matchingBeans.values());
				// We keep ViewResolvers in sorted order.
				AnnotationAwareOrderComparator.sort(this.viewResolvers);
			}
		}

但是通常detectAllViewResolvers的默认值会设置成为TRUE,默认会加载所有视图解析器
在这里插入图片描述

Map<String, ViewResolver> matchingBeans这个Map集合,通常寻找的所有的视图解析器之后全部存储到Map集合中,名字和本身的对象存储,之后调用AnnotationAwareOrderComparator.sort(this.viewResolvers)方法,对所有的视图解析器进行排序,按照本身的order属性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

之后发送请求之后,中央控制器收到请求之后,会调用service方法,紧接着调用processRequest方法,之后进入到DispatherServlet类中的doService方法中,之后调用如下图:
在这里插入图片描述

resolveViewName方法:

我们细看resolveViewName方法:

public View resolveViewName(String viewName, Locale locale) throws Exception {
		RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
		Assert.state(attrs instanceof ServletRequestAttributes, "No current ServletRequestAttributes");
		
		List<MediaType> requestedMediaTypes = getMediaTypes(((ServletRequestAttributes) attrs).getRequest());
		if (requestedMediaTypes != null) {
		
			//筛选出所有的候选视图
			List<View> candidateViews = getCandidateViews(viewName, locale, requestedMediaTypes);
			//选出最好的视图
			View bestView = getBestView(candidateViews, requestedMediaTypes, attrs);


			if (bestView != null) {
				return bestView;
			}
		}

getCandidateViews方法

进入getCandidateViews方法:

//遍历所有的视图解析器
for (ViewResolver viewResolver : this.viewResolvers) {
				//从每一个视图解析其中寻找视图
				View view = viewResolver.resolveViewName(viewName, locale);
				//如果视图不为NULL,就加入集合
				if (view != null) {
					candidateViews.add(view);
				}

在这里插入图片描述

AbstractUrlBasedView 类

AbstractUrlBasedView 类中:

	protected View loadView(String viewName, Locale locale) throws Exception {
		AbstractUrlBasedView view = buildView(viewName);
		//先构建VIEW  最后再检查
		View result = applyLifecycleMethods(viewName, view);
		//检查视图是否存在,不存在返回NULL
		return (view.checkResource(locale) ? result : null);
	}


//默认返回true,证明可能返回的view是损坏的用不了的,有风险的
public boolean checkResource(Locale locale) throws Exception {
		return true;
	}

FreeMarkerView类

FreeMarkerView类中:

public boolean checkResource(Locale locale) throws Exception {
		String url = getUrl();
		Assert.state(url != null, "'url' not set");

		try {
			// Check that we can get the template, even if we might subsequently get it again.
			getTemplate(url, locale);
			return true;
		}
		catch (FileNotFoundException ex) {
			// Allow for ViewResolver chaining...
			return false;
		}
		catch (ParseException ex) {
			throw new ApplicationContextException("Failed to parse [" + url + "]", ex);
		}
		catch (IOException ex) {
			throw new ApplicationContextException("Failed to load [" + url + "]", ex);
		}
	}

checkResource方法有非常好的检查view,Thymeleaf中并没有检查的方法

getBestView方法

进入getBestView方法:
在这里插入图片描述
当每一个视图解析器的mediaType与候选视图的ContentType相同时就返回,当有多个视图都相同时返回第一个,按视图解析器的order优先级来排序
在这里插入图片描述

详细SpringMVC工作流程图

在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:03:52  更:2022-02-19 01:04:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:43:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码