孩子不是海子 2017-03-14 13:13 采纳率: 0%
浏览 572

JSP中·HttpResponseWrapper那点事

在网上找了一些实现取得response返回流进行修改的例子,也试验成功了,但是有个地方还有些疑惑,重写了HttpServletResponseWrapper(WrapperResponse)中的PrintWriter(现在叫WrapperWriter)后,然后在自己的WrapperResponse想获取重写后的WrapperWriter返回的ServletOutputStream时用的是ByteArrayOutputStream bout;来接收返回的outputstream可是我在myWriter.flush()(实例化后的WrapperWriter myWriter,且有myWriter=new WrapperWriter(bout))无法在WrapperResponse中通过bout直接获得返回流,而必须通过在WrapperWriter中重写getOutputStream()来获取返回流,疑惑也就出现在这,明明已经通过myWriter.flush();来将返回流刷到bout了(我认为myWriter=new WrapperWriter(bout)这一句做到了)为什么要通过我上面说的方法来获取呢?如果有兴趣可以看下下面代码
public class ResponseWrapper extends HttpServletResponseWrapper{
private ByteArrayOutputStream bout=null;
private WrapperOutputStream myOut=null;
private WrapperWriter pw=null;
public ResponseWrapper(HttpServletResponse response) {
super(response);
bout=new ByteArrayOutputStream();
myOut=new WrapperOutputStream(bout);
pw=new WrapperWriter(bout);
}

public ServletOutputStream getOutputStream(){
    return myOut;
}
class WrapperOutputStream extends ServletOutputStream{
    private ByteArrayOutputStream baout=null;
     public WrapperOutputStream(ByteArrayOutputStream baout){
         this.baout=baout;
     }
    @Override
    public void write(int b) throws IOException {
        baout.write(b);

    }
    public ByteArrayOutputStream getByteArrayOutputStream(){
        return this.baout;
    }
}
class WrapperWriter extends PrintWriter{
     private ByteArrayOutputStream out=null;
    public WrapperWriter(ByteArrayOutputStream out) {
        super(out);
        this.out=out;
    }
    public ByteArrayOutputStream getByteArrayOutputStream(){
        return this.out;
    }

}
public String getData(){
    String a = null;
    /*if(pw!=null){
        pw.flush();
        try {
            a=pw.getByteArrayOutputStream().toString("utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    else if(myOut!=null){*/
        try {
            myOut.flush();
        } catch (IOException e) {
            System.out.println("出错了这儿!");
            e.printStackTrace();
        }
        try {
            a=myOut.getByteArrayOutputStream().toString("utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    //}
    return a;
}
public PrintWriter getWriter(){
    return this.pw;
}

}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-05 14:16
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的代码中,你尝试使用myWriter.flush()方法来刷新ByteArrayOutputStream对象bout。这个操作是有效的,并且应该能够使WrapperWriter类的getByteArrayOutputStream()方法返回一个字节输出流。

    然而,当你试图从WrapperWriter类中获取一个ByteArrayOutputStream对象并调用其toString()方法时,Java编译器会抛出一个异常,因为ByteArrayOutputStream是一个私有的内部类,不能被外部类访问。因此,你需要显式地创建一个新的ByteArrayOutputStream对象,然后再调用其toString()方法。

    以下是修改后的代码:

    public class ResponseWrapper extends HttpServletResponseWrapper {
    
      private ByteArrayOutputStream bout = new ByteArrayOutputStream();
      private WrapperOutputStream myOut = new WrapperOutputStream(bout);
      private WrapperWriter pw = new WrapperWriter(bout);
    
      public ResponseWrapper(HttpServletResponse response) {
        super(response);
        bout = new ByteArrayOutputStream();
        myOut = new WrapperOutputStream(bout);
        pw = new WrapperWriter(bout);
      }
    
      @Override
      public ServletOutputStream getOutputStream() {
        return myOut;
      }
    
      public String getData() {
        String data = null;
        try {
          if (pw != null) {
            pw.flush();
            data = pw.getByteArrayOutputStream().toString("utf-8");
          } else if (myOut != null) {
            myOut.flush();
            data = myOut.getByteArrayOutputStream().toString("utf-8");
          }
        } catch (UnsupportedEncodingException e) {
          // Handle the exception here.
        }
        return data;
      }
    
      public PrintWriter getWriter() {
        return pw;
      }
    }
    

    在这个版本的代码中,我们首先创建了一个新的ByteArrayOutputStream对象bout,然后创建了一个新的WrapperOutputStreamWrapperWriter实例。这样,我们就可以安全地使用它们并避免编译时的错误。

    评论

报告相同问题?