创建HttpResponse对象
HttpResponse类实现了javax.servlet.http.HttpServletResponse。跟随它的是一个叫做HttpResponseFacade的façade类。
在前面的例子中创建HttpResponse类中,getWriter方法返回了一个java.io.PrintWriter对象,但是当调用print方法后,这个对象并不会清空缓存,导致部分数据没有发送出去(清空缓存:缓存机制是当前缓存满了的时候,才会发送数据,所以当所有数据发送后,一定要执行flush)。接下来我要解决这个问题,首先,我们需要真正了解Writer是一个怎样的类:
在一个servlet类内,你可能使用PrintWriter来传输字符,你可以使用任何的编码方式,字符会以字节流传输到你的浏览器。所以之前的HttpResponse类中的getWriter方法如下:
public PrintWriter getWriter() {
// autoflush is true, println() will flush,
// but print() will not.
writer = new PrintWriter(output, true); // output is an OutputStream
return writer;
}
通过java.io.OutputStream可以构建一个PrintWriter实例,任何使用print和println方法传输的字符都会被PrintWriter转换成字节流以java.io.OutputStream传输出去。
改进的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;
}
ex03.pyrmont.connector.ResponseStream类作为OutputStream类为参数传递给PrintWriter,用来构建PrintWriter类。ResponseStream是继承于java.io.OutputStream类的。
同样,使用了一个继承自PrintWriter的ex03.pyrmont.connector.ResponseWriter类来代替PrintWriter,ResponseWriter中重写了所有print和println方法,使得任何对这些方法的调用都会自动flush输出到OutputStream上面。
因此,我们使用的是一个带底层ResponseStream的ResponseWriter对象,你可以使用一个ResponseStream参数来实例化ResponseWriter对象。这里我们使用java.io.OutputStreamWriter作为这两个类之间的桥梁。
支行程序:
http://localhost:8080/servlet/ModernServlet?userName=tarzan&password=pwd