java创建response对象_创建⼀个HttpResponse对象
创建⼀个HttpResponse对象
HttpResponse类实现了javax.servlet.http.HttpServletResponse。跟随它的是⼀个叫做 HttpResponseFacade的façade类。Figure 3.3显⽰了HttpResponse类和它的相关类的UML图。
在第2章中,你使⽤的是⼀个部分实现的HttpResponse类。例如,它的getWriter⽅法,在它的其中⼀个print⽅法被调⽤的时候,返回 ⼀个不会⾃动清除的java.io.PrintWriter对象。在本章中应⽤程序将会修复这个问题。为了理解它是如何修复的,你需要知道Writer是 什么东西来的。
在⼀个servlet⾥边,你使⽤PrintWriter来写字节。你可以使⽤任何你希望的编码,但是这些字节将会以字节流的形式发送到浏览器去。因此,第2章中ex02.pyrmont.HttpResponse类的getWriter⽅法就不奇怪了:
public PrintWriter getWriter() {
// if autoflush is true, println() will flush,
// but print() will not.
// the output argument is an OutputStream
writer = new PrintWriter(output, true);
return writer;
}
请看,我们是如何构造⼀个PrintWriter对象的?就是通过传递⼀个java.io.OutputStream实例来实现的。你传递给PrintWriter的print或println⽅法的任何东西都是通过底下的OutputStream进⾏发送的。
在本章中,你为PrintWriter使⽤tor.ResponseStream类的⼀个实例来替代
OutputStream。需要注意的是,类ResponseStream是间接的从类java.io.OutputStream传递过去的。
同样的你使⽤了继承于PrintWriter的类tor.ResponseWriter。
类ResponseWriter覆盖了所有的print和println⽅法,并且让这些⽅法的任何调⽤把输出⾃动清除到底下的
OutputStream去。因此,我们使⽤⼀个带底层ResponseStream对象的ResponseWriter实例。
我们可以通过传递⼀个ResponseStream对象实例来初始化类ResponseWriter。然⽽,我们使⽤⼀个 java.io.OutputStreamWriter对象充当ResponseWriter对象和ResponseStream对象之间的桥梁。
通过OutputStreamWriter,写进去的字符通过⼀种特定的字符集被编码成字节。这种字符集可以使⽤名字来设定,或者明确给出,或者使⽤平台 可接受的默认字符集。write⽅法的每次调⽤都会导致在给定的字符上编码转换器的调⽤。在写⼊底层的输出流之前,⽣成的字节都会累积到⼀个缓冲区中。缓 冲区的⼤⼩可以⾃⼰设定,但是对⼤多数场景来说,默认的就⾜够⼤了。注意的是,传递给write⽅法的字符是没有被缓冲的。
因此,getWriter⽅法如下所⽰:
public PrintWriter getWriter() throws IOException {
ResponseStream newStream = new ResponseStream(this);
newStream.setCommit(false);
OutputStreamWriter osr =
new OutputStreamWriter(newStream, getCharacterEncoding());
writer = new ResponseWriter(osr);
return writer;
}
静态资源处理器和Servlet处理器
类ServletProcessor类似于第2章中的类ex02.pyrmont.ServletProcessor。它们都只有⼀个⽅ 法:process。然⽽
tor.ServletProcessor中的process⽅法接受⼀个 HttpRequest和
HttpResponse,代替了Requese和Response实例。下⾯是本章中process的⽅法签名:
public void process(HttpRequest request, HttpResponse response) {
另外,process⽅法使⽤HttpRequestFacade和HttpResponseFacade作为
request和response的facade类。另外,在调⽤了servlet的service⽅法之后,它调⽤了类HttpResponse的
finishResponse⽅法。
servlet = (Servlet) wInstance();
HttpRequestFacade requestPacade = new HttpRequestFacade(request);
HttpResponseFacade responseFacade = new HttpResponseFacade(response);
servlet.service(requestFacade, responseFacade);
((HttpResponse) response).finishResponse();
类StaticResourceProcessor⼏乎等同于类ex02.pyrmont.StaticResourceProcessor。
java stream运⾏应⽤程序
要在Windows上运⾏该应⽤程序,在⼯作⽬录下⾯敲⼊以下命令:
java -classpath ./lib/servlet.jar;./ ex03.pyrmont.startup.Bootstrap
在Linux下,你使⽤⼀个冒号来分隔两个库:
java -classpath ./lib/servlet.jar:./ ex03.pyrmont.startup.Bootstrap
要显⽰index.html,使⽤下⾯的URL:
要调⽤PrimitiveServlet,让浏览器指向下⾯的URL:
在你的浏览器中将会看到下⾯的内容:
Hello. Roses are red.
Violets are blue.
注意: 在第2章中运⾏PrimitiveServlet不会看到第⼆⾏。
你也可以调⽤ModernServet,在第2章中它不能运⾏在servlet容器中。下⾯是相应的URL:
注意: ModernServlet的源代码在⼯作⽬录的webroot⽂件夹可以到。
你可以加上⼀个查询字符串到URL中去测试servlet。加⼊你使⽤下⾯的URL来运⾏ModernServlet的话,将显⽰Figure 3.4中的运⾏结果。
Figure 3.4: Running ModernServlet
总结
在本章中,你已经知道了连接器是如何⼯作的。建⽴起来的连接器是Tomcat4的默认连接器的简化版本。正如你所知道的,因为默认连接器并不⾼效,所以已 经被弃⽤了。例如,所有的HTTP请求头部都被解析了,即使它们没有在servlet中使⽤过。因此,默认连接器很慢,并且已经被Coyote所代替了。 Coyote是⼀个更快的连接器,它的源代码可以在Apache软件基⾦会的⽹站中下载。不管怎样,默认连接器作为⼀个优秀的学习⼯具,将会在第4章中详 细讨论。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。