javaweb 上篇
一、Tomcat 核心定位与职责
1. Tomcat 是什么?
Tomcat 是 Web 服务器(Servlet 容器),核心作用是:
- 服务初始化:启动时加载 Web 应用配置(如
web.xml
),创建ServletContext
(应用域)和ServletConfig
(Servlet 配置)。 - 网络通信:监听端口(默认 8080),接收客户端 HTTP 请求。
- 请求处理:解析请求路径,通过「路由规则」将请求分发到对应的 Servlet 处理,并返回响应。
2. Tomcat 与 Servlet 的关系
Tomcat 是 Servlet 规范的实现者,负责:
- 解析配置:读取
web.xml
或注解配置,创建ServletConfig
对象(每个 Servlet 一个),存储初始化参数(如数据库连接信息)。 - 生命周期管理:控制 Servlet 的
init()
、service()
、destroy()
方法调用,无需开发者手动管理。
二、Servlet 规范与实现类
1. Servlet 接口(规范)
- 地位:Java EE 定义的接口(
jakarta.servlet.Servlet
),规定了 Servlet 的核心方法(如init
、service
、destroy
)。 - 作用:开发者需实现此接口或继承其子类,定义具体的业务逻辑(如处理登录、数据查询)。
2. Servlet 实现类的继承层次
jakarta.servlet.Servlet(接口) // 爷爷:定义通用方法
├─ jakarta.servlet.GenericServlet(抽象类) // 儿子:实现通用逻辑(非 HTTP 专用)
│ ├─ jakarta.servlet.http.HttpServlet(抽象类) // 孙子:HTTP 协议专用,简化开发
GenericServlet
:- 实现
Servlet
接口,提供ServletConfig
封装(通过getServletConfig()
获取配置)。 - 适用于非 HTTP 协议(如 FTP),但实际开发中较少直接使用。
- 实现
HttpServlet
(重点!):- 继承
GenericServlet
,专为 HTTP 协议设计,提供doGet
、doPost
、doDelete
等方法,直接处理不同类型的 HTTP 请求。 - 示例:
@WebServlet("/user") public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { // 处理 GET 请求(如查询用户) } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) { // 处理 POST 请求(如创建用户) } }
- 继承
三、ServletConfig:单个 Servlet 的配置容器
1. 作用
- 每个 Servlet 对应一个
ServletConfig
对象,存储 当前 Servlet 的初始化参数(如该 Servlet 独有的配置项)。 - 提供方法访问配置信息:
String getInitParameter(String name); // 通过参数名获取值(如数据库 URL) Enumeration<String> getInitParameterNames(); // 获取所有参数名 ServletContext getServletContext(); // 获取当前 Web 应用的上下文(应用域)
2. 配置方式
web.xml
配置:<servlet> <servlet-name>userServlet</servlet-name> <servlet-class>com.example.UserServlet</servlet-class> <init-param> <param-name>dbUrl</param-name> <param-value>jdbc:mysql://localhost:3306/db</param-value> </init-param> </servlet>
- 注解配置(Servlet 3.0+):
@WebServlet( name = "userServlet", urlPatterns = "/user", initParams = @WebInitParam(name = "dbUrl", value = "jdbc:mysql://localhost:3306/db") )
四、ServletContext:Web 应用的全局上下文(应用域)
1. 核心特性
- 唯一性:每个 Web 应用(部署在 Tomcat 中的一个项目)对应一个
ServletContext
对象,所有 Servlet 共享此对象。 - 生命周期:与 Web 应用一致(服务器启动时创建,关闭时销毁)。
- 作用:
- 共享数据:存储所有用户共享、极少修改、数据量小的信息(如全局配置、缓存数据)。
- 访问资源:获取 Web 应用路径(
getRealPath
)、读取配置文件(getResourceAsStream
)。 - 日志记录:通过
log(String message)
记录应用级日志。
2. 数据操作方法
// 存:向应用域中存储数据(类似 Map)
setAttribute(String name, Object value);
// 取:从应用域中获取数据
Object getAttribute(String name);
// 删:移除应用域中的数据
removeAttribute(String name);
示例:
// 在某个 Servlet 中存储全局用户信息(假设所有用户可见)
User globalUser = new User("admin", "admin");
request.getServletContext().setAttribute("globalUser", globalUser);
// 另一个 Servlet 中获取该数据
User user = (User) request.getServletContext().getAttribute("globalUser");
3. 注意事项
- 线程安全:数据被所有用户共享,修改时需加锁(如
synchronized
),避免并发问题。 - 数据量:仅存储轻量数据(如配置项、统计计数器),避免大对象占用内存。
- 用途场景:适合存储「只读或极少修改的全局数据」(如系统版本号、公共参数)。
五、总结:Tomcat 与 Servlet 组件协作流程
- Tomcat 启动:
- 解析
web.xml
或注解,创建ServletContext
(应用域)和各ServletConfig
(Servlet 配置)。
- 解析
- 请求到达:
- Tomcat 接收 HTTP 请求,根据 URL 找到对应的 Servlet(通过
web.xml
或@WebServlet
映射)。
- Tomcat 接收 HTTP 请求,根据 URL 找到对应的 Servlet(通过
- Servlet 处理:
- Tomcat 调用 Servlet 的
service()
方法(HttpServlet 会根据请求方法调用doGet
/doPost
等)。 - Servlet 通过
this.getServletConfig()
获取自身配置,通过getServletContext()
访问应用域数据。
- Tomcat 调用 Servlet 的
- 响应返回:
- Servlet 生成响应数据,Tomcat 将其封装为 HTTP 响应,返回给客户端。
通过这种分层协作,Tomcat 实现了「请求接收→路由分发→Servlet 处理」的完整流程,而开发者只需专注于 Servlet 业务逻辑和配置,大幅简化 Web 应用开发。
Javaweb 文章被收录于专栏
JavaWeb 是指使用 Java 技术来开发基于 Web 的应用程序,它结合了 Java 语言的强大功能和 Web 技术的灵活性,广泛应用于各种企业级 Web 应用开发中。