java dispatcher详解_dispatcherservlet初始化过程详解

之前给大家介绍了什么是dispatcherservlet,以及dispatcherservlet配置等方面的内容,那么下面要接着给大家介绍的就是dispatcherservlet初始化过程,一起来了解一下。

Web容器启动时将调用HttpServletBean的init方法public abstract class HttpServletBean extends HttpServlet implements EnvironmentAware

{

@Override

public final void init() throws ServletException

{

//省略部分代码

//1、如下代码的作用是将Servlet初始化参数设置到该组件上

//如contextAttribute、contextClass、namespace、contextConfigLocation;

try

{

PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);

BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);

ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());

bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));

initBeanWrapper(bw);

bw.setPropertyValues(pvs, true);

}

catch (BeansException ex)

{

//…………省略其他代码

}

//2、提供给子类初始化的扩展点,该方法由FrameworkServlet覆盖

initServletBean();

if (logger.isDebugEnabled())

{

logger.debug("Servlet '" + getServletName() + "' configured successfully");

}

}

//…………省略其他代码

}

把Servlet初始化参数(init-param)设置到这个组件上(如contextAttribute、contextClass、namespace、contextConfigLocation),通过BeanWrapper简化设值过程,便于之后使用;

提供给子类初始化扩展点,initServletBean(),这个方法由FrameworkServlet覆盖。

FrameworkServlet通过initServletBean()进行Web上下文初始化public abstract class FrameworkServlet extends HttpServletBean

{

@Override

protected final void initServletBean() throws ServletException

{

//省略部分代码

try

{

//1、初始化Web上下文

this.webApplicationContext = initWebApplicationContext();

//2、提供给子类初始化的扩展点

initFrameworkServlet();

}

//省略部分代码

}

}

这个方法主要作用: 初始化web上下文;

提供给子类初始化扩展点;

protected WebApplicationContext initWebApplicationContext()

{

//ROOT上下文(ContextLoaderListener加载的)

WebApplicationContext rootContext =

WebApplicationContextUtils.getWebApplicationContext(getServletContext());

WebApplicationContext wac = null;

if (this.webApplicationContext != null)

{

// 1、在创建该Servlet注入的上下文

wac = this.webApplicationContext;

if (wac instanceof ConfigurableWebApplicationContext)

{

ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;

if (!cwac.isActive())

{

if (cwac.getParent() == null)

{

cwac.setParent(rootContext);

}

configureAndRefreshWebApplicationContext(cwac);

}

}

}

if (wac == null)

{

//2、查找已经绑定的上下文

wac = findWebApplicationContext();

}

if (wac == null)

{

//3、如果没有找到相应的上下文,并指定父亲为ContextLoaderListener

wac = createWebApplicationContext(rootContext);

}

if (!this.refreshEventReceived)

{

//4、刷新上下文(执行一些初始化)

onRefresh(wac);

}

if (this.publishContext)

{

// Publish the context as a servlet context attribute.

String attrName = getServletContextAttributeName();

getServletContext()

.setAttribute(attrName, wac);

//省略部分代码

}

return wac;

}

从initWebApplicationContext()方法能够看出,通常假如ContextLoaderListener加载了上下文将作为根上下文(DispatcherServlet的父容器),最后调用了onRefresh()方法执行容器的一些初始化,这个方法由子类实现,来进行扩展。

DispatcherServlet实现了onRefresh()方法提供一些前端控制器相关的配置public class DispatcherServlet extends FrameworkServlet

{

//实现子类的onRefresh()方法,该方法委托为initStrategies()方法。

@Override

protected void onRefresh(ApplicationContext context)

{

initStrategies(context);

}

//初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)

protected viod initStrategies(ApplicationContext context)

{

initMultipartResolver(context); //初始化上传文件解析器

initLocaleResolver(context); //初始化本地解析器

initThemeResolver(context); //初始化主题解析器

initHandlerMapping(context);

//初始化处理器映射器,将请求映射到处理器

initHandlerAdapters(context); //初始化处理器适配器

initHandlerExceptionResolver(context);

//初始化处理器异常解析器,如果执行过程中遇到异常将交给HandlerExceptionResolver来解析

initRequestToViewNameTranslator(context);

//初始化请求到具体视图名称解析器

initViewResolvers(context);

//初始化视图解析器,通过ViewResolver解析逻辑视图名到具体视图实现

initFlshMapManager(context); //初始化flash映射管理

}

}

