Servlet是运行在Web服务器里的Java组件,服务器为Servlet提供运行环境,Servlet让服务器拥有动态生成内容的能力,二者是“居民”和“小区”的关系。
Servlet和服务器到底什么关系?
很多新手在学Java Web时,会误把Servlet当成服务器,Servlet不是服务器,它是Java EE规范(现在叫Jakarta EE)定义的一组接口,核心是处理客户端请求并生成响应,Servlet没有main方法,不能独立监听端口,也不能单独启动,它必须被装进一个符合Servlet规范的服务器里才能对外提供服务。
Servlet不是服务器,而是服务器里的“租户”
把服务器比作一套房子,Servlet就是住在里面的租户,房子的水电网络是服务器的基础能力,租户在房子里做饭、休息,则对应Servlet处理业务逻辑。
服务器负责这几件底层事情:
- 监听端口,接受TCP连接
- 解析HTTP报文,把请求转成Java对象
- 管理线程池,决定哪个线程处理哪个请求
- 把Servlet生成的响应写回客户端
Servlet只做一件事:根据请求参数、业务数据、外部接口,生成动态内容,生产环境中的Java后端应用,相当一部分仍是Servlet配合服务器运行。
服务器、Servlet容器、Servlet三者的分工
服务器、Servlet容器、Servlet经常混在一起说,但职责并不一样,下面的表格可以看清边界。
| 角色 | 主要职责 | 典型代表 |
|---|---|---|
| Web服务器 | 网络通信、静态资源、HTTP协议 | Nginx、Apache HTTP Server |
| Servlet容器 | 加载Servlet、管理生命周期、请求分发 | Tomcat、Jetty、Undertow |
| Servlet | 业务处理、响应生成 | 开发者写的Java类 |
行业共识认为,Tomcat是大多数Java初学者最先接触的Servlet容器,它既是Web服务器,也是Servlet容器,Tomcat里跑Servlet”就成了最常见组合。
Servlet和Tomcat什么关系?
Tomcat是Apache软件基金会维护的开源Web服务器,实现了Servlet规范和JSP规范,它内部写好了Servlet的生命周期管理逻辑,开发者只需要把Servlet编译后的class文件或war包放进去。
一个Servlet在Tomcat里的运行流程
用户访问一个Servlet地址时,Tomcat做的事情按顺序展开:
- Tomcat解析请求头,确定要访问哪个应用、哪个URL路径
- 容器根据web.xml或@WebServlet注解的映射关系,找到对应的Servlet类
- 如果Servlet还未创建实例,Tomcat会先加载类并调用init()方法
- Tomcat从线程池中取出一个线程,调用Servlet的service()方法
- Servlet通过request对象读取参数,处理后写入response对象
- Tomcat把response内容转成HTTP响应,发回浏览器
这个流程能看出,Servlet和服务器之间不是简单组装关系,而是被容器托管的关系,Servlet不直接操作端口,也不接触原始socket,所有网络细节都被服务器屏蔽了。
Servlet容器和服务器区别在哪?
Servlet容器只是服务器内部的一个功能模块,Tomcat这种轻量级服务器,把Web服务器功能和Servlet容器集成在同一个进程里,WebLogic、WebSphere这种企业级Java EE服务器,包含EJB容器、JMS服务、事务管理,Servlet容器只是其中一部分,选了不同服务器,Servlet的运行方式没有变化,因为规范统一。

Servlet和服务器之间如何交互?
交互不是“Servlet调用服务器API”那么直接,而是通过Servlet规范定义的几类对象完成,最核心的是ServletRequest、ServletResponse和ServletContext。
ServletContext是通信窗口
ServletContext代表当前Web应用的全局环境,相当于Servlet和服务器之间的一扇窗,开发者可以在这个对象里:
- 读取web.xml里配置的初始化参数
- 记录应用的全局日志
- 存放多个Servlet共享的数据
- 获取项目部署的实际路径
服务器启动时创建ServletContext,服务器关闭时销毁它,每个应用只有一个ServletContext,生命周期和应用一样长。
生命周期里服务器做主导
Servlet有明确的阶段,每个阶段都由服务器控制:
- 加载阶段:服务器读取class文件并创建实例,多数情况下是首次请求到达时
- 初始化阶段:服务器调用init(),只调用一次
- 请求处理阶段:服务器每次请求都调用service(),再分发到doGet或doPost
- 销毁阶段:服务器停止或应用卸载时调用destroy()
Servlet不需要自己管理线程池,也不需要关心连接复用,这些底层工作都由服务器包办,开发者只要写出正确的业务逻辑。
把Servlet部署到Linux服务器上,需要走过哪些步骤?
纯Servlet开发的war包,放到Linux服务器上的Tomcat就能运行,步骤如下:
- 在本地用Maven执行
mvn clean package,生成名为xxx.war的文件 - 用scp或Jenkins把war包传到Linux服务器的Tomcat目录
- 移动到
/usr/local/tomcat/webapps/目录 - 执行
/usr/local/tomcat/bin/shutdown.sh
和
startup.sh重启Tomcat - 浏览器访问
http://服务器IP:8080/应用名/访问路径
没有Maven时,也可以用javac手动编译,但打包war时需要遵守WEB-INF/classes的目录结构,常见问题大多是端口未放开、Java版本不匹配、war包名字和访问路径不一致,部署前检查这三项,能省下不少排查时间。
Servlet与服务器的关系并不复杂:服务器提供运行环境,Servlet负责处理业务,二者通过Servlet规范互相配合,把这个模型记清楚,之后看Spring Boot自动配置、内嵌服务器替换、过滤器链执行,都不会觉得晦涩。
关于servlet和服务器关系,常见疑问快答
Servlet入门需要学吗?
需要,Spring MVC的核心入口DispatcherServlet本身就是一个Servlet,Spring Boot的内嵌Tomcat只是把容器藏到了后台,理解Servlet和服务器关系,能帮助排查URL映射、过滤器、拦截器这类问题,学的时候不用研究太深,掌握请求流转和生命周期就够用。
Servlet容器和服务器是不是同一个东西?
不完全是,Tomcat里容器和Web服务器在一个程序里,所以看起来是一个东西,WebLogic这种完整Java EE服务器里,Servlet容器只是其中一个模块,业内专家指出,判断一个软件是不是Servlet容器,标准是它是否实现了Servlet规范中的接口和加载机制。
Tomcat服务器收费吗?
Tomcat本身免费,Apache软件基金会以开源方式发布,任何人都可以下载使用,商业公司提供Tomcat部署、调优、运维服务时会收费,收费的是服务,不是Tomcat,如果选择WebLogic这类商业Java EE服务器,则需要购买授权,具体费用取决于CPU核数和版本。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/920273.html


评论列表(4条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是服务器部分,给了我很多新的思路。感谢分享这么好的内容!
@悲伤user281:这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于服务器的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
读了这篇文章,我深有感触。作者对服务器的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于服务器的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!