* 본 글은 [뉴렉처]의 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이 너무 길어짐
- URL 길이에 제한이 있어 사용자가 입력한 값을 모두 담을 수는 없음
- 예: http://localhost:8090/notice-reg?title=hi&content=등록합니다.
- 2) URL에 들어갈 수 없는 특수문자가 입력될 수도 있음
- 클라이언트가 문서를 요청할 때 쿼리스트링은 그 문서의 옵션값
- 간단한 옵션값을 담는 거지, 장문의 내용을 적는 것은 올바른 방법이 X
- URL에 쿼리 값이 붙어서 전달되는 GET 요청으로는 보안에 민감한 정보들을 보호하지 못함
- 서블릿의 매핑 주소를 담고 있는<form>태그의 속성 action이 서블릿에 값을 전달할 때의 방법이 2가지임
- 1) <form>태그의 옵션을 아무것도 지정하지 않으면, 입력받은 값은 쿼리 값으로 서버에 전달됨 (GET 요청)
- <form>태그의 속성 method의 기본값은 get
- 속성 action의 값이 문서가 되고 입력받은 값들은 그 문서에 달려있기 위한 옵션 값이 됨
- <form>태그의 옵션으로 method=”post”를 넣어줌 > 위의 문제 해결법
- 1) <form>태그의 옵션을 아무것도 지정하지 않으면, 입력받은 값은 쿼리 값으로 서버에 전달됨 (GET 요청)
문제점 해결하기
- <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>
- 결과
- 주소에 쿼리 값이 전달되지 않고 서블릿 매핑 주소대로만 나옴
- http://localhost:8090/notice-reg
- Chrome 검사 도구에서 자세히 살펴보기
- Request Method: Post
- 문서 요청 바디 안에 전달된 값들
'☕ Java 웹 프로그래밍 > Servlet & JSP' 카테고리의 다른 글
[Servlet&JSP] 서블릿 필터(Servlet Filter) (0) | 2023.05.25 |
---|---|
[Servlet&JSP] 사용자 입력: 한글 입력 문제 (2) | 2023.05.24 |
[Servlet&JSP] 사용자 입력: 사용자로부터 입력받은 값으로 GET 요청 (0) | 2023.05.24 |
[Servlet&JSP] 사용자 입력: 기본 값 사용하기 (0) | 2023.05.24 |
[Servlet&JSP] 사용자 입력: GET 요청과 쿼리스트링 (0) | 2023.05.24 |