Tomcat 内核详解 - Servlet 规范
Apache Tomcat 是一个实现了 Java Servlet 和 JavaServer Pages (JSP) 技术的开源 Web 服务器。Servlet 规范是 Java EE(现称为 Jakarta EE)的一部分,定义了如何开发 Web 应用程序。以下是对 Tomcat 内核中 Servlet 规范的详解:
1. Servlet 规范简介
Servlet 是一种用于扩展服务器功能的小程序,主要用于处理 Web 客户端的请求和生成动态响应。Servlet 规范定义了 Web 容器(如 Tomcat)与 Servlet 之间的接口,使得开发者可以编写独立于具体服务器的 Web 应用。
2. Servlet 生命周期
Servlet 的生命周期由 Web 容器管理,主要包括以下几个阶段:
-
加载与实例化:
- 容器加载 Servlet 类并创建实例。这通常在第一次请求到达时发生,也可以在服务器启动时通过配置
load-on-startup
实现。
- 容器加载 Servlet 类并创建实例。这通常在第一次请求到达时发生,也可以在服务器启动时通过配置
-
初始化:
- 调用
init
方法进行初始化。这只会调用一次,用于 Servlet 的初始化工作。 init
方法签名:public void init(ServletConfig config) throws ServletException;
- 调用
-
请求处理:
- 每次请求都会调用
service
方法。该方法根据请求类型(如 GET、POST)调用相应的处理方法(如doGet
、doPost
)。 service
方法签名:public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
- 每次请求都会调用
-
销毁:
- 在服务器关闭或应用停止时,调用
destroy
方法进行清理工作。 destroy
方法签名:public void destroy();
- 在服务器关闭或应用停止时,调用
3. Servlet 配置
Servlet 的配置通常在 web.xml
文件中定义,可以包括 Servlet 映射、初始化参数等。
示例配置
<servlet>
<servlet-name>exampleServlet</servlet-name>
<servlet-class>com.example.ExampleServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>exampleServlet</servlet-name>
<url-pattern>/example</url-pattern>
</servlet-mapping>
4. 请求与响应对象
Servlet 通过 HttpServletRequest
和 HttpServletResponse
对象与客户端进行交互。
HttpServletRequest
- 提供请求信息,如请求参数、头部信息、会话信息等。
- 常用方法:
getParameter(String name)
:获取请求参数。getHeader(String name)
:获取请求头信息。getSession()
:获取当前会话。
HttpServletResponse
- 提供响应信息,如状态码、响应头、响应体等。
- 常用方法:
setStatus(int sc)
:设置响应状态码。setHeader(String name, String value)
:设置响应头信息。getWriter()
:获取PrintWriter
对象,用于返回响应内容。
5. ServletContext 和 ServletConfig
ServletContext
- 提供了一个 Web 应用的上下文,允许 Servlet 之间共享信息。
- 通过
getServletContext()
方法获取。 - 常用方法:
getAttribute(String name)
和setAttribute(String name, Object object)
:获取和设置全局属性。getResourceAsStream(String path)
:获取资源文件的输入流。
ServletConfig
- 提供了 Servlet 的配置信息,包括初始化参数和 ServletContext 对象。
- 通过
getServletConfig()
方法获取。 - 常用方法:
getInitParameter(String name)
:获取初始化参数。getServletContext()
:获取 ServletContext 对象。
6. 会话管理
Servlet 规范提供了会话管理机制,通过 HttpSession
对象实现。
-
获取会话:
HttpSession session = request.getSession();
-
设置会话属性:
session.setAttribute("attributeName", attributeValue);
-
获取会话属性:
Object value = session.getAttribute("attributeName");
-
使会话无效:
session.invalidate();
7. 过滤器和监听器
过滤器(Filter)
- 过滤器在请求到达 Servlet 前或响应离开 Servlet 后进行处理。
- 常用来实现日志记录、安全检查等。
- 配置示例:
<filter> <filter-name>exampleFilter</filter-name> <filter-class>com.example.ExampleFilter</filter-class> </filter> <filter-mapping> <filter-name>exampleFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
监听器(Listener)
- 监听器用于监听 Web 应用的生命周期事件。
- 常用来实现会话创建与销毁的监控等。
- 配置示例:
<listener> <listener-class>com.example.ExampleListener</listener-class> </listener>
总结
Servlet 规范是 Java Web 应用程序开发的基础,Tomcat 作为 Servlet 容器,严格按照 Servlet 规范实现了请求处理、会话管理、过滤器和监听器等机制。理解 Servlet 规范对于开发高效、可扩展的 Web 应用程序至关重要。