initStrategies方法将在WebApplicationContext初始化后自动执行,自动扫描上下文的Bean,依据名称或者是类型匹配的机制查找自定义组件。

假如没有找到,就会装配一套Spring的默认组件.在org.springframework.web.servlet路径下有一个DispatcherServlet.properties配置文件,这个文件指定了DispatcherServlet所使用的默认组件。

DispatcherServlet启动的时候,会进行需要的Web层Bean的配置,例如HandlerMapping、HandlerAdapter等,假如,没有配置,还会给我们提供默认的配置。

整个DispatcherServlet初始化的过程具体主要做了初始化Spring Web

MVC使用的Web上下文,并且可能指定父容器为(ContextLoaderListener加载了根上下文)以及初始化DispatcherServlet使用的策略,如HandlerMapping、HandlerAdapter等这两件事情。

现在有很多人都想要成为java架构师,假如你想了解这方面的知识,那么请继续关注奇Q工具网来进行了解吧。

推荐阅读:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python消息队列模块_day43-python消息队列二-queue模块

Python提供了Queue模块来专门实现消息队列Queue对象Queue对象实现一个fifo队列(其他的还有lifo、priority队列,这里不再介绍)。queue只有maxsize一个构造参数,用来指定队列容量,指定为0的时候代表容量无限。主要有以下成员函数:Qu…

linux php 如何上传webshell,linux+apache+php的一次拿webshell的心得

首先俺先声明俺是个菜鸟,俺虽然是菜鸟但俺不会一直是菜鸟的(一旁兄弟喊到:别俺,俺,俺的,说普通话!)。俺,不对,我一直遵照着实践是检验真理的唯一标准这句话学习技术,这不…

paddle 56 将图像分类模型嵌入到目标检测中并实现端到端的部署(用图像分类模型进行目标检测切片分类)

目标检测在功能上一直是涵盖了图像分类的,其包含目标切片检测,目标切片分类。由于某些原因,需要将目标检测的功能退化为检测,忽略其切片分类,使用外部的分类模型。然而这样操作会使得其与原始的部署代码不兼容,为此博主实现将图像分类模型嵌入到目标检测中,并实现端到端…

python3图像识别地类_机器学习零基础?手把手教你用TensorFlow搭建图像识别系统(三)| 干货...

原标题:机器学习零基础?手把手教你用TensorFlow搭建图像识别系统(三)| 干货雷锋网按:本文是介绍用TensorFlow构建图像识别系统的第三部分。 在前两部分中,我们构建了一个softmax分类器来标记来自CIFAR-10数据集的图像,实现了约25…

织梦php重新安装教程,织梦CMS系统后台重装的操作教程

原标题:织梦CMS系统后台重装的操作教程网站在线运行,不可能一点问题都不存在,或者当初的网站设计、架构、功能已经不能满足现在用户的需求,所以我们会对网站做出相应的改动。网站除了前端的改版,还会有后台系统重装、服…

mpu9250姿态融合算法_基于投票方式的机器人装配姿态估计

作者:仲夏夜之星来源:公众号 3D视觉工坊链接:基于投票方式的机器人装配姿态估计论文题目:《Voting-Based Pose Estimation for Robotic Assembly Using a 3D Sensor》这篇文章被发表在2012年的IEEE International Conference on R…

java安卓浏览器下载文件,JAVA实现文件下载,浏览器端得到数据没反应解决方案

JAVA实现文件下载,浏览器端得到数据没反应代码如下public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//得到要下载的文件名称String filenamerequest.getParameter("filename");//文件存放的路径…

python如何读取kepsever_python linecache读取过程

最近使用Python编写日志处理脚本时,对Python的几种读取文件的方式进行了实验。其中,linecache的行为引起了我的注意。Python按行读取文件的经典方式有以下几种:with open(blabla.log, r) as f:for line in f.readlines():## do somethingwith…

skywalking原理_微服务链路追踪原理

作者:平也来源:关爱程序员社区背景介绍在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时&#xf…

php 上次登陆时间,php使用cookie显示用户上次访问网站日期的方法

