jsp 회전 html 정적화(二)HttpServlet ResponseWrapper를 계승하여 자신의response 포장을 실현

6682 단어 response
HttpServlet ResponseWrapper는response 대상의 후처리를 실현하는 데 도움을 줍니다. HttpServlet ResponseWrapper의 하위 클래스를 작성하고 자신의 기능 구현 (수식기 모드) 을 추가하기만 하면 됩니다.그렇다면 하위 클래스화 HttpServlet ResponseWrapper는 그 방법을 다시 써야 하나요?1、response 대상을 가져오고 출력을 사용자 정의 흐름에 저장합니다.출력 흐름 (outputStream, writer) 에 대한 작업은 다시 써야 합니다. 1) 흐르는 방식으로 출력을 가져오고, get OutputStream () 2 를 다시 쓰고, 문자로 출력을 가져오고, getWriter () 3 새로 고침 흐름 - 다시 쓰기flush Buffer () 4) 를 리셋하고, 다시 쓰기reset () 를 추가한 출력 데이터를 가져오는 방법을 추가하면 ok입니다.
2. response 패키지 정의 Wappered Response 상속 Http Servlet Response Wrapper
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);

        }

    }

}

 
그러면 서브렛 용기가 get Output Stream () 방법을 호출하여 얻은 출력 흐름은 우리가 정의한 포장 흐름입니다. Wappered Output Stream.3、이제 필터에서 Wappered Response를 사용하여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();

    }

좋은 웹페이지 즐겨찾기