Web/MVC

EP2. 서블릿객체만을 이용해 HTTP 요청데이터 처리하기

HTTP 요청 데이터는

  1. 쿼리파라미터
  2. HTML Form
  3. HTTP API

 

세가지로 나누어 진다.

 

 

쿼리파라미터

쿼리파라미터는 request.getParameterNames() 로 쉽게 받을 수 있다.

 

RequestParamServlet.class

package hello.servlet.basic.request;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 * 1. 파라미터 전송 기능
 * http://127.0.0.1:8080/request-param?username=hello&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 s : usernames) {
            System.out.println("s = " + s);
        }

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

 

postman 데이터 전송

 

http://127.0.0.1:8080/request-param?username=hello&age=20

를 주소창에 치는것과 같다.

 

결과

 

<log>

 

 

 

 

 

 

HTML 폼

request.getParameterNames() 로 파라미터 정보를 쉽게 받을 수 있다.

 

 

 

 

HTTP API (JSON)

  1. http body의 데이터가 바이트코드로 되어있기 때문에 request.getInputStream(); 으로 받아온다.
  2. java의StreamUtils를 이용해 메시지 바디로 가져온다.String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
  3. Jackson Library ObjectMapper를 이용해서 JSON 을 파싱한다.
package hello.servlet.basic.request;

import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import org.springframework.util.StreamUtils;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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("messageBody = " + messageBody);

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

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

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

 

 

POSTMAN

 

결과