Tomcat源码学习(7)How Tomcat works(转)

Response

    ex01.pyrmont.Response类代表一个HTTP响应,在Listing 1.6里边给出。
         Listing 1.6: Response


package ex01.pyrmont;
import java.io.OutputStream;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.File;
/*
HTTP Response = Status-Line
*(( general-header | response-header | entity-header ) CRLF)
CRLF
[ message-body ]
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
*/
public class Response {
     private static final int BUFFER_SIZE = 1024;
     Request request;
     OutputStream output;
     public Response(OutputStream output) {
         this.output = output;
     }
     public void setRequest(Request request) {
         this.request = request;
     }
     public void sendStaticResource() throws IOException {
         byte[] bytes = new byte[BUFFER_SIZE];
         FileInputStream fis = null;
         try {
             File file = new File(HttpServer.WEB_ROOT, request.getUri());
             if (file.exists()) {
                 fis = new FileInputStream(file);
                 int ch = fis.read(bytes, 0, BUFFER_SIZE);
                 while (ch!=-1) {
                     output.write(bytes, 0, ch);
                     ch = fis.read(bytes, 0, BUFFER_SIZE);
                 }
             }
             else {
             // file not found
             String errorMessage = "HTTP/1.1 404 File Not Found\r\n" +
                 "Content-Type: text/html\r\n" +
                 "Content-Length: 23\r\n" +
                 "\r\n" +
                 "<h1>File Not Found</h1>";
             output.write(errorMessage.getBytes());
             }
         }
         catch (Exception e) {
             // thrown if cannot instantiate a File object
             System.out.println(e.toString() );
         }
         finally {
             if (fis!=null)
             fis.close();
         }
     }
}

    首先注意到它的构造方法接收一个java.io.OutputStream对象,就像如下所示。

public Response(OutputStream output) {
     this.output = output;
}

    响应对象是通过传递由套接字获得的OutputStream对象给HttpServer类的await方法来构造的。Response类有两个公共方法:setRequestsendStaticResourcesetRequest方法用来传递一个Request对象给Response对象。
    sendStaticResource
方法是用来发送一个静态资源,例如一个HTML文件。它首先通过传递上一级目录的路径和子路径给File累的构造方法来实例化java.io.File类。

File file = new File(HttpServer.WEB_ROOT, request.getUri());

    然后它检查该文件是否存在。假如存在的话,通过传递File对象让sendStaticResource构造一个java.io.FileInputStream对象。然后,它调用FileInputStreamread方法并把字节数组写入OutputStream对象。请注意,这种情况下,静态资源是作为原始数据发送给浏览器的。

if (file.exists()) {
     fis = new FileInputstream(file);
     int ch = fis.read(bytes, 0, BUFFER_SIZE);
     while (ch!=-1) {
         output.write(bytes, 0, ch);
         ch = fis.read(bytes, 0, BUFFER_SIZE);
     }
}

    假如文件并不存在,sendStaticResource方法发送一个错误信息到浏览器。

String errorMessage =
     "Content-Type: text/html\r\n" +
     "Content-Length: 23\r\n" +
     "\r\n" +
     "<h1>File Not Found</h1>";
output.write(errorMessage.getBytes());

原文地址:https://www.cnblogs.com/macula7/p/1960631.html