<< 학습 목표 >>
1. 클라이언트에서 GET, POST 요청 방식으로 서버에 요청할 수 있다.
2. 서버에서 GET, POST 요청 방식을 받을 수 있다.
3. GET, POST 방식의 특징에 대해서 설명할 수 있다.
서블릿은 클라이언트의 요청을 받는 컨트롤러의 역할을 한다고 했음
클라이언트는 주로 GET, POST, PUT, DELETE 방식 중 한 방식으로 요청을 함
서블릿이 GET 방식 요청을 처리할 때는 doGet 메서드를 오버라이딩 하면 됨
chapter03 패키지를 만들고 그 안에 다음과 같이 GET 방식 요청을 처리할 서블릿을 추가하자
package chapter03;
import java.io.IOException;
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("/chapter03/get_servlet")
public class GetServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("클라이언트가 GET 방식으로 요청했음");
}
}
클라이언트가 GET 방식으로 요청하는 방법은 다양한 방법이 있음
1. URL에 서블릿의 경로를 직접 입력
2. HTML의 a 태그
3. form 태그의 method 속성을 GET 으로 지정
4. 자바스크립트의 location.href
5. Jquery의 ajax의 type을 GET 으로 지정
등
굉장히 다양한 방법이 있지만 여기서는 3번 form 태그의 method 속성을 GET 으로 지정해 서버로 요청을 보내보자
webapp 폴더 안에 chapter03 폴더를 만들고 그 안에 getRequest.html 페이지를 만들어 아래 코드를 넣자
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GET 요청 페이지</title>
</head>
<body>
<form action="http://localhost:8080/studyProject/chapter03/get_servlet" method="GET">
<input type="number" name="firstNumber" placeholder="첫 번째 수">
<select name="operator">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</select>
<input type="number" name="secondNumber" placeholder="두 번째 수">
<input type="submit" value="결과 전송">
</form>
</body>
</html>
이제 요청을 하면 get_servlet의 doGet 메서드가 동작해 이클립스의 [ Console ] 탭에 "클라이언트가 GET 방식으로 요청했음" 이라고 출력됨
GET 방식으로 요청할 때 특징을 알아보자
1. 클라이언트가 서버로 보내는 값이 URL의 뒤에 붙음
2. 클라이언트가 서버로 보낼 수 있는 값의 종류가 제한적임
3. 클라이언트가 서버로 보낼 수 있는 값의 크기가 제한적임
getRequest.html 페이지에 접근해 두 값을 입력하고 연산자를 선택한 후 [ 결과 보기 ] 를 눌러보자
그 후 브라우저 URL을 보면 다음과 같이 보일 것
1. 클라이언트가 서버로 보내는 값이 URL의 뒤에 붙음
[ 결과 보기 ] 를 누르면
http://localhost:8080/studyProject/chapter03/get_servlet 로 요청이 들어가는데 그때 클라이언트가 서버로 보내는 값이 URL의 뒤에 붙음
형식을 보면 URL의 뒤에 ? 가 붙고 그 뒤에 name=value&name=value&... 의 형식으로 붙음
또한 보내는 값 중 operator를 보면 값(value)이 %2B 로 되어있는데 이렇게 GET 방식으로 서버로 보낼 때 영문, 숫자를 제외한 특수문자, 한글 등은 모두 다른 형태로 변환되 전달됨
형태만 다른거지 값은 같은 것 따라서 서버에서는 operator의 값을 다시 원래의 형태로 변환해 사용함
2. 클라이언트가 서버로 보낼 수 있는 값의 종류가 제한적임
GET 방식으로 서버에 보낼 수 있는 값은 숫자, 문자열 등 단순한 형태의 데이터임
나중에 파일을 서버로 보내야하는데 파일은 GET 방식으로 보낼 수 없음
3. 클라이언트가 서버로 보낼 수 있는 값의 크기가 제한적임
크기가 얼마나 제한적인지는 딱 짚어서 말할 수 없음
그 이유는 클라이언트 프로그램(웹 브라우저)에 따라서 보낼 수 있는 값의 크기가 다르기 때문에...
따라서 "크기가 제한적이다" 라고만 기억하면 됨
서블릿이 POST 방식 요청을 처리할 때는 doPost 메서드를 오버라이딩 하면 됨
chapter03 패키지 안에 다음과 같이 POST 방식 요청을 처리할 서블릿을 추가하자
package chapter03;
import java.io.IOException;
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("/chapter03/post_servlet")
public class PostServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("클라이언트가 POST 방식으로 요청했음");
}
}
클라이언트가 POST 방식으로 요청하는 방법은 다양한 방법이 있음
1. form 태그의 method 속성을 POST 로 지정
2. Jquery의 ajax의 type을 POST 로 지정
3. 제 3의 프로그램(Third Party Program)을 사용해 POST 로 요청
등
굉장히 다양한 방법이 있지만 여기서는 1번 form 태그의 method 속성을 POST 로 지정해 서버로 요청을 보내보자
webapp 안에 chapter03 안에 postRequest.html 페이지를 만들어 아래 코드를 넣자
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>POST 요청 페이지</title>
</head>
<body>
<form action="http://localhost:8080/studyProject/chapter03/post_servlet" method="POST">
<input type="number" name="firstNumber" placeholder="첫 번째 수">
<select name="operator">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</select>
<input type="number" name="secondNumber" placeholder="두 번째 수">
<input type="submit" value="결과 전송">
</form>
</body>
</html>
이제 요청을 하면 post_servlet의 doPost 메서드가 동작해 이클립스의 [ Console ] 탭에 "클라이언트가 POST 방식으로 요청했음" 이라고 출력됨
POST 방식으로 요청할 때 특징을 알아보자
1. 클라이언트가 서버로 보내는 값이 URL에 보이지 않음
2. 클라이언트가 서버로 보낼 수 있는 값의 종류에 제한이 없음
3. 클라이언트가 서버로 보낼 수 있는 값의 크기에 제한이 없음
1. 클라이언트가 서버로 보내는 값이 URL에 보이지 않음
[ 결과 보기 ] 를 누르면
http://localhost:8080/studyProject/chapter03/post_servlet 로 요청이 들어가는데 그때 클라이언트가 서버로 보내는 값이 보이지 않음
POST 방식으로 데이터를 보낼 때는 아래 요청 정보와 같이 몸통(body) 에 담겨져 보냄
2. 클라이언트가 서버로 보낼 수 있는 값의 종류에 제한이 없음
POST 방식으로 보낼 수 있는 데이터는 숫자, 문자열 등 외에도 파일도 보낼 수 있음
나중에 서버로 파일을 보낼 때는 POST 방식으로 보내게 될 것
3. 클라이언트가 서버로 보낼 수 있는 값의 크기에 제한이 없음
여기까지 GET 방식과 POST 방식을 비교해보면 마치 GET 방식이 나쁜것 같고 POST 방식이 좋은것같지만 요청 방식에 나쁘다 좋다는 없음
상황에 따라서 GET 방식으로 보내야할 경우가 있고 POST 방식으로 보내야 할 경우가 있음
지금까지는 서블릿 하나 당 요청 방식 하나씩 처리하도록 했음
이번에는 서블릿 하나가 GET, POST 요청 방식 모두를 처리하도록 해보자
chapter03 패키지 안에 다음과 같이 GET, POST 방식 요청을 처리할 서블릿을 추가하자
package chapter03;
import java.io.IOException;
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("/chapter03/both_servlet")
public class BothServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("BothServlet -> 클라이언트가 GET 방식으로 요청함");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("BothServlet -> 클라이언트가 POST 방식으로 요청함");
}
}
webapp 안에 chapter03 안에 postRequest.html 페이지를 만들어 아래 코드를 넣자
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GET, POST 요청 페이지</title>
</head>
<body>
<h1>GET 방식 요청</h1>
<form action="http://localhost:8080/studyProject/chapter03/both_servlet" method="GET">
<input type="number" name="firstNumber" placeholder="첫 번째 수">
<select name="operator">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</select>
<input type="number" name="secondNumber" placeholder="두 번째 수">
<input type="submit" value="결과 전송">
</form>
<br>
<h1>POST 방식 요청</h1>
<form action="http://localhost:8080/studyProject/chapter03/both_servlet" method="POST">
<input type="number" name="firstNumber" placeholder="첫 번째 수">
<select name="operator">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</select>
<input type="number" name="secondNumber" placeholder="두 번째 수">
<input type="submit" value="결과 전송">
</form>
</body>
</html>
이 페이지의 두 form 을 보면 똑같은 서블릿으로 요청을 하고 있음
대신 첫 번째 form은 GET 방식으로 요청하고 있고 두 번째 form은 POST 방식으로 요청하고 있음
GET 방식 요청의 [ 결과 전송 ] 과 POST 방식 요청의 [ 결과 전송 ] 을 눌러보면 both_servlet이 모두 요청을 처리하는 것을 알 수 있음
이렇게 서블릿이 요청 방식 하나만 처리할 수도 있고 GET, POST 요청 방식 모두를 처리할 수도 있음
클라이언트가 서버로 데이터를 전달할 때 GET과 POST가 보내는 방식은 다르지만 결국에는 서버로 데이터를 전달하는 것
이렇게 클라이언트가 서버로 전달하는 데이터를 파라미터(Parameter) 라고 부름
위 프로그램에서 클라이언트는 서버로 firstNumber, operator, secondNumber 파라미터를 보낸 것
이외에 클라이언트가 PUT, DELETE 방식으로 요청했을 때도 봐야하나 "저는" PUT, DELETE 방식은 여러 사정 상 사용하지 않기로 했음
여러 사정에 대해 알고 싶다면 아래 블로그를 들어가보길
https://goldswan.tistory.com/42
[Spring]Spring에서 PUT, DELETE Method 사용하기
서론 진행하고 있던 Spring 사이드 프로젝트에서 RESTful 하고 싶은 HTTP API를 만들기 위해 put, delete HTTP Method를 사용하려 했습니다. 단순히 form 태그 안 method 속성을 "put", "delete"로 바꾸고 요청을 시도
goldswan.tistory.com
'Servlet + JSP > Serlvet-Chapter03' 카테고리의 다른 글
Chapter03. GET, POST 언제써야할까? (0) | 2023.02.28 |
---|---|
Chapter03. 웹 페이지의 URL을 조금이라도 줄여보자 (0) | 2023.02.28 |
Chapter03. 클라이언트가 한글 데이터를 보냈다면? (0) | 2023.02.28 |
Chapter03. 클라이언트가 보낸 값이 없다면? ( 서버의 유효성 검증 ) (0) | 2023.02.27 |
Chapter03. 클라이언트가 보낸 값 꺼내기 (0) | 2023.02.27 |