位置: 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前端框架搭建)

  • 三星怎么设置语音唤醒bixby(三星怎么设置语音助手名字)

    三星怎么设置语音唤醒bixby(三星怎么设置语音助手名字)

  • 小米手机通话设置在哪里(小米手机通话设置在哪里打开)

    小米手机通话设置在哪里(小米手机通话设置在哪里打开)

  • excel如何打开两个独立窗口(excel如何打开两天前没有保存的文件)

    excel如何打开两个独立窗口(excel如何打开两天前没有保存的文件)

  • 小米6重启才能充电(小米重启才能充电解决方法)

    小米6重启才能充电(小米重启才能充电解决方法)

  • 电脑跑分40万什么水平

    电脑跑分40万什么水平

  • 怎么删除抖音视频作品(怎么删除抖音视频里自己拍的作品)

    怎么删除抖音视频作品(怎么删除抖音视频里自己拍的作品)

  • 主板4加2相供电什么意思(主板4+2+1供电)

    主板4加2相供电什么意思(主板4+2+1供电)

  • 美团点评是干什么的(什么叫美团点评)

    美团点评是干什么的(什么叫美团点评)

  • 24寸电脑显示屏是多少厘米(24寸电脑显示屏是多少厘米 长宽)

    24寸电脑显示屏是多少厘米(24寸电脑显示屏是多少厘米 长宽)

  • 苹果平板计算器在哪里(苹果平板计算器不见了)

    苹果平板计算器在哪里(苹果平板计算器不见了)

  • oppoa11x怎么设置彩色字体(oppoa11x怎么设置小窗口)

    oppoa11x怎么设置彩色字体(oppoa11x怎么设置小窗口)

  • wps怎么发文件形式(wps怎么发文件形状图片)

    wps怎么发文件形式(wps怎么发文件形状图片)

  • 手机画面抖动怎么解决(手机画面抖动怎么回事)

    手机画面抖动怎么解决(手机画面抖动怎么回事)

  • 华为手机的尺子在哪里(华为手机的尺子功能)

    华为手机的尺子在哪里(华为手机的尺子功能)

  • 手机闲鱼会员名能匿名吗(闲鱼的会员名别人能看见吗)

    手机闲鱼会员名能匿名吗(闲鱼的会员名别人能看见吗)

  • 苹果id充值余额能退吗(苹果id充值余额怎么退款)

    苹果id充值余额能退吗(苹果id充值余额怎么退款)

  • 苹果手机影音先锋怎么验证应用(苹果手机影音先锋下载文件位置)

    苹果手机影音先锋怎么验证应用(苹果手机影音先锋下载文件位置)

  • 苹果mac怎么禁止某个应用联网?苹果mac禁止某个软件联网教程(苹果mac怎么禁止百度搜索)

    苹果mac怎么禁止某个应用联网?苹果mac禁止某个软件联网教程(苹果mac怎么禁止百度搜索)

  • Susan角点检测python实现 (边缘检测、角点检测、重心计算、非极大值抑制)(角点检测算法)

    Susan角点检测python实现 (边缘检测、角点检测、重心计算、非极大值抑制)(角点检测算法)

  • 帝国CMS报错Table ‘empirecms.phome_ecms_’ doesn’t exist怎么解决(帝国cms8.0)

    帝国CMS报错Table ‘empirecms.phome_ecms_’ doesn’t exist怎么解决(帝国cms8.0)

  • python迭代器的取值方法(python迭代器有什么用)

    python迭代器的取值方法(python迭代器有什么用)

  • 收到增值税发票是不是就给钱了
  • 员工交通费可以税前扣除吗
  • 未认证待抵扣进项税重分类
  • 进项票丢了,假如税不抵了,怎么做账
  • 2020小规模纳税人增值税税率
  • 购入股票作为短期投资是什么凭证
  • 新办商贸企业是国企吗
  • 房东收到房租转让费会计处理
  • 集团财务公司资金管理
  • 公司亏损多久可以申请解散
  • 车船税不开发票怎么做账?
  • 离职补偿金公司不付怎么办
  • 商业企业取得农产品税收
  • 福利费抵扣了进项税有2年了怎么办
  • 房屋销售佣金能退回吗
  • 废品残料回收入库
  • 在建工程完工,并当日签订出租协议的会计分录
  • 银行利息现金流量表什么科目
  • 员工工伤单位垫付
  • t3不能增加二级科目
  • 离退休员工再任职薪酬的财税处理?
  • 包装物押金为什么含税
  • 销售折让和折扣的风险点
  • 个人劳务费几个点
  • 进项票少了怎么办
  • windows8.1下Apache+Php+MySQL配置步骤
  • 开机自动进入安装模式
  • 天竺葵的养殖方法和繁殖方法
  • codeigniter 教程
  • php imagestring
  • 保险业营改增
  • 最小的手机有多大
  • php做网页
  • php抽奖程序源码
  • 营改增后预交增值税
  • 变电所的相关费用是什么
  • laravel怎么用
  • 工会经费可以提出来使用吗
  • vscodehtml快捷键
  • 基于深度学习的轴承寿命预测实践,开发CNN、融合LSTM/GRU/ATTENTION
  • 反向选择命令
  • 什么情况下应该辞职
  • 自收自支是由主管部门拨款吗
  • 所得税汇算清缴需要调增的项目
  • mysql需要转义的特殊字符
  • 固定资产原值和净值的区别
  • 员工加班打车费进项可以抵扣吗
  • 以发行股票作为对价取得企业的股权
  • 电子商业汇票是指
  • 收到银行退回的手续费怎么做会计分录
  • 收到客户不要的定金怎么做账?
  • 设备投资要开票吗
  • 转账支票转账需要带什么
  • 新租赁准则入账
  • 客户从公司借钱怎么拒绝
  • 总分包模式和总承包模式
  • 发票开错了只能冲红票吗?
  • 工程施工中购买的设备一直未入账需要评估吗
  • 餐饮行业月末结转成本怎么算
  • 怎么判断政府
  • 企业的财务战略
  • sql server执行语句
  • mysql5.7分区表
  • windowsserver2008r2standard激活
  • ubuntu x
  • u盘装win8系统教程图解
  • win8 开机
  • 电脑win7一开机就弹出各种广告窗口怎么办
  • win1020h2正式版下载
  • linux系统命令包含在哪个目录中
  • js原型继承和构造继承
  • unity3d cant add script
  • nodejs sleep方法
  • jquery中什么方法用于模拟光标悬停事件
  • 登录""增值税发票选择确认平台""时提示""打开设备
  • 车辆购置税查询平台打印
  • 开个小型外卖店要多少钱
  • 国网福建电力微信公众
  • 税务发票定额
  • 陕西地税局电话号码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设