您的位置:首页 > 运维架构 > Tomcat

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

2009-08-16 05:35 549 查看
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类有两个公共方法:setRequest和sendStaticResource。setRequest方法用来传递一个Request对象给Response对象。

sendStaticResource方法是用来发送一个静态资源,例如一个HTML文件。它首先通过传递上一级目录的路径和子路径给File累的构造方法来实例化java.io.File类。

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

然后它检查该文件是否存在。假如存在的话,通过传递File对象让sendStaticResource构造一个java.io.FileInputStream对象。然后,它调用FileInputStream的read方法并把字节数组写入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());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: