해당 실습은 한글 인코딩과 html에 적용될 한글 인코딩에 대한 실습이다.
기존의 경우를 살펴보자필터를 적용하지 않을 때의 결과
아래의 입력창에 한글을 입력하여 보낼 경우
아래와 같은 결과를 받을 수 있다.
문제 해결 방법(서블릿 이용)
해당 문제는 서블릿에 인코딩에 관한 코드를 집어 넣으면 해결할 수 있다.
@WebServlet("/first") public class FirstServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html; charset=utf-8"); String name = req.getParameter("name"); String age = req.getParameter("age"); String sex = req.getParameter("sex"); String[] hobby = req.getParameterValues("hobby"); ServletDto dto = new ServletDto(name,age,sex,hobby); req.setAttribute("person", dto);// 데이터 저장(데이터 이동시 사용)(데이터는 object로 저장) RequestDispatcher rd = req.getRequestDispatcher("second"); rd.forward(req, resp); } }
위 코드를 간단히 살펴보면, 서블릿을 등록하기 위해 @WebServlet을 이용하였으며, get메서드에 대한 처리를 위해 doGet메서드를 오버라이드 하였다.
그 메서드 안에
req.setCharacterEncoding("UTF-8");
(한글인코딩)
resp.setContentType("text/html; charset=utf-8");
(html에 적용할 한글인코딩)
을 넣어 한글 인코딩에 대한 문제를 해결할 수 있다.
아래는 결과이다.
문제점
서블릿을 사용할 경우 모든 서블릿에 대해 해당 코드(인코딩에 관련된)를 집어넣어야 한다는 문제가 발생한다.
이를 해결하기 위해서 필터를 만들어 문제를 해결해보자문제 해결 방법(필터)
필터를 사용할 경우 각 서블릿에 대한 코드를 작성하지 않아도 된다.
@WebFilter("/*") public class FirstFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { Filter.super.init(filterConfig); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=utf-8"); chain.doFilter(request, response); } }
위 코드는 필터 클래스를 작성한 코드로, web.xml을 사용하지 않고 @WebFilter를 사용하여 필터를 등록한 코드이다.
필터도 서블릿와 비슷하게 init(),dofilter(),destory()메서드를 오버라이드 하여 사용할 수 있다.
위의 FirstFilter의 경우 모든 url에 대한 요청,응답의 인코딩을 해주는 필터이다.