当前位置: 首页 > article >正文

Spring MVC和servlet

1.Spring MVC是Spring框架的一个扩展

2.Spring MVC工作流程

1、用户发送请求至前端控制器DispatcherServlet。

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、 DispatcherServlet调用HandlerAdapter处理器适配器。

5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、Controller执行完成返回ModelAndView。

7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、DispatcherServlet响应用户

2、servlet的工作流程


1. 浏览器请求

浏览器向服务器请求时,服务器不会直接执行我们的类,而是到web.xml里寻找路径名
①:第一步,浏览器输入访问路径后,携带了请求行,头,体
②:第二步,根据访问路径找到已注册的servlet名称,既图中的demo
③:第三步,根据映射找到对应的servlet名
③:第四步,根据根据servlet名找到我们全限定类名,既我们自己写的类


2. 服务器创建对象

①:服务器找到全限定类名后,通过反射创建对象,同时也创建了servletConfig,里面存放了一些初始化信息(注意服务器只会创建一次servlet对象,所以servletConfig也只有一个)

3. 调用init方法

①:对象创建好之后,首先要执行init方法,但是我们发现我们自定义类下没有init方法,所以程序会到其父类HttpServlet里找
②:我们发现HttpServlet里也没有init方法,所以继续向上找,既向其父类GenericServlet中继续寻找,在GenericServlet中我们发现了init方法,则执行init方法(对接口Servlet中的init方法进行了重写)
注意:
在GenericServlet中执行public void init(ServletConfig config)方法的时候,又调用了自己无惨无方法体的init()方法,其目的是为了方便开发者,如果开发者在初始化的过程中需要实现一些功能,可以重写此方法

4. 调用service方法

接着,服务器会先创建两个对象:ServletRequest请求对象和ServletResponse响应对象,用来封装浏览器的请求数据和封装向浏览器的响应数据
①:接着服务器会默认在我们写的类里寻找service(ServletRequest req, ServletResponse res)方法,但是DemoServlet中不存在,那么会到其父类中寻找
②:到父类HttpServlet中发现有此方法,则直接调用此方法,并将之前创建好的两个对象传入
③:然后将传入的两个参数强转,并调用HttpServlet下的另外个service方法
④:接着执行service(HttpServletRequest req, HttpServletResponse resp)方法,在此方法内部进行了判断请求方式,并执行doGet和doPost,但是doGet和doPost方法已经被我们自己重写了,所以会执行我们重写的方法
看到这里,你或许有疑问:为什么我们不直接重写service方法?
因为如果重写service方法的话,我们需要将强转,以及一系列的安全保护判断重新写一遍,会存在安全隐患

5. 向浏览器响应


3、servlet的生命周期
Servlet_生命周期:首先加载servlet的class,实例化servlet,然后初始化servlet调用init()的方法,接着调用服务的service的方法处理doGet和doPost方法,最后是我的还有容器关闭时候调用destroy 销毁方法。

1.被创建:执行init方法,只执行一次
Servlet什么时候被创建?
–默认情况下,第一次被访问时,Servlet被创建,然后执行init方法;
–可以配置执行Servlet的创建时机;
2.提供服务:执行service方法,执行多次
3.被销毁:当Servlet服务器正常关闭时,执行destroy方法,只执行一次
下图显示了一个典型的 Servlet 生命周期方案。

第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
Servlet 容器在调用 service() 方法之前加载 Servlet。
然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法

来源:一文带你搞懂Spring MVC和servlet(面试必备)_springmvc和servlet区别-CSDN博客


http://www.kler.cn/a/469091.html

相关文章:

  • 使用WebSocket 获取实时数据
  • github开源链游详细搭建文档
  • QPainter,QPen,QBrush详解
  • OSPF - 影响OSPF邻居建立的因素
  • 202-01-06 Unity 使用 Tip1 —— UnityHub 模块卸载重装
  • C#—SynchronizationContext类详解 (同步上下文)
  • 【2025最新计算机毕业设计】基于SSM的医院挂号住院系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】
  • 西安电子科技大学初/复试笔试、面试、机试成绩占比
  • 初学stm32 --- RTC实时时钟
  • Pytest钩子函数,测试框架动态切换测试环境
  • 《Rust权威指南》学习笔记(二)
  • Node.js中使用Joi 和 express-joi-validation进行数据验证和校验
  • Win32汇编学习笔记04.重定位与汇编引擎
  • ubuntu 创建服务、查看服务日志
  • Linux-Ubuntu之RTC实时时钟显示
  • 使用 ThinkPHP 和 Vue.js 开发现代 Web 应用的指南
  • Swift Protocols(协议)、Extensions(扩展)、Error Handling(错误处理)、Generics(泛型)
  • c++第13课
  • VisualRules规则引擎语法介绍
  • Structured-Streaming集成Kafka
  • vue3组件化开发优势劣势分析,及一个案例
  • spring mvc源码学习笔记之二
  • 在 C# 中合并和解析相对路径
  • 探索 INFINI Console:提升 Elasticsearch 管理效率的新利器
  • 鸿蒙NEXT使用request模块实现本地文件上传
  • Karate 介绍与快速示例(API测试自动化、模拟、性能测试与UI自动化工具)