手写Tomcat之简单实现
封装Request对象
public class Request {
private String url;
private String method;
public Request(InputStream inputStream) throws IOException {
String httpRequest = "";
byte[] bytes = new byte[1024];
int length = 0;
if ((length = inputStream.read(bytes)) > 0) {
httpRequest = new String(bytes, 0, length);
}
String httpHead = httpRequest.split("\n")[0];
url = httpHead.split("\\s")[1];
method = httpHead.split("\\s")[0];
System.out.println(this);
}
}
封装Response对象
public class Response {
private OutputStream outputStream;
public Response(OutputStream outputStream) {
this.outputStream = outputStream;
}
public void write(String content) throws IOException {
StringBuffer httpResponse = new StringBuffer();
httpResponse.append("HTTP/1.1 200 OK\n")
.append("Content-Type: text/html\n")
.append("\r\n")
.append("<html><body>")
.append(content)
.append("</body></html>");
outputStream.write(httpResponse.toString().getBytes());
outputStream.close();
}
}
自定义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 (request.getMethod().equalsIgnoreCase("POST")) {
doPost(request, response);
} else if (request.getMethod().equalsIgnoreCase("GET")) {
doGet(request, response);
}
}
}
定义具体的Servlet实现
public class ExecuteServlet extends Servlet {
@Override
public void doGet(Request request, Response response) {
try {
response.write("execute get Servlet....");
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void doPost(Request request, Response response) {
try {
response.write("execute post Servlet....");
} catch (IOException e) {
e.printStackTrace();
}
}
}
定义Servlet映射
public class ServletMapping {
private String servletName;
private String url;
private String clazz;
public ServletMapping(String servletName, String url, String clazz) {
this.servletName = servletName;
this.url = url;
this.clazz = clazz;
}
}
public class ServletMappingConfig {
public static List<ServletMapping> servletMappingList = new ArrayList<ServletMapping>();
static {
servletMappingList.add(new ServletMapping("ExecuteServlet", "/executeServlet", "cn.ybzy.tomcat.servlet.ExecuteServlet"));
}
}
Tomcat入口
public class Tomcat {
private int prot = 8080;
private Map<String, String> urlServletMap = new HashMap<String, String>();
public Tomcat(int prot) {
this.prot = prot;
}
public void start() {
this.initServletMapping();
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(prot);
System.out.println("Tomcat starting ....");
while (true) {
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
Request request = new Request(inputStream);
Response response = new Response(outputStream);
if (!request.getUrl().equals("/favicon.ico")) {
dispatch(request, response);
socket.close();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void initServletMapping() {
List<ServletMapping> servletMappingList = ServletMappingConfig.servletMappingList;
for (ServletMapping servletMapping : servletMappingList) {
urlServletMap.put(servletMapping.getUrl(), servletMapping.getClazz());
}
}
private void dispatch(Request request, Response response) {
String clazz = urlServletMap.get(request.getUrl());
try {
Class<Servlet> servlet = (Class<Servlet>) Class.forName(clazz);
Servlet newInstance = servlet.newInstance();
newInstance.service(request, response);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Tomcat(8888).start();
}
}
整体包结构

执行测试

连接到目标VM, 地址: ''127.0.0.1:12371',传输: '套接字'', 传输: '{1}'
Tomcat starting ....
Request{url='/executeServlet', method='GET'}
Request{url='/favicon.ico', method='GET'}