JSP/서블릿 흝어 보기

한글처리 필터

전달 받은 페이지에서 한글 처리하기 위해서는 매번 페이지마다 한글처리를 해야 하지만, 필터 하나를 이용해 한글처리 기능을 일괄적으로 적용할 수 있습니다. 

init( ) 메소드의 인자값으로 전달되는 filterConfig 객체를 이용해 필터에 대한 정보값(초기값)을 추출할 수 있는데 이 초기값에 문자코드를 저장하고 한글처리 필터를 작성하면서 이 정보를 추출하여 인코딩에 적용해 볼 것이다.

여기서 한글처리 필터를 적용할 필터는 '필터 구현하기' 토픽에서 작성한 'flow2' 필터이다. 그러므로 아래의 초기값을 설정하는 방법으로 애노테이션에 작성하는 방법을 이용한다.

1. 초기값 설정

web.xml를 이용해 필터를 등록한 경우 아래처럼 init-param으로 초기값을 정할 수 있다.

  <filter>
      <filter-name>flow2</filter-name>
        <filter-class>job.study.web.FlowFilterTwo</filter-class>
  	  <init-param>
  		<param-name>enc</param-name>
  		<param-value>UTF-8</param-value>
      </init-param>
  </filter>

@WebFilter 애노테이션을 이용해 필터를 등록한 경우에는 다음과 같이 지정할 수 있다. 

/**
 * Servlet Filter implementation class FlowFilterTwo
 */
@WebFilter(
	filterName="flow2",
	initParams= {
		@WebInitParam(name="enc", value="UTF-8")
	})
public class FlowFilterTwo implements Filter {
   	.... 생략 ....

}

2. 초기값 추출와 적용

package job.study.web;

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.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

/**
 * Servlet Filter implementation class FlowFilterTwo
 */
@WebFilter(
    	filterName="flow2",
		initParams= {
			@WebInitParam(name="enc", value="UTF-8")
		})
public class FlowFilterTwo implements Filter {

	String charset;
    /**
     * Default constructor. 
     */
    public FlowFilterTwo() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub

		// 인코딩 초기 값을 추출하여 멤버변수인 charset에 저장한다.
		charset = fConfig.getInitParameter("enc");
		System.out.println("init() 호출 ......... two");
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		
		//초기값을 추출하여 멤버 변수인 charst에 저장한 값으로 문자코드를 설정한다.  		
		request.setCharacterEncoding(charset);
		System.out.println(charset);
		System.out.println("doFilter() 호출  전 ......... two");
		// pass the request along the filter chain
		chain.doFilter(request, response);
		System.out.println("doFilter() 호출  후 ......... two");
	}

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destory () 호출 ......... two");
	}

}

3. 입력페이지 작성

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
Hello World!
<form method="post" action="encFilter">
    <input type="text" name="myName">
	<input type="submit" value="인사하기">
</form>
</body>
</html>

4. 출력을 담당하는 서블릿 작성

package job.study.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class EncFilterServlet
 */
@WebServlet("/encFilter")
public class EncFilterServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public EncFilterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print(request.getParameter("myName"));
		out.close();
	}

}

5. 실행결과

댓글

댓글 본문
작성자
비밀번호
버전 관리
DongHyun Kim
현재 버전
선택 버전
graphittie 자세히 보기