강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

Servlet 한글출력

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.gif title19.gif

 

kenu
2001-11-20 6:51오전


일반적으로 사용하는 servlet 에서의 한글 처리법을 살펴보도록 하겠습니다. 강의 실행환경은 Tomcat 4.0.1 standalone입니다.


서블릿 소스는 다음과 같습니다. 영문만 있다면 인코딩이 필요가 없겠죠. 파일의 위치는 c: omcat4webappsROOTWEB-INFclasses 에 소스를 놨습니다. package 가 선언되어있기 때문에 그 디렉토리 안에 놓아도 괜찮습니다.

OkServlet.java
package kr.pe.okjsp;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class OkServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, 
                HttpServletResponse response) 
                throws ServletException, IOException {
                
                response.setContentType("text/html");
                PrintWriter out = response.getWriter();
                
                out.println("Ok, Servlet");
        }
}



커맨드프롬프트 창에서 확인해 본 환경은 다음과 같습니다. classpath 를 잡아주지 않았고, path 에만 jdk1.3/bin 이 잡혀있습니다. Servlet 을 컴파일하는데 필요한 servlet.jar 파일은 jdk1.3/jre/lib/ext 에 복사해 놓은 상태입니다. resin2 의 경우 lib 에 있는 jsdk23.jar 파일을 복사해 놓으면 됩니다.
servlet02_01.gif


파일을 컴파일하는 법은 "package 선언된 java 컴파일" 강좌를 참고하시면 됩니다. 여기서는 조금 다르게 컴파일 해보도록 하겠습니다. 현재 위치에서 -d . 옵션을 사용하면 현재 디렉토리 아래로 package 에 선언된 디렉토리가 생성되면서 class 파일이 그 안에 생기게 됩니다. kr/pe/okjsp 디렉토리 안에 컴파일된 OkServlet.class 파일이 생성됩니다.
servlet02_02.gif


브라우저에서는 다음과 같이 확인할 수 있습니다. http://localhost:8080/servlet/kr.pe.okjsp.OkServlet 이 때 주의해야할 것은 디렉토리는 . 으로 구분된다는 것과 대소문자를 정확히 맞춰줘야 한다는 것입니다.
servlet02_03.gif


이제 소스를 바꿔서 한글을 집어넣어 보겠습니다. 최재웅 님께서 알려주신 방법입니다. (최재웅님 감사드립니다.) 서블릿은 현재 제 세팅상태에서는 reloading 이 안되기 때문에 Tomcat 을 재시동해야 변경된 사항을 볼 수 있습니다. 아래 오래 전의 방법과 비교해 보시죠.

OkServlet.java
package kr.pe.okjsp;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class OkServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, 
                HttpServletResponse response) 
                throws ServletException, IOException {
                
/* response.getWriter() 를 호출하기 전에 response에 캐릭터셋을 세팅합니다. */ 
response.setContentType("text/html; charset=euc-kr"); 
 
/* PrintWriter 인스턴스를 생성해 받아옵니다. */ 
PrintWriter pw = response.getWriter(); 
 
/* PrintWriter 인스턴스로 한글을 뿌려봅니다. */ 
pw.print("최재웅"); 
 
        }
}



구식 방법을 소개합니다. 위 방법이나 jsp 에서처럼 쉽지는 않습니다.(^^; JSP 이것도 힘드셨죠. 한글... 쉬운게 없나요?...) PrintWriter out = response.getWriter(); 이 바뀌게 됩니다. PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "KSC5601")); 처럼 선언을 해줍니다. 이에 관해서는 지금 설명을 드리기 힘듭니다. 또한 한글처리하는 법이 이것 외에도 몇가지 더 있는 것으로 알고 있습니다. 그때마다 강좌에 추가를 하도록 하죠. 서블릿은 현재 제 세팅상태에서는 reloading 이 안되기 때문에 Tomcat 을 재시동해야 변경된 사항을 볼 수 있습니다.

OkServlet.java
package kr.pe.okjsp;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class OkServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, 
                HttpServletResponse response) 
                throws ServletException, IOException {
                
                response.setContentType("text/html;charset=euc-kr");
                PrintWriter out = new PrintWriter(new 
                        OutputStreamWriter(response.getOutputStream(), "KSC5601"));
                
                out.println("Ok, Servlet");
                out.println("<br>서블릿은 JSP보다 조금 어렵습니다.");
                out.close();
        }
}


servlet02_04.gif


책의 내용을 빌자면, PrintWriter 는 2바이트 단위로 스트림을 생성하고 ServletOutputStream 은 1바이트 단위 스트림을 생성합니다. 한글은 2바이트 단위로 구성되어 있기 때문에 1바이트 단위 스트림인 ServletOutputStream 을 사용하게 된다면 한글이 깨지게 됩니다. (자바 서블릿 프로그래밍 21일 완성, 윤지수 저, 삼각형 프레스, 98.12.15, 115page )(98년에도 서블릿은 있었습니다. 놀랍죠? 헐~)


한 가지 주의깊게 볼 것은 out.close(); 입니다. 이것도 같은 책의 설명을 빌자면, "이 부분은 출력하기 위한 스트림을 닫는 부분으로 만약 스트림을 닫지 않으면 브라우저에서는 document no data 라는 에러 메시지를 출력한다. 이유는 content-length 를 지정하지 않았기 때문에 브라우저에서는 정확한 메시지의 길이를 인식하지 못하였을 뿐만 아니라 출력 스트림을 닫지 않으면 브라우저쪽에서는 연결을 끊어 버리고 메시지를 옳게 받아들이지 않았음을 표시하는 에러를 출력하게 되는 것이다."...(자바 서블릿 프로그래밍 21일 완성, 윤지수 저, 삼각형 프레스, 98.12.15, 116page ) ^^; 책이 좋군요.


갈 수록 딸리는 실력, 책이나 많이 봐야겠습니다. 좋은 하루 되세요.


관련 사이트


http://okjsp.pe.kr

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,043 명
  • 현재 강좌수 :  35,850 개
  • 현재 접속자 :  127 명