프로그래밍/JSP Servlet

JSP/Servlet – 응답 메시지의 본체 내용을 변형하는 래퍼 클래스 만들기

가카리 2016. 4. 7. 22:10
반응형

 

JSP/Servlet – 응답 메시지의 본체 내용을 변형하는 래퍼 클래스 만들기

 


2016/04/04 - [프로그래밍/JSP/Servlet] - JSP/Servlet – 응답 래퍼 클래스를 작성하는 방법  참고



HTTP 응답 메시지의 내용을 변형하는 방법입니다. 약간 복잡하기는 하지만

 

래퍼 클래스 필터 클래스 순으로 코드를 보면 이해가 되실 겁니다.


핵심은 StringWriter 클래스인데 다른 Writer클래스와는 달리 파일이나 브라우저에 출력하는 것이 아닌


객체 내부에 버퍼로 출력하는 것을 알아야합니다. 즉 버퍼에 먼저 데이터를 저장 후 버퍼의 값을 바꾼 다음에


화면에 출력하는 순서가 되겠습니다.

 

 

 

위와 같이 필터 클래스, 래퍼 클래스, 그리고 테스트 JSP 파일을 구성합니다.

 

ContentWordReplaceResponseWrapper.java

 

package myfilter;

 

import java.io.IOException;

import java.io.PrintWriter;

import java.io.StringWriter;

 

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

 

public class ContentWordReplaceResponseWrapper extends HttpServletResponseWrapper{

    HttpServletResponse response;

    PrintWriter newWriter;

    StringWriter strWriter;

    

    public ContentWordReplaceResponseWrapper(HttpServletResponse response) {

        super(response);

        this.response = response;

    }

    

    public PrintWriter getWriter() throws IOException{

        if(newWriter == null){

            strWriter = new StringWriter();

            newWriter = new PrintWriter(strWriter);

        }

        return newWriter;

    }

    

    public void modifyAndSend() throws IOException{

        String content = strWriter.toString();//버퍼에 있는 데이터를 가져옴

        String newContent = content.replaceAll("GaKaRi", "가카리");//값을 바꿈

        PrintWriter writer = response.getWriter();//변형된 값을 웹브라우저로 전송하기 위해.

        writer.print(newContent);//여기서 웹브라우저에 전송함

    }

 

}

 

ContentWordReplaceFilter.java

 

package myfilter;

 

import java.io.IOException;

 

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletResponse;

 

public class ContentWordReplaceFilter implements Filter{

    

    @Override

    public void init(FilterConfig arg0) throws ServletException {

        // TODO Auto-generated method stub

        

    }

    

    @Override

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        // TODO Auto-generated method stub

        ContentWordReplaceResponseWrapper responseWrapper =

                new ContentWordReplaceResponseWrapper((HttpServletResponse) response);

        chain.doFilter(request, responseWrapper);

        //필터가 끝난 뒤에 아래 메소드를 실행해야 StringWriter 객체의

        //내부 버퍼에 값들이 저장됩니다.

        responseWrapper.modifyAndSend();

    }

 

    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        

    }

 

}

 

web.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

<display-name>ch11_jsp_wrapper3</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

<filter>

<filter-name>word-replace-filter</filter-name>

<filter-class>myfilter.ContentWordReplaceFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>word-replace-filter</filter-name>

<url-pattern>*</url-pattern>

</filter-mapping>

</web-app>

 

test.jsp

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

    GaKaRi 님이 입장하셨습니다. <BR>

</body>

</html>

 

실행 화면

원래 GaKaRi였는데 가카리로 변했음을 알 수 있습니다.

반응형