728x90

Dependency

  • Spring Web
  • Lombok

 

지원형식도 jar이 아닌 war로 설정 (jsp 실행을 위해)

 

이 두개만 사용해서 gradle 환경설정을 마쳐준다.

 


@ServletComponentScan 애노테이션을 사용하여 서블릿을 자동 등록

package hello.servlet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServletApplication.class, args);
    }

}

서블릿 컨테이너

동작방식

 

  • 웹 브라우저가 HTTP 요청을 보낸 후, 웹 애플리케이션 서버(WAS)로 전달된다.
  • 웹 애플리케이션 서버(WAS)는 요청을 request 객체로 받으며, 이를 처리하기 위해 서블릿 컨테이너로 전달한다.
  • 서블릿 컨테이너는 요청을 처리할 서블릿(helloServlet)을 실행한다.
  • 서블릿은 요청을 처리하고, 응답 객체(response)를 생성하여 다시 웹 애플리케이션 서버(WAS)로 전달한다.
  • 여기서 request와 response는 서블릿 API에서 사용되는 주요 객체로, 각각 클라이언트의 요청 정보와 서버의 응답 정보를 담는다.
  • 웹 애플리케이션 서버(WAS)는 서블릿에서 생성한 응답 객체를 바탕으로 HTTP 응답 메시지를 생성한다.
  • 이 응답은 다시 클라이언트(웹 브라우저)로 전송된다.
  • 클라이언트는 최종적으로 hello world라는 응답 메시지를 받게 된다.

HttpServletRequest

  • HTTP 요청 메시지를 편리하게 조회가 가능함
  • 임시 저장소 기능
    - 저장 : requset.setAttribute(name, value)
    - 조회 : request.getAttribute(name)
  • 세션 관리 기능
    request.getSession(create : true)

HTTP 요청 방식

 

Get - QueryParameter

  • 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
  • cf) 검색, 필터, 페이징등에서 많이 사용하는 방식

 

 

쿼리 파라미터는 URL에 ?을 시작으로 보내며 추가 파라미터는 &로 구분한다

cf) /localhost8080/request-param?username=hello&age=20

 

 

코드

package hello.servlet.basic.request;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;


/**
 * 1. 파라미터 전송 기능
 * http://localhost:8080/request-param?username=hello&age=20
 * <p>
 * 2. 동일한 파라미터 전송 가능
 * http://localhost:8080/request-param?username=hello&username=kim&age=20
 */
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("[전체 파라미터 조회] - start");
        request.getParameterNames().asIterator().forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName)));
        System.out.println("[전체 파라미터 조회] - end");
        System.out.println();


        System.out.println("[단일 파라미터 조회]");
        String username = request.getParameter("username");
        String age = request.getParameter("age");

        System.out.println("username = " + username);
        System.out.println("age = " + age);
        System.out.println();


        System.out.println("[이름이 같은 복수 파라미터 조회]");
        String[] usernames = request.getParameterValues("username");
        for (String name : usernames) {
            System.out.println("username = " + name);
        }

        response.getWriter().write("ok");
    }
}

 

전체파라미터 조회 코드 동작 구성

  • request.getParameterNames().asIterator()는 Iterator를 반환합니다. 이 Iterator는 username과 age를 포함합니다.
  • forEachRemaining 메서드는 Iterator의 각 요소에 대해 작업을 수행합니다. 여기서는 각 파라미터 이름(paramName)을 반복합니다.
  • 각 파라미터 이름에 대해, System.out.println을 사용하여 이름과 해당 값을 출력합니다.
    • 첫 번째 반복에서, paramName은 username이고, request.getParameter("username")은 hello를 반환합니다.
    • 두 번째 반복에서, paramName은 age이고, request.getParameter("age")은 20을 반환합니다.

 

 

 


 

Post - HTML Form

  • content-type: application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
  • cf) 회원 가입, 상품 주문, HTML Form 사용

 

 

html에서 form 생성 후 data를 보냄

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/request-param" method="post">
    username: <input type="text" name="username" />
    age:      <input type="text" name="age" />
    <button type="submit">전송</button>
</form>
</body>
</html

 

 

 

 

포스트 맨을 사용해서도 확인이 가능하다!

 

 


 

API 메시지 바디 - 단순 텍스트

 

HTTP message body에 데이터를 직접 담아서 요청

  • HTTP API에서 주로 사용, JSON, XML, TEXT
  • 데이터 형식은 주로 JSON 사용
  • POST, PUT, PATCH

 

텍스트 형식으루 date 주고받기

package hello.servlet.basic.request;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

@WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyStringServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletInputStream inputStream = request.getInputStream();

        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
        System.out.println("messageBody = " + messageBody);

        response.getWriter().write("ok");
    }
}


 

JSON 형식으로 data 주고받기

package hello.servlet.basic.request;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletInputStream inputStream = request.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        System.out.println("Request body: " + messageBody);

    }
}

 

 


Json 형태 객체변환해서 받기

 

package hello.servlet.basic.request;

import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletInputStream inputStream = request.getInputStream();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        System.out.println("Request body: " + messageBody);

        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

        System.out.println("helloData.username = " + helloData.getUsername());
        System.out.println("helloData.age = " + helloData.getUsername());

        response.getWriter().write("ok");
    }
}

728x90

+ Recent posts