Tomcat 内核详解 - Servlet规范
Tomcat 核心系列文章主要关注于 Tomcat 的核心功能和组件,包括连接器(Connector)、容器(Container)、服务(Service)和引导(Bootstrap)过程等。这里我们将关注 Servlet 规范的实现。
Servlet 规范定义了一种使得 Java 代码能在服务器端运行的接口。在 Tomcat 中,org.apache.catalina.servlets.DefaultServlet
类提供了基本的文件服务功能,并实现了 Servlet 规范。
以下是一个简化的 DefaultServlet
类的核心方法,它处理 GET 请求和返回静态文件内容:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DefaultServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 获取请求的文件路径
String path = req.getServletPath();
// 打开文件输入流
InputStream input = getResourceAsStream(path);
if (input == null) {
// 文件未找到,设置404响应状态
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
// 设置200响应状态和内容类型
resp.setContentType("text/html");
resp.setStatus(HttpServletResponse.SC_OK);
// 获取输出流,并将文件内容写入响应
OutputStream output = resp.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = input.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
// 关闭流
input.close();
output.close();
}
}
在这个简化的例子中,DefaultServlet
类覆盖了 doGet
方法,用于处理 HTTP GET 请求。它读取请求对应的文件资源,并将文件内容通过 HttpServletResponse
返回给客户端。如果文件不存在,它会设置响应状态为 404。
这个例子展示了如何简单地实现一个 Servlet,但实际的 Servlet 容器实现要复杂得多,包括处理更多的 HTTP 方法、安全性、缓存、日志记录等功能。
评论已关闭