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

JavaWeb篇_09——Tomcat运行过程以及Servlet继承结构

Tomcat运行过程

  1. 用户访问localhost:8888/test/helloword.do,请求被发送到Tomcat,被监听8888端口并处理 HTTP/1.1 协议的Connector获得。
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
  3. Engine获得请求localhost/test/helloword.do,匹配所有的虚拟主机Host。
  4. Engine匹配到名为localhost的Host虚拟主机来处理/test/helloword.do请求(即使匹配不到会请求交给默认Host处理)。
  5. 匹配到的Context获得请求/helloword.do。
  6. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用HelloWorld的doGet()或doPost().执行业务逻辑、数据存储等程序。
  7. Context把执行完之后的结果通过HttpServletResponse对象返回给Host。
  8. Host把HttpServletResponse返回给Engine。
  9. Engine把HttpServletResponse对象返回Connector。
  10. Connector把HttpServletResponse对象返回给客户Browser。

Servlet继承结构

Servlet接口

  1. init(),创建Servlet对象后立即调用该方法完成一些初始化工作。
  2. service(),处理客户端请求,执行业务操作,利用响应对象响应客户端请求。
  3. destroy(),在销毁Servlet对象之前调用该方法,释放资源。
  4. getServletConfig(),ServletConfig是容器向servlet传递参数的载体。
  5. getServletInfo(),获取servlet相关信息。

ServletConfig接口

  1. String getServletName(),返回 Servlet 的名字,即 web.xml 中 元素的值。
  2. ServletContext getServletContext(),返回一个代表当前 Web 应用的 ServletContext 对象。
  3. String getInitParameter(String name),根据初始化参数名返回对应的初始化参数值。
  4. Enumeration getInitParameterNames(),返回一个 Enumeration 对象,其中包含了所有的初始化参数名。

GenericServle抽象类

GenericServlet是实现了Servlet接口的抽象类。在GenericServlet中进一步的定义了Servlet接口的具体实现,其设计的目的是为了和应用层协议解耦,在GenericServlet中包含一个Service抽象方法。

HttpServlet类

继承自 GenericServlet,针对于处理 HTTP 协议的请求所定制。在 HttpServlet的service() 方法中已经把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse。 直接使用 HttpServletRequest 和 HttpServletResponse, 不再需要强转。实际开发中, 直接继承 HttpServlet, 并根据请求方式复写 doXxx() 方法即可。

Servlet的生命周期

Servlet的生命周期是由容器管理的,分别经历三各阶段:

init():初始化

service():服务

destroy():销毁

当客户端浏览器第一次请求Servlet时,容器会实例化这个Servlet,然后调用一次init方法,并在新的线程中执行service方法处理请求。service方法执行完毕后容器不会销毁这个Servlet而是做缓存处理,当客户端浏览器再次请求这个Servlet时,容器会从缓存中直接找到这个Servlet对象,并再一次在新的线程中执行Service方法。当容器在销毁Servlet之前对调用一次destroy方法。

http://www.lryc.cn/news/229795.html

相关文章:

  • Python中的异常与错误处理
  • sqli-labs关卡16(基于post提交的双引号加括号闭合的布尔盲注)通关思路
  • 2.5k的ChatGPT-Java版SDK升级1.1.2-beta0支持GPT-4V、Dall-e-3模型、ToolCalls、微调Job、TTS...
  • k8s二进制(ETCD的部署安装)
  • 【rl-agents代码学习】02——DQN算法
  • 关于使用 Java 反射技术来实现解耦?
  • 使用清华智谱ChatGLM2大模型搭建本地私有知识库
  • MES系统如何赋能制造企业实现4M防错追溯?
  • Mybatis保存时参数携带了逗号和空格导致SQL保存异常
  • vscode launch.json
  • 绿盟远程安全评估系统 RSAS 使用体验-难用
  • 【Linux】 mdir命令使用
  • 解压游戏资源,导出游戏模型
  • 【科研新手指南2】「NLP+网安」相关顶级会议期刊 投稿注意事项+会议等级+DDL+提交格式
  • 220kV环形网络的动态无功补偿方案初步设计
  • 关于值传递和引用传递的问题记录
  • 律师咨询小程序搭建流程
  • 怎么在uni-app中使用Vuex 深度解刨
  • 兼容iphone(ios)圆角(border-radius)不起作用的问题
  • 车间部署MES管理系统后有哪些变化
  • 19C进入数据库出现问号
  • Mistral 7B 比Llama 2更好的开源大模型 (一)
  • 【JUC】三、集合的线程安全
  • 使用 Redis 实现生成分布式全局唯一ID(使用SpringBoot环境实现)
  • Pytorch CUDA CPP简易教程,在Windows上操作
  • 服务器怎么连接
  • 线性代数-Python-05:矩阵的逆+LU分解
  • shell实用脚本命令
  • STM32——端口复用与重映射概述与配置(HAL库)
  • ABZ正交编码 - 异步电机常用的位置信息确定方式