이전 포스트 까지는 servlet이 어떻게 돌아가는가를 살펴보았는데

정리하자면…


servlet - 기본적인 동작 방식

webserver (tomcat) 앞쪽에 컨테이너 (서블릿 컨테이너, jsp 컨테이너) 가 서블릿을 로딩

-> 사용자의 요청을 받아 request, response 객체를 만들어냄

-> service 메소드에 인자값을 넘겨주고

-> http 전송방식에 따라 doGet, doPost ...... 등의 메소드가 실행된다.



< get 방식의 한글 처리>


한글처리를 할때.... 요청과 응답 두과정 모두에서 한글처리를 해주어야한다.

web.xml 에서 만들 서블릿에대한 정의를 해준다.


사용자 삽입 이미지


그리고 HanServlet 을 만들어준다.


사용자 삽입 이미지


사용자 삽입 이미지


package han;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HanServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		PrintWriter pw =  response.getWriter();
		pw.write("name");
	}
}

web.xml 에서 /han/* 이라고 했다.

http://localhost:8080/wps/han/a?name=가나다

이런식으로 * 대신 아무 문자나 쓰고 ?name=XXX 라고 쳐보자.

? 는 파라메터 값이 나옴을 의미하는데 클라이언트에서 서버로 넘겨주는 값(문자열)을 의미한다.

(클라이언트에서 서버쪽으로 데이터를 넘기는 방식중 get 방식이다.)

클라이언트에서 요청을 했는데 파라메터값 - name=XXX - 이 같이 넘어왔다.

그럼 servlet 에서는 그 값을 받아서 처리를 해준다.

요청이니까...  request.getParameter("name");

넘어온 값을 String 형의 name 이라는 변수에 넣어준다.

String name = request.getParameter("name");

String name 을 화면에 뿌려주기위해서

PrintWriter pw =  response.getWriter();

pw.write(name);

요렇게 해준다.


그럼 일단 브라우져에서 한글이 나오기는 하지만

콘솔창에서 깨져나옴을 알 수 있다. (물론 영어는 양쪽다 잘 나온다.)


사용자 삽입 이미지


사용자 삽입 이미지


기본적으로 웹 환경은 문자를 무조건 iso-8859-1 이라는 케릭셋으로 인코딩해서 전송한다.

우리가 보낸것은 한글이므로 저것을 받아서 재처리를 해주어야한다.

iso-8859-1 -> euc-kr

첫번째로 String name 으로 받은 iso-8859-1 로 전송된 넘어온 파라메터 값을

byte 단위로 쪼갠다.

byte[] b = name.getBytes("iso-8859-1");

쪼개어 배열 b 에 저장된 데이터를 euc-kr 로 재조합하여 변수 name 에 넣는다.

name = new String(b, "euc-kr");

즉, iso-8859-1 로 쪼개진 바이트 배열을 euc-kr 로 재조합한것임


package han;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HanServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		
		byte[] b = name.getBytes("iso-8859-1");
		name = new String(b, "euc-kr");
		
		PrintWriter pw =  response.getWriter();
		pw.write(name);
		System.out.println("#파라메터 값은 "+name);		
	}
}

여기까지가 get 방식의 request(요청) 에대한 한글처리이다.

실행을 해보면...


사용자 삽입 이미지

사용자 삽입 이미지


콘솔창에는 한글이 잘나온다.

그렇지만 response (응답) 에대한 한글처리 하지 않았기때문에

브라우저에서는 깨진 내용이 나오게 된다.

response.setCharacterEncoding("euc-kr");

라고 해주면 응답에 대한 한글처리가 된것이다.


package han;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HanServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		
		byte[] b = name.getBytes("iso-8859-1");
		name = new String(b, "euc-kr");
		
		response.setCharacterEncoding("euc-kr");
		
		PrintWriter pw =  response.getWriter();
		pw.write(name);
		System.out.println("#파라메터 값은 "+name);
	}
}

이상태에서 실행해보면....


사용자 삽입 이미지

사용자 삽입 이미지


그렇지만 브라우저의 문자인코딩 옵션이 한글로 되어있을때는

이렇게 잘 나오지만 다른 언어로 잡혀있다면 한글이 제대로 나오지 않는다.


사용자 삽입 이미지

사용자 삽입 이미지


웹브라우저가 자동으로 인식하도록 하기 위해서 한줄을 추가 하여준다.

response.setContentType("text/html; charset=euc-kr");

내용물의 형식을 알려주는것으로...

text의 html 이고.... charset 은 euc-kr 이라고 웹 브라우저에게 알려주는 구문이다.


package han;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HanServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		
		byte[] b = name.getBytes("iso-8859-1");
		name = new String(b, "euc-kr");
		
		response.setCharacterEncoding("euc-kr");
		response.setContentType("text/html; charset=euc-kr");
		
		PrintWriter pw =  response.getWriter();
		pw.write(name);
		System.out.println("#파라메터 값은 "+name);
	}
}

실행시켜보면... 콘솔창, 브라우져 모두 한글이 잘 나옴을 알 수 있으며,

인코딩옵션을 보면 한글로 자동으로 바뀌어 있음을 알 수 있다.

05 2, 2009 05:05 05 2, 2009 05:05
iamback 이 작성.

Trackback URL : http://pippen80.cafe24.com/trackback/160

Trackback RSS : http://pippen80.cafe24.com/rss/trackback/160

Trackback ATOM : http://pippen80.cafe24.com/atom/trackback/160


« Prev : 1 : ... 116 : 117 : 118 : 119 : 120 : 121 : 122 : 123 : 124 : ... 251 : Next »