Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 363|回复: 0

[servlet学习]如何子类化HttpServletResponseWrapper

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-10 04:59:05 | 显示全部楼层 |阅读模式
    HttpServletResponseWrapper为我们实现对response对象的后处理提供了帮助――你只需编写一个HttpServletResponseWrapper的子类,加入自己的功能实现(修饰器模式)。那么子类化HttpServletResponseWrapper都需要重写那些方法呢?

    1、获取response对象,并将输出存放在自定义的流里面,那么关于输出流(outputStream、writer)的操作都是需要重写的了:
        1)以流的方式获取输出――重写getOutputStream()
        2)以字符方式获取输出――重写getWriter()
        3)刷新流――重写flushBuffer()
        4)重置流――重写reset()
    然后加入新增的获取输出数据的方法就ok了。  2、定义response包装器WapperedResponse继承HttpServletResponseWrapper  
      
       
       
         
       

         
       
      
    public class WapperedResponse extends HttpServletResponseWrapper {
            private ByteArrayOutputStream buffer=null;
            private ServletOutputStream out=null;
            private PrintWriter writer=null;
           
            public WapperedResponse(HttpServletResponse resp) throws IOException{
                    super(resp);
                    buffer=new ByteArrayOutputStream();//真正存储数据的流
                    out=new WapperedOutputStream(buffer);
                    writer=new PrintWriter(new OutputStreamWriter(buffer,this.getCharacterEncoding()));
            }
            //重载父类获取outputstream的方法
            @Override
            public ServletOutputStream getOutputStream()throws IOException{
                    return out;
            }
            //重载父类获取writer的方法
            @Override
            public PrintWriter getWriter() throws UnsupportedEncodingException{
                    return writer;
            }
            //重载父类获取flushBuffer的方法
            @Override
            public void flushBuffer()throws IOException{
                    if(out!=null){
                            out.flush();
                    }
                    if(writer!=null){
                            writer.flush();
                    }
            }
            @Override
            public void reset(){
                    buffer.reset();
            }
            public byte[] getResponseData()throws IOException{
                    flushBuffer();//将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据
                    return buffer.toByteArray();
            }
           
            //内部类,对ServletOutputStream进行包装
            private class WapperedOutputStream extends ServletOutputStream{
                    private ByteArrayOutputStream bos=null;
                    public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException{
                            bos=stream;
                    }
                    @Override
                    public void write(int b) throws IOException{
                            bos.write(b);
                    }
            }
    }
    [/code]
    那么Servlet容器通过调用getOutputStream()方法获得的输出流将是我们自定义的包装流WapperedOutputStream。

    3、现在就可以在过滤器中使用WapperedResponse进行对response包装、处理了。
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
                            FilterChain arg2) throws IOException, ServletException {
                    HttpServletResponse resp=(HttpServletResponse)arg1;
                    WapperedResponse wapper=new WapperedResponse(resp);
                    arg2.doFilter(arg0, wapper);
                    byte[] b1=wapper.getResponseData();
                    //do something with b1 here
                    byte[] b2=...;
                    //输出处理后的数据
                    ServletOutputStream output=arg1.getOutputStream();
                    output.write(b2);
                    output.flush();
            }
    [/code]

      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-22 20:02 , Processed in 0.324501 second(s), 38 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表