本文实例讲述了php使用cookie显示用户上次访问网站日期的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;<?php if(!empty($_COOKIE[lastvisit])){//先判断&#xff0c;是否存在cookieecho "您上次访问时间是&#xff1a;".$_COOKIE[lastvisit];setCo…

文本分析软件_读书笔记:伍多库卡茨质性文本分析:方法、实践与软件使用指南...

读书笔记&#xff1a;伍多库卡茨《质性文本分析&#xff1a;方法、实践与软件使用指南》一、这篇文章、这本书或这篇论文的中心思想、核心观点是什么&#xff1f;核心观点&#xff1a;质性数据如何系统化分析&#xff1f;三大主要方法&#xff1a;主题分析、评估分析和类型建构…

php 分析url函数,PHP 解析URL函数 parse_url()函数

在PHP中 parse_url()函数的使用&#xff0c;parse_url—解析 URL&#xff0c;返回其组成部分。mixed parse_url ( string $url [, int $component -1 ] )本函数解析一个 URL 并返回一个关联数组&#xff0c;包含在 URL 中出现的各种组成部分。本函数不是用来验证给定 URL的合法…

python的知识点运用_程序猿在Python编程中不得不使用的十二种基础知识

Python编程中常用的12种基础知识&#xff0c;其中肯定有你不会的&#xff01;人生苦短&#xff0c;我用Python1、正则表达式替换目标: 将字符串line中的 overview.gif 替换成其他字符串。人生苦短&#xff0c;我用Python2、遍历目录方法在某些时候&#xff0c;我们需要遍历某个…

matlab两轮自平衡小车,两轮自平衡小车(全部设计资料+设计分析)

自己做的自平衡小车&#xff0c;基本达到预期效果。制作资料在压缩包里面&#xff0c;供参考。该两轮自平衡小车硬件设计概述&#xff1a;控制器&#xff1a;ATmega16&#xff1b;8MHz&#xff1b;加速度传感器&#xff1a;MMA2260&#xff1b;陀螺仪&#xff1a;EWTS82&#x…

异步fifo_【推荐】数字芯片异步FIFO设计经典论文

之前有一篇文章我已经推荐过了数字芯片跨时钟域设计的经典论文 &#xff08;【推荐】数字芯片跨时钟域设计经典论文 &#xff09;&#xff0c;希望看过的读者都有一定的收获。不过有点遗憾的是那片论文中虽然提到了异步FIFO&#xff0c;却没有讲具体的原理和设计细节。本篇文章…

matlab启动不了jvm,MATLAB ::在-nojvm启动选项下不再支持此功能

我正在终端中运行Matlab代码&#xff0c;因为稍后我需要在php中调用此代码。但是我得到这些错误&#xff1a;MATLAB ::在-nojvm启动选项下不再支持此功能[email protected]:~/Desktop/v1.2$ matlab -nojvm < matlab.m错误&#xff1a;L2 norm on unsampled vertices: 0.0961…

linux搭建vsftp服务器_Linux配置VSFTP服务器的方法

下面小编就为大家带来一篇Linux配置VSFTP服务器的方法。小编觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来看看吧一、Linux FTP服务器分类&#xff1a;<1>wu-ftp<2>proftpprofession ftp<3>vsftpvery security f…

php active控件,php – 使用TbActiveForm选择列表中的动态选项

我在控制器中有以下代码,$modelnew Guessgame(search);$model->unsetAttributes(); // clear any default valuesif(isset($_GET[Guessgame]))$model->attributes$_GET[Guessgame];$this->render(admin,array(model>$model,));在视图文件中,<?php $form$this-&…

golang 函数传多个参数_关于Golang中方法参数的传递

结构体声明为了说明函数以及方法调用的过程&#xff0c;这里先定义一个struct&#xff0c;在下面的描述中会使用到它。type Person struct {Name stringAge uint16}普通函数中的参数传递在Golang中&#xff0c;普通函数的行参如果是值类型&#xff0c;那么调用的实参也必须是实…

workbook对象需要关闭_XSSFWorkbook对象 进行zip打包时 用write资源流自动关闭处理办法...

xssfworkbook对象的write方法内会将传入的资源流自动关闭 导致下载excel失败错误代码outputstream out response.getoutputstream();zipoutputstream zos new zipoutputstream(out);xssfworkbook workbook new xssfworkbook();// 将文件写入zip内&#xff0c;即将文件进行打…