《How tomcat works》读书笔记_连接器(3)_Respones

创建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

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值