파게로그
POST 요청 본문
입력할 값이 많은 경우에는 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 |