创建HttpResponse对象的HttpResponse类实现javax.servlet.http.http servlet response。 跟随它的是一个名为HttpResponseFacade的faade类。 Figure 3.3显示了HttpResponse类及其关联类的UML图。
第二章使用部分实现的HttpResponse类。 例如,该getWriter方法返回一个在调用其中一个print方法时不会自动清除的java.io.PrintWriter对象。 在本章中,APP应用程序将修复此问题。 为了理解它是如何修复的,我们需要知道Writer是从什么来的。
在servlet中,你用打印机写字节。 可以使用任何编码,但这些字节将作为字节流发送到浏览器中。 因此,第2章中ex02.pyrmont.HttpResponse类的getWriter方法就不足为奇了。
公共打印机写入器获取写入器(
//if autoflush is true,println () will flush,
//but print () will not。
//theoutputargumentisanoutputstream
writer=new打印机(output,true );
返回写入器;
}您是如何构建PrintWriter对象的? 通过传递java.io.OutputStream实例实现的。 您传递给PrintWriter的任何print或println方法都将在下面的OutputStream中发送。
本章使用ex03.pyr mont.connector.response stream类的实例代替PrintWriter
输出流。 请注意,类ResponseStream是间接从类java.io.OutputStream传递的。
同样,您使用了继承给PrintWriter的类ex03.pyr mont.connector.response writer。
类ResponseWriter复盖所有print和println方法,这些方法的调用将自动清除输出直到结束
我要去输出流。 因此,我们将使用具有基础响应流对象的响应写入器实例。
可以通过传递ResponseStream对象实例来初始化类ResponseWriter。 但是,将java.io.OutputStreamWriter对象用作ResponseWriter对象和ResponseStream对象之间的桥梁。
OutputStreamWriter将写入的字符以特定的字符集编码为字节。 可以使用名称设置此字符集,可以显式指定该字符集,也可以使用平台接受的默认字符集。 对于每次write方法调用,都会将转换器调用编码为指定的字符。 生成的字节在写入较低的输出流之前存储在缓冲区中。 缓冲区的大小可以自己设置,但对于大多数场景,默认大小已足够。 请注意。 传递给write方法的字符没有缓冲。
因此,getWriter方法为:如下所示
publicprintwritergetwriter throwsioexception
响应sestreamnewstream=newresponsestream (this;
新流. set commit (false;
OutputStreamWriter osr=
newoutputstreamwriter (new stream,getCharacterEncoding ();
写入器=newresponsewriter (osr;
返回写入器;
}
静态资源处理器和servlet处理器类servlet处理器类似于第2章中的ex02.pyr mont.servlet处理器类。 每一个都只有一个方法。 是进程。 但是,ex03.pyr mont.connector.servlet processor的process方法与HttpRequest
HttpResponse而不是Requese和Response实例。 本章的process的方法签名如下所示。
公共语音处理(http请求,HttpResponse response ) {另外,在处理方法中,将http请求facade和HttpResponseFacade
请求和响应的facade类。 另外,正在呼叫
了servlet的service方法之后,它调用了类HttpResponse的finishResponse方法。 servlet = (Servlet) myClass.newInstance();
HttpRequestFacade requestPacade = new HttpRequestFacade(request);
HttpResponseFacade responseFacade = new HttpResponseFacade(response);
servlet.service(requestFacade, responseFacade);
((HttpResponse) response).finishResponse();
类StaticResourceProcessor几乎等同于类ex02.pyrmont.StaticResourceProcessor。
运行应用程序要在Windows上运行该应用程序,在工作目录下面敲入以下命令:
java -classpath ./lib/servlet.jar;./ ex03.pyrmont.startup.Bootstrap在Linux下,你使用一个冒号来分隔两个库:
java -classpath ./lib/servlet.jar:./ ex03.pyrmont.startup.Bootstrap要显示index.html,使用下面的URL:
http://localhost:808O/index.html要调用PrimitiveServlet,让浏览器指向下面的URL:
http://localhost:8080/servlet/PrimitiveServlet在你的浏览器中将会看到下面的内容:
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章中详 细讨论。