본문 바로가기
☕ Java 웹 프로그래밍/Servlet & JSP

[Servlet&JSP] 사용자 입력: 입력할 내용이 많은 경우는 POST 요청

by 일단연 2023. 5. 24.

* 본 글은 [뉴렉처]의 Servlet&JSP 프로그래밍 강의를 듣고 정리한 글입니다.

 

2020 Servlet&JSP 프로그래밍

 

www.youtube.com

 

 입력할 내용이 많은 경우는 POST 요청 

POST 요청의 일반적인 요청 방식

  • 요청과 제출 두 단계로 나눠서 일을 처리할 때의 두 가지 요청
    • 1) 입력 폼을 받기 위해 먼저 GET 요청
    • 2) 입력폼에 값을 담아 POST 요청

POST 요청을 하기 위한 HTML 작성

  • <form>태그의 action 값 변경
  • 제목을 <label>태그와 <input>태그로 받음
    • 사용자로부터 입력받은 제목을 서버로 전달하기 위해 <input>태그의 속성 name 값을 지정 (name의 값이 쿼리가 되며, 이 값은 서버로 전달됨)
  • 내용은 여러 줄 받기 위해 <textarea>태그 사용
    • 사용자로부터 입력받은 내용을 서버로 전달하기 위해 <textarea>태그의 속성 name 값을 지정
  • 서버로 사용자가 입력한 값을 전달하는 버튼인 submit의 value는 “등록”으로 설정
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>안녕하세요</title>
</head>
<body>
  <div>
    <form action="notice-reg">
      <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>

POST 요청을 하기 위한 서블릿 작성

  • 매핑 주소를 “/notice-reg”로 변경
  • request.getParameter( )메소드로 쿼리스트링의 쿼리 키워드 title과 content를 읽음
  • out.println( )메소드로 전달받은 title과 content를 출력
protected void service(HttpServletRequest request
                      , HttpServletResponse response)
                      throws ServletException, IOException
{
  response.setContentType("text/html; charset=UTF-8");
  response.setCharacterEncoding("UTF-8");
		
  PrintWriter out = response.getWriter();
		
  String title_ = request.getParameter("title");
  String content_ = request.getParameter("content");
		
  out.println(title_);
  out.println(content_);
}

실행 결과

위의 코드에서 발생하는 문제점

  • 1) URL에 사용자가 입력한 값이 들어가면서 URL이 너무 길어짐
  • 2) URL에 들어갈 수 없는 특수문자가 입력될 수도 있음
  • 클라이언트가 문서를 요청할 때 쿼리스트링은 그 문서의 옵션값
  • 간단한 옵션값을 담는 거지, 장문의 내용을 적는 것은 올바른 방법이 X
    • URL에 쿼리 값이 붙어서 전달되는 GET 요청으로는 보안에 민감한 정보들을 보호하지 못함
  • 서블릿의 매핑 주소를 담고 있는<form>태그의 속성 action이 서블릿에 값을 전달할 때의 방법이 2가지임
    • 1) <form>태그의 옵션을 아무것도 지정하지 않으면, 입력받은 값은 쿼리 값으로 서버에 전달됨 (GET 요청)
      • <form>태그의 속성 method의 기본값은 get 
      • 속성 action의 값이 문서가 되고 입력받은 값들은 그 문서에 달려있기 위한 옵션 값이 됨
    • <form>태그의 옵션으로 method=”post”를 넣어줌 > 위의 문제 해결법
    •  

문제점 해결하기

  • <form>태그의 옵션으로 method=”post”를 넣어줌 (POST 요청)
    • 사용자가 입력한 값을 제출할 때, 입력한 값이 많기 때문에 그 값들을 URL을 통해 전달하지 않고 요청 바디에 붙여서 전달함
    • 이 방법을 사용하면 요청 바디의 크기에 제한이 없음. 큰 데이터를 입력해도 서버 쪽에서 끊어지는 것 없이 내용을 모두 받을 수 있음
    • But, 입력 값으로 한글을 넣으면 인코딩이 깨지는 문제 발생 > 해결해야 함 (다음 글로 이어짐)
  • reg.html의 <form>태그에 method=”post” 삽입
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>안녕하세요</title>
</head>
<body>
	<div>
		<form action="notice-reg" method="post">
			<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>

  • Chrome 검사 도구에서 자세히 살펴보기
    • Request Method: Post

  • 문서 요청 바디 안에 전달된 값들