전달 받은 페이지에서 한글 처리하기 위해서는 매번 페이지마다 한글처리를 해야 하지만, 필터 하나를 이용해 한글처리 기능을 일괄적으로 적용할 수 있습니다.
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. 실행결과