《How Tomcat Works》读书笔记一
1. "《How Tomcat Works_Chapter 1: A Simple Web Server》"
1.1: HTTP hypetext transfer protocal,
1.2: Request: split a uri from address input
1.3: Response: get the uri to read the file from the servers
1.4: HttpServer: new a socket to receive & send bytes info
2. "《How Tomcat Works_Chapter 2: A Simple Servlet Container》"
2.1: When the servlet is called for the first time, load the servlet class and call the
servlet's' init method (once only)
2.2: For each request, construct an instance of javax.servlet.ServletRequest and
an instance of javax.servlet.ServletResponse.
2.3: Invoke the servlet's' service method, passing the ServletRequest and
ServletResponse objects.
2.4: When the servlet class is shut down, call the servlet's' destroy method and
unload the servlet class.
HttpServer.java:
1 package chap1_ASimpleWebServer; 2 import java.io.File; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6 import java.net.InetAddress; 7 import java.net.ServerSocket; 8 import java.net.Socket; 9 10 11 public class HttpServer { 12 public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot"; 13 14 private static final String SHUTDOWN_COMMAND = "/SHUTDOWN"; 15 16 private boolean shutdown = false; 17 18 public void await() { 19 ServerSocket serverSocket = null; 20 int port = 8080; 21 try { 22 serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1")); 23 } catch (IOException e) { 24 e.printStackTrace(); 25 System.exit(1); 26 } 27 // loop waiting for a request 28 while (!shutdown) { 29 Socket socket = null; 30 InputStream input = null; 31 OutputStream output = null; 32 try { 33 socket = serverSocket.accept(); 34 input = socket.getInputStream(); 35 output = socket.getOutputStream(); 36 // create Request object & parse 37 Request request = new Request(input); 38 request.parse(); 39 // create Response object 40 Response response = new Response(output); 41 response.setRequest(request); 42 response.sendResource(); 43 // close socket 44 socket.close(); 45 // check if the previous URI is a shutdown command 46 shutdown = request.getUri().equals(SHUTDOWN_COMMAND); 47 } catch (IOException e) { 48 e.printStackTrace(); 49 continue; 50 } 51 } 52 } 53 54 public static void main(String[] args) { 55 System.out.println(WEB_ROOT); 56 HttpServer server = new HttpServer(); 57 server.await(); 58 } 59 }
Request.java:
package chap1_ASimpleWebServer; import java.io.IOException; import java.io.InputStream; public class Request { private InputStream input; private String uri; public Request (InputStream input) { this.input = input; } public void parse() { StringBuffer request = new StringBuffer(2048); int len; byte[] buffer = new byte[2048]; try { len = input.read(buffer); } catch (IOException e) { e.printStackTrace(); len = -1; } for (int i = 0; i < len; i++) { request.append((char)buffer[i]); // do not forget cast type byte to char } System.out.println(request.toString()); uri = parseUri(request.toString()); } private String parseUri(String requestString) { int index1, index2; index1 = requestString.indexOf(' '); if (index1 != -1) { index2 = requestString.indexOf(' ', index1 + 1); if (index2 > index1) { return requestString.substring(index1 + 1, index2); } } return null; } public String getUri() { return uri; } }
Response.java:
1 package chap1_ASimpleWebServer; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.OutputStream; 6 7 8 public class Response { 9 private static final int BUFFER_SIZE = 1024; 10 Request request; 11 OutputStream output; 12 13 public Response (OutputStream output) { 14 this.output = output; 15 } 16 17 public void setRequest(Request request) { 18 this.request = request; 19 } 20 21 public void sendResource() throws IOException { 22 byte[] bytes = new byte[BUFFER_SIZE]; 23 FileInputStream fis = null; 24 try { 25 File file = new File(HttpServer.WEB_ROOT, request.getUri()); 26 System.out.println(request.getUri().toString()); 27 if (file.exists()) { 28 fis = new FileInputStream(file); 29 int len = fis.read(bytes, 0, BUFFER_SIZE); 30 while (len != -1) { 31 output.write(bytes, 0, len); 32 len = fis.read(bytes, 0, BUFFER_SIZE); 33 } 34 } else { 35 String errorMessage = "HTTP/1.1 404 File Not Found\r\n" + 36 "ContentType: text/html\r\n" + 37 "ContentLength: 23\r\n\r\n" + 38 "<head>File Not Found</head>"; 39 output.write(errorMessage.getBytes()); 40 } 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } finally { 44 if (fis != null) { 45 fis.close(); 46 } 47 } 48 } 49 }
简单的html, 放在webroot文件夹下:
<html> <head> <title>Hello Tomcat!</title> </head> <body> <img src="./images/tomcat.jpg"> <br> <h1>It's Works!</h1>. </body> </html>
直接java application 运行, 在页面上即可,结果如下:
光是如此是远远不够的, 所以我们还要增加对java文件的支持(Servlet文件)。。。