位置: IT常识 - 正文

SpringMVC执行流程(springmvc执行流程简单)

编辑:rootadmin
SpringMVC执行流程

推荐整理分享SpringMVC执行流程(springmvc执行流程简单),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:springmvc执行流程及原理,springmvc执行流程及代码实现,springmvc执行流程+拦截器,springmvc执行流程图,springmvc执行流程简单,springmvc执行流程及原理,springmvc执行流程及原理,springmvc执行流程及原理,内容如对您有帮助,希望把文章链接给更多的朋友!

SpringMVC常用组件

DispatcherServlet:前端控制器,不需要工程师开发,由框架提供 作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求HandlerMapping:处理器映射器,不需要工程师开发,由框架提供

作用:根据请求的url、method等信息查找Handler,即控制器方法Handler:处理器,需要工程师开发 作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供 作用:通过HandlerAdapter对处理器(控制器方法)进行执行ViewResolver:视图解析器,不需要工程师开发,由框架提供 作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectViewView:视图 作用:将模型数据通过页面展示给用户

DispatcherServlet初始化过程 

 DispatcherServlet 本质上是一个 Servlet,所以天然的遵循 Servlet 的生命周期。所以宏观上是 Servlet生命周期来进行调度。

SpringMVC执行流程(springmvc执行流程简单)

 初始化WebApplicationContext

所在类:org.springframework.web.servlet.FrameworkServle

protected WebApplicationContext initWebApplicationContext() {WebApplicationContext rootContext =WebApplicationContextUtils.getWebApplicationContext(getServletContext());WebApplicationContext wac = null;if (this.webApplicationContext != null) {// A context instance was injected at construction time -> use itwac = this.webApplicationContext;if (wac instanceof ConfigurableWebApplicationContext) {ConfigurableWebApplicationContext cwac =(ConfigurableWebApplicationContext) wac;if (!cwac.isActive()) {// The context has not yet been refreshed -> provide servicessuch as// setting the parent context, setting the application contextid, etcif (cwac.getParent() == null) {// The context instance was injected without an explicitparent -> set// the root application context (if any; may be null) as theparentcwac.setParent(rootContext);}configureAndRefreshWebApplicationContext(cwac);}}}if (wac == null) {// No context instance was injected at construction time -> see if one// has been registered in the servlet context. If one exists, it isassumed// that the parent context (if any) has already been set and that the// user has performed any initialization such as setting the context idwac = findWebApplicationContext();}if (wac == null) {// No context instance is defined for this servlet -> create a local one// 创建WebApplicationContextwac = createWebApplicationContext(rootContext);}if (!this.refreshEventReceived) {// Either the context is not a ConfigurableApplicationContext withrefresh// support or the context injected at construction time had already been// refreshed -> trigger initial onRefresh manually here.synchronized (this.onRefreshMonitor) {// 刷新WebApplicationContextonRefresh(wac);}}if (this.publishContext) {// Publish the context as a servlet context attribute.// 将IOC容器在应用域共享String attrName = getServletContextAttributeName();getServletContext().setAttribute(attrName, wac);}return wac;}

 ②创建WebApplicationContext

所在类:org.springframework.web.servlet.FrameworkServlet 

protected WebApplicationContext createWebApplicationContext(@NullableApplicationContext parent) {Class<?> contextClass = getContextClass();if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)){throw new ApplicationContextException("Fatal initialization error in servlet with name '" +getServletName() +"': custom WebApplicationContext class [" + contextClass.getName() +"] is not of type ConfigurableWebApplicationContext");}// 通过反射创建 IOC 容器对象ConfigurableWebApplicationContext wac =(ConfigurableWebApplicationContext)BeanUtils.instantiateClass(contextClass);wac.setEnvironment(getEnvironment());// 设置父容器wac.setParent(parent);String configLocation = getContextConfigLocation();if (configLocation != null) {wac.setConfigLocation(configLocation);}configureAndRefreshWebApplicationContext(wac);return wac;}

③DispatcherServlet初始化策略FrameworkServlet创建WebApplicationContext后,刷新容器,调用onRefresh(wac),此方法在DispatcherServlet中进行了重写,调用了initStrategies(context)方法,初始化策略,即初始化 DispatcherServlet的各个组件 所在类:org.springframework.web.servlet.DispatcherServlet

protected void initStrategies(ApplicationContext context) {initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);initFlashMapManager(context);}SpringMVC的执行流程 

