티스토리 뷰

반응형

전달할 내용이 많지 않을 경우에는 get요청을 사용할 수 있다.
하지만 내용이 많아질 경우에는 어떻게 해야 하나?

예를 들어서 피자가게에서 주문을 할 때 피자 라지 하나 주세요 정도는 get으로 할 수 있다.
그런데 피자 라지고요, 양파는 많이 주시고, 소스는 2배, 페퍼로니도 추가하고, 치즈는 3배로, 크러스트는 반은 고구마, 반은 치즈, 도우는 젤 얇은 걸로 해주시고,,, 누군가 이렇게 주문을 한다면? 서로 불편해진다.
센스 있는 직원이라면 form 줄테니까 여기 적어서 주세요~ 이렇게 할 거다. 이렇게 한 번에 form으로 받는 방법이 POST이다.

자 그러면 코드를 한번 만들어보자!

reg.html 파일 생성

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>
		<form action="notice-reg">
			<div>
				<label>제목:</label><input type="text" name="title">
			</div>
			<div>
				<label>내용:</label><textarea name="content"></textarea>
			</div>
			<div>
				<input type="submit" value="등록">
			</div>
		</form>
	</div>
</body>
</html>

Noticereg.java 파일 생성

package com.newlecture.web;

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("/notice-reg")
public class Noticereg extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		
		String title = request.getParameter("title");
		String content = request.getParameter("content");
		
		out.println(title);
		out.println(content);
		}
	
	}
	

reg.html 및 Noticereg.java 디렉터리

 reg.html에서 실행해야 한다.

자 잘되나 싶었는데 자세히 보면 문제가 있다. 바로 빨간색 박스 안에? title=Title&content=Content 이건 QueryString값이 모두 주소창에 입력되어 버린다.
만약에 받아오는 내용의 값이 너무 길거나 특수문자가 들어갈 경우에는 URL에서 받아올 수가 없다.
또한 만약에 여기에 아이디나 비밀번호를 입력하게 되면 보안상에 큰 문제가 된다.
이럴 때 사용하는 게 바로 POST 옵션이다!
자~ 자시 코드를 한번 봅시다.

reg.html 코드

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>
		<form action="notice-reg" method="post">
			<div>
				<label>제목:</label><input type="text" name="title">
			</div>
			<div>
				<label>내용:</label><textarea name="content"></textarea>
			</div>
			<div>
				<input type="submit" value="등록">
			</div>
		</form>
	</div>
</body>
</html>

뭐 거창한 게 아니라 form 태그 안에 mothd="post"만 추가해주면 된다.

reg.html 출력 화면

주소창을 보면 notice-reg로 이제 서블릿 주소 이름만 잘 출력된다!
그런데.... 다 잘되었나 싶었는데 이번에는 한글이 깨져버린다. 이건? 어떡하지??
출력이 문젠가????? 입력하면서 전달되는 게 문제인가???????
먼저 출력 간의 문제는 이전에 다 해결을 했었다! 그럼 이건 서버로의 전달의 문제가 확실합니다!
왜??? 문제가 발생하냐?
이유를 분석해보자!
숫자, 영어: 1byte / 한글: 2byte
그런데....... 톰캣의 기본 전달 Encoding방식: 1byte
그렇다 한글 2byte를 강제로 1byte로 잘라서 전달해버리면 당연히 깨져버린다.

POST전달 방식

해결방법 2가지
1. 톰캣 환경설정을 변경: URIEncoding = "UTF-8"
 -> 문제점: 다른 사이트들 모두 UTF-8로 변경되기 때문에 이렇게 사용은 거의 안 한다!
2. Servlet내의 코드 추가로 Encoding설정 변경
 -> Servlet내에 코드만 추가해주면 성공, 문제점? 번거롭다?

Noticereg.java 서블릿에 코드를 추가해주자!

package com.newlecture.web;

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("/notice-reg")
public class Noticereg extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		request.setCharacterEncoding("UTF-8");
		
		PrintWriter out = response.getWriter();
		
		String title = request.getParameter("title");
		String content = request.getParameter("content");
		
		out.println(title);
		out.println(content);
		}
	
	}
	

 

request.GetParameter 전에 request.setCharacterEncoding("UTF-8")코드를 추가해주면 된다.
이 서블릿을 이용 할 때에는 UTF-8로 하겠다는 말이다, 이제 다시 실행해보자!

Encoding방식 변경 후 출력

완벽하게 오류 없이 출력됨을 확인 할 수있다.
간단한 출력에도 여러가지 오류가 발생한다. 이유를 잘 살펴가면서 공부하자. 그래야 막힐때 해결 할 수있으니까!

반응형
댓글
공지사항