# mini-tomcat
**Repository Path**: linestyle007/mini-tomcat
## Basic Information
- **Project Name**: mini-tomcat
- **Description**: mini-tomcat
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-05-16
- **Last Updated**: 2024-01-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 准备工作
### 流程架构图

* 解析配置
* **加载外部class文件工具类** => 加载 webapps/*/web.xml中的sevlet类
* 解析web.xml => 将servlet类加载到uri2servlet中
* 初始化线程池 => 解决socket client请求超时假死时,其它客户端能正常响应
* 提供socket通信服务
* 请求request对象
* 请求资源
* 响应response对象
### 配置文件
#### server.xml
```xml
```
#### web.xml
> 说明:每个部署应用的配置文件
>
> 位置:{appBase}/{appName}/web.xml
```xml
userServlet
server.UserServlet
userServlet
/user
```
## 实现步骤
```java
class Bootstrap {
public void static main(String[] args){
Bootstrap.run();
}
public static void run() {
// 1.初始化配置 server.xml && webapps/{app}/web.xml
HelperLoader.init();
// 2.启动监听服务器 => 127.0.0.1:8080
ServerSocket server = new ServerSocket(8080, "127.0.0.1");
while(true){
Socket client = server.accept();
// 3.通知 => 处理请求并响应数据
HandlerHelper.notify(client);
}
}
}
```
### 初始化配置
```java
HelperLoader.init() {
ClassLoader.loadClass(ConfigHelper.class);
}
class ConfigHelper {
@Getter
private Map uri2servlet;
@Getter
private ExecutorService executorService;
// port,host,appBase @Getter...
static
{
initServerConfig(); // parse server.xml => [port,host,appBase]
initServletMapping(); // parse webapps/*/web.xml => uri2servlet
initThreadPool(); // 请求线程池 => 解决socket客户端超时未响应导致服务端阻塞 => 保证每个客户端正常响应数据
}
}
```
### 通知处理器
```java
HandlerHelper.notify(client) {
// "GET /index.htm HTTP1.1 ..." => {method: "GET", uri: "/index.html"}
HttpRequest request = wrapperRequest(client);
// 输出内容:content => "HTTP content-type=text/html; content-body=${content}"
handleRequest(client.getOutputStream(), request);
}
```
### 处理请求
```java
class StaticResourceHandler {
void handle(HttpResponse response, HttpRequest request) {
HttpUtil.write(response.getOutputStream(), request.getUri());
}
}
class DynamicResourceHandler {
void handle(HttpResponse response, HttpRequest request) {
Servlet servlet = ConfigHelper.get(request.getUri());
servlet.sevice(request, response);
}
}
```