用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获。 2) DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:a) 不存在 i. 再判断是否配置了mvc:default-servlet-handler ii. 如果没配置,则控制台报映射查找不到,客户端展示404错误

iii. 如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML),找不到客户端也会展示404错误 

b) 存在则执行下面的流程 3) 根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。 4) DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。 5) 如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(...)方法【正向】6) 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作: a) HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息b) 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等 c) 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等 d) 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中 7) Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。8) 此时将开始执行拦截器的postHandle(...)方法【逆向】。 9) 根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行 HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model 和View,来渲染视图。 10) 渲染视图完毕执行拦截器的afterCompletion(...)方法【逆向】。 11) 将渲染结果返回给客户端。 

本文链接地址:https://www.jiuchutong.com/zhishi/295962.html 转载请保留说明!

上一篇:Vue项目保持用户登录状态(localStorage + vuex 刷新页面后状态依然保持)(vuex存储用户信息)

下一篇:Vue(前端框架)(vue前端框架搭建)

  • 小米手环怎样与手机配对(小米手环怎样与手机连接)

    小米手环怎样与手机配对(小米手环怎样与手机连接)

  • 怎么解除抖音绑定的手机号(怎么解除抖音绑的银行卡绑定)

    怎么解除抖音绑定的手机号(怎么解除抖音绑的银行卡绑定)

  • 步道乐跑能不能换手机(步道乐跑能不能骑单车)

    步道乐跑能不能换手机(步道乐跑能不能骑单车)

  • 朋友圈第一行怎么空格(朋友圈第一行怎么空两格)

    朋友圈第一行怎么空格(朋友圈第一行怎么空两格)

  • 华为手机怎么下载(华为手机怎么下载谷歌浏览器)

    华为手机怎么下载(华为手机怎么下载谷歌浏览器)

  • 龙芯3a4000相当于i几(龙芯3a4000相当i57200)

    龙芯3a4000相当于i几(龙芯3a4000相当i57200)

  • 抖音直播有回音怎么解决(为什么抖音直播有回音)

    抖音直播有回音怎么解决(为什么抖音直播有回音)

  • 为什么微信附近人里面没有自己(为什么微信附近人打招呼别人看不到)

    为什么微信附近人里面没有自己(为什么微信附近人打招呼别人看不到)

  • 锁定屏幕通知中心横幅都是什么意思(锁定屏幕通知中心怎么设置)

    锁定屏幕通知中心横幅都是什么意思(锁定屏幕通知中心怎么设置)

  • boss直聘被锁定怎么解(boss直聘被锁定了怎么解封)

    boss直聘被锁定怎么解(boss直聘被锁定了怎么解封)

  • 总线主要由什么三部分组成(总线主要由什么决定的)

    总线主要由什么三部分组成(总线主要由什么决定的)

  • 好记星点读机怎么下载课本(好记星点读机怎么使用)

    好记星点读机怎么下载课本(好记星点读机怎么使用)

  • 手机qq如何设置群头像(手机qq如何设置自动回复消息)

    手机qq如何设置群头像(手机qq如何设置自动回复消息)

  • 手机怎么连接音箱(手机怎么连接音响放视频教程)

    手机怎么连接音箱(手机怎么连接音响放视频教程)

  • 红米note8怎么唤醒小爱同学(红米note8怎么开启)

    红米note8怎么唤醒小爱同学(红米note8怎么开启)

  • 米9pro反向充电伤电池吗(小米9pro反向充电异常怎么解决)

    米9pro反向充电伤电池吗(小米9pro反向充电异常怎么解决)

  • word自动生成目录怎么弄(word自动生成目录怎么编辑)

    word自动生成目录怎么弄(word自动生成目录怎么编辑)

  • 淘宝双十一活动一般什么时候开始(2023年淘宝双十一活动)

    淘宝双十一活动一般什么时候开始(2023年淘宝双十一活动)

  • win10杀毒软件叫什么(win10杀毒软件哪个好)

    win10杀毒软件叫什么(win10杀毒软件哪个好)

  • 7p屏幕版本怎么区分(7p屏幕版本怎么看)

    7p屏幕版本怎么区分(7p屏幕版本怎么看)

  • p30pro广角怎么开启(p30pro广角摄像头是哪个)

    p30pro广角怎么开启(p30pro广角摄像头是哪个)

  • 天猫超市88会员折扣卡怎么领取(天猫超市88会员不能代付吗)

    天猫超市88会员折扣卡怎么领取(天猫超市88会员不能代付吗)

  • r17指纹锁不灵敏(r17指纹锁不灵敏怎么解决)

    r17指纹锁不灵敏(r17指纹锁不灵敏怎么解决)

  • 王者荣耀中苏烈怎么出装?(王者荣耀中苏烈的最强出装)

    王者荣耀中苏烈怎么出装?(王者荣耀中苏烈的最强出装)

  • phpt文件内容解析(php 文件处理)

    phpt文件内容解析(php 文件处理)

  • 耕地占用税减半政策
  • 文化建设税减免到什么时候
  • 员工可以签订两份劳动合同吗
  • 分公司可以参股其他公司吗
  • 营改增之后对企业的影响
  • 增值税包括哪些税种
  • 应交税金应交增值税已交税金怎么结转
  • 纸质承兑怎么收付
  • 如何理解合并报表
  • 固定资产盘盈怎么算
  • 递延收益可以是负数吗
  • 定额发票使用年限规定
  • 为什么增值税普通发票不能抵扣
  • 来料加工贸易是什么工作
  • 非公益性赠送该怎么进行会计处理?
  • 买入返售金融资产什么意思
  • 合同取得成本与销售费用
  • 小规模季报资产总额填错了有影响吗
  • 防伪税控技术维护费怎么申报
  • 应付账款是贵公司欠还是欠贵公司
  • windows11结束任务快捷键
  • 承兑汇票可以入个人账户吗
  • 事业单位个人借款未还违反什么规定
  • php编写登陆界面
  • 企业当期产生的外币报表折算差额
  • 公司有长期挂账的说法吗
  • pc direct
  • 文件错误会追究拟稿人吗
  • 为高新技术企业授牌
  • shine.exe - shine是什么进程 有什么用
  • php时间计算
  • 酒店装修期间的费用如何核算
  • wisdm数据集
  • 承兑找公司贴现合法吗
  • 长期待摊费用的摊销方法
  • yolov5改进点
  • c罗my eyes never lie
  • 面试学弟学妹问题
  • yii2.0框架
  • 中小企业内部分析
  • 商业汇票的行为有哪些
  • 手机充值如何开公司发票
  • 帝国cms整合Elasticsearch
  • phpcms 用的是什么模板引擎
  • 运输公司开具的增值税专用发票谁抵扣
  • 研发费用凭证是什么样
  • 招聘招一个人爱我图片
  • 企业事业结余科目有哪些
  • 工程结算与工程施工的差额在哪填列
  • 专用发票不抵扣联可以当普票用吗?
  • 发工资时多打给员工的钱
  • 研究费用和开发费用加计扣除的究竟是哪部分
  • 出口转内销进项税额怎么进附表二
  • 收到的专票必须当月认证吗
  • 企业所得税税负率多少合适
  • 旅游饮食服务企业财务会计制度
  • mysql常用查询
  • sql提取指定字符串
  • win2000服务器
  • xp电脑如何在网页打开
  • 硬盘安装fedora35
  • windows怎么将任务栏放大
  • oracle linux6.9
  • centos安装位置选择
  • macza
  • 在linux系统中,用来存在系统所需
  • linux从一个命令获取数据到另一个命令
  • perl 文件
  • 场景转换的技巧
  • 批处理计算的特点
  • 3行程序搞定SVM分类-用JAVA程序调用LibSVM API 最简单的示例
  • javascript基础入门教程
  • jquery设置input的value
  • jquery获取值的几种方法
  • 电子税务局下载app苹果版
  • 国家税务局总局广东省电子税务局官网
  • 贵州税务举报
  • 广东地税局领导班子
  • 企业所得税优惠事项管理目录2023
  • 律师属于什么工作单位
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设