功能目标:
增加 Filter 和 Listener 支持,用于在请求处理过程中插入额外的操作或监听事件。
实现 Filter 接口,支持请求过滤,例如日志记录、认证拦截等功能。
实现 Listener 接口,支持监听 Servlet 上下文或会话的创建和销毁事件。
实现内容:
实现 Filter 接口,拦截 HTTP 请求并在请求前后插入自定义逻辑。
实现 Listener 接口,监听 Servlet 上下文、会话或请求的生命周期事件。
实现一个简单的日志过滤器,记录每个请求的访问时间和路径。
示例功能:
实现一个日志过滤器,记录每个请求的访问时间和请求路径。
在 Servlet 上下文初始化时创建一个监听器,监听上下文和会话的创建销毁事件。
9.1 过滤器(Filter)Filter 是 Servlet 容器提供的一个接口,它允许开发者在请求到达 Servlet 之前和响应返回客户端之前插入自定义的处理逻辑。过滤器可以用于执行常见的任务,如日志记录、权限验证、请求重定向、输入输出数据处理等。
1. Filter 接口的实现Filter 接口提供了三个方法:
...
minitomcat
未读在本章中,我们将进一步扩展 MiniTomcat,加入对 Servlet 协议的支持,特别是 异步请求处理。Servlet 3.0 引入了异步请求处理的机制,允许请求在后台异步处理,从而避免了阻塞主线程,提高服务器处理效率,特别是在处理长时间运行的请求(如文件上传、大数据处理等)时。
8.1 功能目标
实现 Servlet 3.0 异步请求处理功能。
通过 AsyncContext 提供异步请求和响应的处理机制,允许在后台线程处理长时间任务而不阻塞主线程。
支持异步响应,确保在异步任务完成后能够向客户端发送正确的响应。
8.2 异步处理流程
启动异步请求:客户端发起请求后,Servlet 容器检查请求是否需要异步处理。如果需要异步处理,调用 request.startAsync() 启动异步请求。
异步任务执行:Servlet 容器将请求分配到后台线程进行处理,主线程立即返回,继续处理其他请求。
完成异步处理:后台线程执行完任务后,调用 AsyncContext.complete() 完成异步处理,向客户端发送响应。
8.3 代码实现8.3.1 修改 HttpServl ...
minitomcat
未读在这一阶段,我们将为 MiniTomcat 添加多线程支持,以提高服务器的并发处理能力。通过使用线程池,我们能够同时处理多个客户端请求,而不阻塞其他请求。这将使服务器在处理并发请求时更加高效,能够更好地支持多个用户同时访问。
7.1 功能目标
多线程支持:使用线程池来管理线程,并为每个客户端请求分配一个独立的线程。
线程池:避免为每个请求创建新线程,通过线程池提高效率,防止线程创建和销毁的开销。
并发处理:支持多个客户端同时访问不同的 Servlet,保证请求之间互不干扰。
7.2 代码结构本次修改将引入线程池机制,通过 ExecutorService 来管理工作线程。代码结构更新如下:
123456789101112131415161718192021222324252627282930MiniTomcat├─ src│ ├─ main│ │ ├─ java│ │ │ ├─ com.daicy.minitomcat│ │ │ │ ├─ servlet│ │ │ │ │ ├─ CustomServletOutputStream.java // 自定义的 Servlet 输出流类 ...
minitomcat
未读本步骤将实现对 HTTP Session 和 Cookie 的支持,以便维护客户端的会话状态,使每次请求能够识别为同一客户端并跟踪状态。我们将实现一个计数器 Servlet,用于记录每个客户端的访问次数。
6.1 功能目标
实现会话管理:通过 HttpSession 支持为每个客户端分配唯一的 Session ID,并保持会话状态。
支持 Cookie:实现对 Cookie 的解析,将请求中的 Cookie 信息提取出来,并在响应中设置新的 Cookie 信息。
6.2 代码结构更新后的 MiniTomcat 代码结构,新增了 CustomHttpSession、SessionManager 、HttpRequestParser相关类,以及 CounterServlet 示例。
1234567891011121314151617181920212223242526272829MiniTomcat├─ src│ ├─ main│ │ ├─ java│ │ │ ├─ com.daicy.minitomcat│ │ │ │ ├─ servlet│ │ │ │ │ ├─ CustomSe ...
minitomcat
未读本步骤将实现基于 web.xml 配置文件的 Servlet 路由映射和初始化参数支持,使得 MiniTomcat 能根据配置自动调用相应的 Servlet 处理请求。
5.1 功能目标
配置文件管理路由和初始化参数:通过 web.xml 文件管理 Servlet 映射和初始化参数。
URL 路径映射:根据配置文件中的路径映射,将请求 URL 映射到对应的 Servlet。
支持 ServletConfigImpl 获取初始化参数:提供 ServletConfigImpl 类,支持从配置中读取初始化参数。
5.2 代码结构以下是更新后的 MiniTomcat 代码结构,新增了 ServletConfigImpl、ServletContextImpl、ServletLoader和WebXmlServletContainer等类和 web.xml 配置文件。
12345678910111213141516171819202122232425MiniTomcat├─ src│ ├─ main│ │ ├─ java│ │ │ ├─ com.daicy.minitomcat│ │ │ │ ...
在 MiniTomcat 的开发过程中,我们需要将请求数据从低级的 Socket 输入输出流中抽象出来,以简化后续处理和响应的构建。通过创建 HttpServletRequest 和 HttpServletResponse 接口,我们可以为开发者提供更易用的请求和响应操作接口,类似于标准的 Servlet API。
1. HttpServletRequest 接口设计HttpServletRequest 是对客户端请求的抽象封装,主要包含请求方法、URL、头信息、参数等。
1.1 主要属性
请求方法(如 GET、POST)
请求路径(如 /index.html)
请求头(如 User-Agent、Accept 等)
请求参数(GET 参数和 POST 参数)
Cookie 和 Session:用于跟踪用户状态(后续会进一步实现)
1.2 主要方法方法说明getMethod()返回请求方法(如 GET)getRequestURI()返回请求的 URIgetHeader(String name)获取指定名称的请求头的值getParameter(String name)获取指定 ...
minitomcat
未读在构建 MiniTomcat 的过程中,处理网络请求和数据传输是不可或缺的环节,而这正是 Java 的输入/输出(I/O)流可以帮助实现的。I/O 流用于读取和写入数据,从而实现客户端和服务器之间的数据交互。因此,深入理解 Java I/O 流将有助于我们为 MiniTomcat 实现处理 HTTP 请求和响应的功能。
1. Java I/O 流概述Java I/O 流可以分为以下两类:
字节流(Byte Stream):处理二进制数据,使用 InputStream 和 OutputStream。
字符流(Character Stream):处理字符数据(文本),使用 Reader 和 Writer。
在 MiniTomcat 的开发中,字节流通常用于网络数据传输,而字符流则适合处理文本数据,例如读取请求头信息。
2. 字节流(Byte Stream)
InputStream:用于读取字节数据,如 FileInputStream 和 BufferedInputStream。
OutputStream:用于写入字节数 ...
minitomcat
未读在开始实现 MiniTomcat 的核心功能之前,我们需要深入理解 HTTP 协议。HTTP(超文本传输协议)是互联网通信的基础协议,也是 Web 服务器(例如 Tomcat)与客户端(如浏览器)进行交互的主要协议。理解 HTTP 的工作原理将帮助我们在后续步骤中处理请求、响应和数据传输。
1. HTTP 协议概述HTTP 是一种无状态、面向请求-响应的协议。客户端(通常是浏览器)通过 HTTP 请求向服务器获取数据,服务器通过 HTTP 响应返回数据给客户端。
无状态:每个请求都是独立的,服务器不会自动保留客户端的状态。
请求-响应模式:客户端发出请求,服务器返回响应。
2. HTTP 请求和响应的结构HTTP 请求和响应都包含三个主要部分:
2.1 HTTP 请求
请求行:包括请求方法(如 GET、POST)、URL 和 HTTP 版本。
请求头:包含元数据(如 Content-Type、User-Agent)。
请求体:用于传输数据(在 POST 请求中,通常是表单数据或 JSON)。
示例 HTTP 请求:
1234GET /index.html HTTP/1 ...
minitomcat
未读在这个模块中,我们将深入学习 Java 网络编程的基础知识。这些技能是构建 MiniTomcat 必不可少的,因为 MiniTomcat 需要通过 HTTP 协议与客户端(如浏览器)进行通信。掌握网络编程的基本概念将帮助我们更好地理解 HTTP 连接、请求和响应等重要组件的实现。
1. Java 网络编程概览Java 中的网络编程通过 Socket 和 ServerSocket 类实现。Socket 是网络通信的基础,允许我们在客户端和服务器之间传输数据。
Socket:用于客户端,与服务器建立连接并进行数据交换。
ServerSocket:用于服务器,监听客户端连接请求并响应。
2. 了解 TCP 和 UDP在网络通信中,常见的协议有两种:
TCP(传输控制协议):面向连接,数据传输可靠,适用于 HTTP 等需要可靠传输的协议。
UDP(用户数据报协议):无连接,数据传输不可靠但速度快,适用于视频流、在线游戏等应用。
在 MiniTomcat 中,我们主要使用 TCP 协议来处理客户端的 HTTP 请求。
3. 使用 Socket 和 ServerSocket3.1 ...
minitomcat
未读我们将从 Java I/O 的基础知识开始,为构建 MiniTomcat 打下坚实的文件处理和网络输入输出的基础。在这个模块中,你将了解 Java 中的 I/O 系统,学会使用字节流和字符流进行数据传输,并掌握常见的文件处理操作。
1. Java I/O 概览Java 中的 I/O(输入/输出)操作允许程序与外部资源(如文件、网络)进行数据交互。Java 的 I/O 系统有两种主要方式:
字节流:用于处理二进制数据,适合传输图像、音频等非文本内容。
字符流:用于处理文本数据,支持多种字符编码。
2. 字节流与字符流2.1 字节流 (InputStream 和 OutputStream)字节流以字节为单位读取和写入数据。主要类有:
FileInputStream:用于从文件中读取字节数据。
FileOutputStream:用于向文件中写入字节数据。
2.2 字符流 (Reader 和 Writer)字符流以字符为单位处理数据,更适合文本文件。主要类有:
FileReader:用于从文件中读取字符数据。
F ...






