⊙ 서블릿에서 응답시 한글 처리

 

한글을 출력할 때 한글이 깨지지 않도록 하는 방법을 살펴본다.

 

먼저 콘텐트 타입에 인코딩을 지정하지 않고 한글을 출력해본다.

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;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out=response.getWriter();
		out.print("<html><body><h1>");
		out.print("Hello Servlet");
		out.print(" 헬로우 서블릿");
		out.print("</h1></body></html>");
		out.close();
	}
}

실행 결과 한글이 깨지는것을 볼 수 있다.

 

브라우저에 응답하는 페이지에 대해서 한글을 출력할 경우 한글이 깨지지 않도록 하기 위해HttpServletResponse 객체로 setContentType()을 호출하여 응답 방식을 결정해 주면서 보여 주고자 하는 코드셋을 UTF-8로 지정해 준다.

response.setContentType("text/html; charset=UTF-8");

⊙ 서블릿에서 요청시 한글 처리

 

한글을 입력할 경우 한글이 깨지는 것을 처리하는 방법을 살펴본다.

 

예제를 위한 JSP 코드이다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3> get 방식에서 한글 깨짐 방지 </h3>
	<form method="get" action="InfoServlet">
		이름 : <input type="text" name="name"><br>
		주소 : <input type="text" name="addr"><br>
		<input type="submit" value="전송" >
	</form>
	<br>
	<h3> post 방식에서 한글 깨짐 방지 </h3>
	<form method="post" action="InfoServlet">
		이름 : <input type="text" name="name"><br>
		주소 : <input type="text" name="addr"><br>
		<input type="submit" value="전송" >
	</form>
</body>
</html>

예제를 위한 Servlet 코드이다.

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;

@WebServlet("/InfoServlet")
public class InfoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		String name = request.getParameter("name");
		String addr = request.getParameter("addr");
		
		PrintWriter out = response.getWriter();
		out.print("<html><body>");
		out.println("당신이 입력한 정보입니다.<br>");
		out.println("이름 : ");
		out.println(name);
		out.println("<br> 주소 : ");
		out.println(addr);
		
		out.println("<br><a href='javascript:history.go(-1)'>다시</a>");
		out.print("</body></html>");
		out.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}
}

 

만약 입력 받은 값이 깨지는 경우 한글 처리를 위해 서버 설정 파일인 server.xml 파일에서 <Connector> 태그를 찾아서 URIEncoding 속성에서 URIEncoding="UTF-8"를 추가 해야 한다.

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8181" protocol="HTTP/1.1" redirectPort="8443"/>

 

하지만 post 방식으로 데이터를 전송하는 경우 server.xml 파일의 환경 설정을 바꾸어 주어도 한글 데이터의 입력 처리가 제대로 되지 않아 깨지는 현상이 발생할 수 있다.

브라우저에서 웹 서버로 파라미터가 post 방식으로 넘어오는 페이지인 경우 doPost() 메소드 안에서 한글 데이터를 올바르게 가져오려면 첫번째 파라미터인 HttpServletRequest 타입으로 선언된 요청 객체(request)로 setCharacterEncoding() 메소드를 호출해서 문자의 인코딩 방식을 UTF-8로 지정해야 한다.

request.setCharacterEncoding("UTF-8");

위 코드에서 주석 처리된 부분을 해제하면 정상적으로 한글이 깨지지 않는다.

 

추가적으로 doGet() 와 doPost()의 URL 차이를 확인해보자.

 

doGet() 메소드로 서블릿의 데이터 통신을 하면 URL과 쿼리 스트링이 함께 나오는 것을 확인 할 수 있다.

반면 doPost() 메소드로 서블릿의 데이터 통신을 하면 URL만 나오는 것을 확인 할 수 있다.

+ Recent posts