* 본 글은 [뉴렉처]의 Servlet&JSP 프로그래밍 강의를 듣고 정리한 글입니다.
2020 Servlet&JSP 프로그래밍
www.youtube.com
GET과 POST에 특화된 service( )메소드
GET 요청과 POST 요청을 구분해주는 방법
- service( )메소드를 오버라이딩해서 GET 요청과 POST 요청을 조건문으로 한 번에 처리
- doGet( )메소드와 doPost( )메소드를 오버라이딩해 GET 요청과 POST 요청을 각각 처리
- GET 요청에 특화된 메소드: doGet( ) POST 요청에 특화된 메소드: doPost( )
위의 두 방법을 사용하기 전에 먼저 할 것들
- 새 서블릿 만들기
- Java Resources>src>원하는 패키지(com.newlecture.web) 밑에 새 클래스 Calculator.java 생성
- HttpServlet을 상속하게 함(public class 클래스명 extends HttpServlet{ } )
- HttpServlet을 자동완성(Ctrl+Space)시켜서 HttpServlet을 import
- service 입력해서 자동완성(Ctrl+Space)으로 service 클래스를 import
- HTML 파일 만들기
- WebContent>새 HTML 파일 calculator.html 생성
- <form> 안에 <input> 만들기
service( )메소드로 GET 요청과 POST 요청을 공통으로 처리하는 과정
- 1) [calculator.html] <form>에 action, method 값 설정 / <input>에 type, value 값 설정
<form action="calculator" method="get">
<input type="submit" value="요청">
</form>
- 2) [Calculator.java] service( )메소드 오버라이딩
- HttpServletRequest가 가지고 있는 getMethod( )메소드를 사용
- 클라이언트의 <input> 속 method 속성 값을 반환해줌 > get과 post를 나눠서 처리하거나, get과 post를 구체화할 수 있음
- request.getMethod( ).equals(”GET”
- 주의사항: getMethod( )메소드를 함께 쓸 때는 equals( )메소드 안에 들어가는 문자열은 무조건 대문자여야 함
- HttpServletRequest가 가지고 있는 getMethod( )메소드를 사용
@WebServlet("/calculator")
public class Calculator extends HttpServlet {
@Override
protected void service(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException
{
if(req.getMethod().equals("GET")) {
System.out.println("GET 요청이 왔습니다.");
}
else if(req.getMethod().equals("POST")) {
System.out.println("POST 요청이 왔습니다.");
}
super.service(req, resp);
}
}
- 3) [Calculator.java] super.service(req, resp);는 일단 주석 처리
- 주석 처리를 안 해두면 오류 발생
- 오버라이딩된 service( )메소드로 GET 요청과 POST 요청이 각각 처리됨
- 그 후에 super.service(req, resp);가 실행되는데 doGet( )메소드와 doPost( )메소드가 오버라이딩되어 있지 않아서 오류 발생
- 주석 처리를 안 해두면 오류 발생
- 405: URL은 있으나, 클라이언트가 요청하는 메소드(GET, POST…)를 처리하는 로직이 없는 경우 발생하는 에러
- 404: 서블릿에서 매핑하는 URL(예: /calculator)이 아예 없을 경우 발생하는 에러
service( )메소드로 GET 요청과 POST 요청을 공통으로 처리하기 결과
- HTML method가 get으로 되어 있으니, 요청 버튼을 누르면 이클립스 콘솔에 “GET 요청이 왔습니다.”라고 출력됨
- HTML method를 post로 바꾸고 버튼을 클릭하면 “POST 요청이 왔습니다.”라고 출력됨
부모클래스의 service( )메소드로 GET 요청과 POST 요청 각각 처리하기
- service( )메소드를 오버라이딩하지 않았다면 service( )안에 작성된 super.service(req, resp);를 통해 부모 클래스가 갖고 있는 service( )메소드가 호출되었을 것 > doGet( )메소드와 doPost( )메소드가 자동으로 호출됨
- 부모클래스의 service( )메소드 기본 기능
- 사용자의 요청이 GET이면 doGet( )메소드 호출
- 사용자의 요청이 POST이면 doPost( )메소드 호출
- super.service(req, resp);로 부모클래스의 service( )를 호출하면 doGet( )메소드와 doPost( )메소드가 자동으로 호출된다는 의미
- doGet( )메소드와 doPost( )메소드를 오버라이딩하지 않으면 오류 발생
부모클래스의 service( )메소드로 GET 요청과 POST 요청 각각 처리하는 과정
- 1) [Calculator.java] doGet( )메소드를 오버라이딩
- doGet를 입력 후 자동완성(Ctrl+Space)
- 부모클래스가 갖고 있는 doPost( )메소드는 호출할 필요 없으니 doPost( ) 안의 super.doPost(req, resp);는 지우기
- 2) [Calculator.java] doPost( )메소드를 오버라이딩
- doPost를 입력 후 자동완성(Ctrl+Space)
@Override
protected void doGet(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doGet 메소드가 호출되었습니다.");
}
@Override
protected void doPost(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost 메소드가 호출되었습니다.");
}
부모클래스의 service( )메소드로 GET 요청과 POST 요청 각각 처리하기 결과
- doPost( )의 결과
- 요청 버튼을 클릭하면, HTML method가 post니까 오버라이딩된 service( )를 거쳐서 “POST 요청이 왔습니다”가 출력 > 부모클래스의 service( ) 호출 > 자동으로 doPost( )가 호출되면서 “doPost 메소드가 호출되었습니다.”가 출력됨
- doGet( )의 결과
- HTML method를 get으로 바꾸고 새로고침 > 요청 버튼 누름 > 오버라이딩된 service( )를 거쳐서 “GET 요청이 왔습니다”가 출력 > 부모클래스의 service( ) 호출 > 자동으로 doGet( )가 호출되면서 “doGet 메소드가 호출되었습니다.”가 출력됨
서블릿(Calculator.java)와 HTML(calculator.html) 파일 코드
- Calculator.java 코드
package com.newlecture.web;
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("/calculator")
public class Calculator extends HttpServlet {
@Override
protected void service(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException
{
if(req.getMethod().equals("GET")) {
System.out.println("GET 요청이 왔습니다.");
}
else if(req.getMethod().equals("POST")) {
System.out.println("POST 요청이 왔습니다.");
}
super.service(req, resp);
}
@Override
protected void doPost(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost 메소드가 호출되었습니다.");
}
}
- calculator.html 코드
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="calculator" method="post">
<input type="submit" value="요청">
</form>
</body>
</html>
service( ) 오버라이딩과, 부모클래스의 service( ) 호출로 자동 호출된 doGet( )/doPost( ) 오버라이딩 사용법 정리
- 공통으로 처리할 부분과 GET/POST 각각 처리할 부분도 있는 경우
- doGet( ) / doPost( )를 실행하기 전에 공통으로 처리할 게 있으면 오버라이딩한 service( )에서 작성
- service( )안에 super.service(req, resp);를 작성해 doGet( ) / doPost( ) 호출
- doGet( )와 doPost( )를 각각 오버라이딩
@WebServlet("/calculator")
public class Calculator extends HttpServlet {
@Override
protected void service(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException
{
if(req.getMethod().equals("GET")) {
System.out.println("GET 요청이 왔습니다.");
}
else if(req.getMethod().equals("POST")) {
System.out.println("POST 요청이 왔습니다.");
}
super.service(req, resp);
}
@Override
protected void doPost(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost 메소드가 호출되었습니다.");
}
}
- 공통으로 처리할 부분만 있는 경우
- service( )를 오버라이딩
- super.service(req, resp);는 제거해야 함
@WebServlet("/calculator")
public class Calculator extends HttpServlet {
@Override
protected void service(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException
{
if(req.getMethod().equals("GET")) {
System.out.println("GET 요청이 왔습니다.");
}
else if(req.getMethod().equals("POST")) {
System.out.println("POST 요청이 왔습니다.");
}
}
}
- 공통 부분이 없고 GET/POST 각각 처리할 부분만 있는 경우
- service( )를 오버라이딩하지 않고, 바로 doGet( ) / doPost( ) 호출 후 각각 오버라이딩
- 코드엔 super.service(req, resp);를 적지 않지만, doGet( ) / doPost( )를 오버라이딩하는 것 자체에 숨겨져 있음
- HttpServlet이 갖고 있는 service( )는 doGet( )와 doPost를 라우팅해주는 느낌으로만 사용됨
@WebServlet("/calculator")
public class Calculator extends HttpServlet {
@Override
protected void service(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException
{
@Override
protected void doPost(HttpServletRequest req
, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost 메소드가 호출되었습니다.");
}
}
'☕ Java 웹 프로그래밍 > Servlet & JSP' 카테고리의 다른 글
[Servlet&JSP] 11일차 | (0) | 2023.06.05 |
---|---|
[Servlet&JSP] 계산기 프로그램을 서블릿 하나로 합치기 (0) | 2023.06.05 |
[Servlet&JSP] 쿠키 삭제하기 (0) | 2023.06.03 |
[Servlet&JSP] 계산기 서블릿 완성하기 (0) | 2023.06.03 |
[Servlet&JSP] 처음이자 마지막으로 동적인 페이지를 서블릿으로 직접 만들기 (0) | 2023.06.02 |