⊙ 서블릿에서 응답시 한글 처리
한글을 출력할 때 한글이 깨지지 않도록 하는 방법을 살펴본다.
먼저 콘텐트 타입에 인코딩을 지정하지 않고 한글을 출력해본다.
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만 나오는 것을 확인 할 수 있다.
'JSP' 카테고리의 다른 글
[JSP&Servlet] JSP와 HTML의 동작 차이 (0) | 2020.10.07 |
---|---|
[JSP&Servlet] 서블릿의 다양한 입력 양식 데이터 통신 (0) | 2020.10.01 |
[JSP&Servlet] 서블릿의 데이터 통신, 쿼리 스트링 (0) | 2020.10.01 |
[JSP&Servlet] 서블릿의 동작 원리, 서블릿의 라이프 사이클 (0) | 2020.10.01 |
[JSP] 서블릿 클래스의 구조 (0) | 2020.10.01 |