zoukankan      html  css  js  c++  java
  • 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());

  • 相关阅读:
    UITabBarController生命周期(使用storyoard搭建)
    ios应用数据存储方式(归档)
    ios应用数据存储方式(偏好设置)
    使用picker View控件完成一个简单的选餐应用
    ios应用数据存储方式(XML属性列表-plist)
    控制器的View的创建
    控制器的创建
    权限管理具体代码实现
    gitHub相关
    初始Ajax
  • 原文地址:https://www.cnblogs.com/macula7/p/1960631.html
Copyright © 2011-2022 走看看