《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文件)。。。

 

 

 

posted on 2013-04-14 03:04  thoupin  阅读(341)  评论(2编辑  收藏  举报

导航