파게로그

POST 요청 본문

콤퓨타 왕기초/JSP

POST 요청

파게 2020. 12. 9. 22:04

입력할 값이 많은 경우에는 POST 요청을 이용한다.

 

reg.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"><title>공지사항 등록</title>
</head>

<body>
	<h3>공지사항 등록</h3><br>
	<div>
	
		<form action="notice-reg"> <!--servlet mapping url-->
			<div>
				<label>제목 : </label>
				<input name="title" type="text"/>
			</div>
			<div>
				<label>내용 : </label>
				<textarea name="content"></textarea>
			</div>
			<div>
				<input type="submit" value="등록" />
			</div>
		</form>
		
	</div>
</body>

</html>

 

NoticeReg.java

package com.ddoongi.web;

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

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet {
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		
		// 출력 형식과 문서 형식
		res.setCharacterEncoding("UTF-8");
		res.setContentType("text/html; charset=UTF-8");
		
		// PrintWriter 생성
		PrintWriter out = res.getWriter();
		
		// Business Logic
		String title = req.getParameter("title");
		String content = req.getParameter("content");
		
		out.println(title);
		out.println(content);		
	}
}

 

이렇게 하면 query string으로 모든 값이 넘어오기에 URL에 사용될 수 없는 문자가 포함되어 있다거나, URL의 최대 길이 제한을 넘는다거나 하면 문제가 발생한다(URL에 값이 나타나지 않도록 하기 위한 보안 차원의 이야기라는 말도 있으나, 별다른 처리가 없는 한 브라우저를 통해 전달되는 내용을 쉽게 확인할 수 있다). query string이 왜 있는지 생각해보더라도, 이는 옵션 값의 용도로 사용하는 것이지, GET으로는 이렇게 장문의 내용을 모두 보내면 안 된다.

HTML은 마크업 언어이고, 존재하는 속성은 모두 네트워크를 통해 전달된다. 실제로 개발자 도구를 통해 Network 항목을 확인해 보면 form data에 x=10&y=20&operator=%EB%... 이런 식으로 또는 num=1&num=2&num=3&... 이런 식으로 데이터가 전달되고 있는 것을 확인할 수 있다(후자는 아래 마지막에 설명할 getParameterValues()를 이용한 경우).

 

 

HTML의 <input>을 통해 호출할 때에는 간단하게 <form action="notice-reg" method="post">를 추가하여 URL이 아니라 request body 안에 내용을 붙여서 보낼 수 있도록 한다(결과는 개발자 도구 > Network > Headers > Form Data에서 확인할 수 있다).

 

다만 여기서 한글은 깨져서 출력된다. 이는 다음과 같은 POST 과정에서의 문제에 기인한다.

 

multibyte문자인 UTF-8로 입력받음

POST(URL Encoding: title=%ED%99...&content=E3%85%...)

톰캣은 기본적으로 문자를 ISO-8859-1로 인식하기에 1byte씩 읽어버린다.

 

1. 해결책1 (권장)

request.setCharacterEncoding("UTF-8");

 

2. 해결책2 (비권장. 톰캣 서버 설정인 server.xml을 변경)

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

 

한편 다음과 같은 코드를 통해서 입력받은 데이터를 배열로 받아올 수 있다.

String[] data = request.getParameterValues("parameter");

 

'콤퓨타 왕기초 > JSP' 카테고리의 다른 글

상태유지를 위한 Application, Session, Cookie  (0) 2020.12.17
URI와 URL, URN  (0) 2020.12.14
GET 요청과 쿼리 스트링  (0) 2020.12.09
Eclipse를 통한 웹 개발 기본  (0) 2020.12.09
REST API 설계  (0) 2020.11.23
Comments