Tomcat 服务流程
- 1:浏览器发出请求,访问服务器,发送一个请求头信息
- 2:根据Http协议解析对应的请求头信息
- 3:获取请求头中的资源地址
- 4:判断资源的类型,静态/动态
- 5:将资源通过通道(流)返回给浏览器端
手写实现
import com.example.springbootstart.tomcat.servlet.*;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyTomcat {
private Integer port;
public MyTomcat(Integer port) {
this.port = port;
}
public void start() throws Exception {
initServlet();
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("my tomcat is start, port = " + port);
while (true) {
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
Request request = new Request(inputStream);
String url = request.getUrl();
Response response = new Response(socket.getOutputStream());
if ("/".equals(url)) {
System.out.println("dispatch /");
} else if (!servletMap.containsKey(url)) {
System.out.println("dispatch servletMap no key " + url);
} else {
dispatch(url, request, response);
}
socket.close();
}
}
private void dispatch(String url, Request request, Response response) throws InstantiationException, IllegalAccessException {
Class<Servlet> servletClass = servletMap.get(url);
Servlet servlet = servletClass.newInstance();
servlet.service(request, response);
}
private Map<String, Class<Servlet>> servletMap = new HashMap<>();
private void initServlet() throws ClassNotFoundException {
List<ServletConfig> servletConfigList = ServletConfigMapping.getServletConfigList();
for (ServletConfig servletConfig : servletConfigList) {
servletMap.put(servletConfig.getUrlMapping(), (Class<Servlet>) Class.forName(servletConfig.getClazz()));
}
}
public static void main(String[] args) throws Exception {
MyTomcat tomcat = new MyTomcat(8080);
tomcat.start();
}
}
import java.io.IOException;
import java.io.InputStream;
public class Request {
private String method;
private String url;
private InputStream inputStream;
public Request(InputStream inputStream) throws IOException {
this.inputStream = inputStream;
int count = 0;
while (count == 0){
count = inputStream.available();
}
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
String content = new String(bytes);
fillField(content);
}
public void fillField(String content){
if ("".equals(content)){
System.out.println("content is null");
}else{
String firstLine = content.split("\\n")[0];
String[] param = firstLine.split("\\s");
method = param[0];
url = param[1];
}
}
@Override
public String toString() {
return "Request{" +
"method='" + method + '\'' +
", url='" + url + '\'' +
'}';
}
public String getMethod() {
return method;
}
public String getUrl() {
return url;
}
public InputStream getInputStream() {
return inputStream;
}
}
import java.io.IOException;
import java.io.OutputStream;
public class Response {
private OutputStream outputStream;
public Response(OutputStream outputStream) {
this.outputStream = outputStream;
}
public void write(byte[] content) {
try {
outputStream.write(content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.example.springbootstart.tomcat.servlet;
public class RtServlet extends Servlet{
@Override
public void doGet(Request request, Response response) {
System.out.println("RtServlet doGet is start");
response.write("RtServlet doGet".getBytes());
}
@Override
public void doPost(Request request, Response response) {
System.out.println("RtServlet doPost is start");
response.write("RtServlet doPost".getBytes());
}
}
package com.example.springbootstart.tomcat.servlet;
public abstract class Servlet {
public abstract void doGet(Request request, Response response);
public abstract void doPost(Request request, Response response);
public void service(Request request, Response response){
if("GET".equals(request.getMethod())){
doGet(request, response);
}else{
doPost(request, response);
}
}
}
package com.example.springbootstart.tomcat.servlet;
public class ServletConfig {
private String urlMapping;
private String name;
private String clazz;
public ServletConfig(String urlMapping, String name, String clazz) {
this.urlMapping = urlMapping;
this.name = name;
this.clazz = clazz;
}
public String getUrlMapping() {
return urlMapping;
}
public String getClazz() {
return clazz;
}
}
import java.util.ArrayList;
import java.util.List;
public class ServletConfigMapping {
private static List<ServletConfig> servletConfigList = null;
static {
servletConfigList = new ArrayList<>();
servletConfigList.add(new ServletConfig("/doget", "rtServlet",
"com.example.springbootstart.tomcat.servlet.RtServlet"));
}
public static List<ServletConfig> getServletConfigList() {
return servletConfigList;
}
}