티스토리 뷰

1. GET방식 - 쿼리 파라미터

- URL의 쿼리 파라미터에 데이터를 포함해서 전달

- 검색이나 필터, 페이징등에서 많이 사용함

- ex) http://localhost:8080/request-param?username=zoooo&age=500

 

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;
import java.util.Enumeration;
import java.util.Iterator;

///1. 파라미터 전송기능
/// http://localhost: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("===== 전체파라미터 조회 =====");
//        Enumeration<String> parameterNames = request.getParameterNames();
//        while (parameterNames.hasMoreElements()) {
//            String paramName = parameterNames.nextElement();
//            System.out.println(paramName + "=" +
//                    request.getParameter(paramName));
//        }

        ///요즘방법
        request.getParameterNames().asIterator()
                .forEachRemaining(paramName -> System.out.println(paramName +"="+ request.getParameter(paramName)));
        System.out.println("===== 전체파라미터 조회 끝=====");
        System.out.println("");


        //// 단일로 꺼내기
        System.out.println("===== 단일 파라미터 조회 =====");
        String username = request.getParameter("username");
        System.out.println("username : " +username);
        String age = request.getParameter("age");
        System.out.println("age : " +age);
        System.out.println("===== 단일 파라미터 조회 끝=====");

    }
}

 

 

http://localhost:8080/request-param?username=이주연&age=24 쿼리 날렸을때

- 전체 파라미터 조회 : request.getParameterNames();

- 단일 파라미터 조회 : reQuest.getParameter("name");

 

 

 

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

- 이름이 같은 파라미터가 여러개 있을때 : request.getParameterValues("name");

 

 

예시)

http://localhost:8080/request-param?username=이주연&age=500&username=이현재&username=김영훈

쿼리 날렸을때 

- 애초에 중복으로 날리는 경우가 잘 없다
- request.getParameter()는 하나의 파라미터 이름에 대해서 단 하나의 값만 있을때 사용해야함
- 중복일때는 request.getParameterValues()
- 참고로 이렇게 중복일때 request.getParameter()를 사용하면 request.getParameterValues()의 첫번째 값을 반환한다

 

 

 

2. POST 방식 - HTML form

- 주로 회원가입, 주문 등등에서 사용

 

 

hello-form.html

<!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>

- /request-param으로 가는 html form 작성

 

 

 

- 요청 URL : http://localhost:8080/request-param

- content-type: application/x-www-form-urlencoded

- message body: username=이주연&age=24

 

 

전송버튼 누르고 개발자 모드 실행했을 때

 

콘솔창

- action이 get파라미터 던졌을때랑 같은 urlPatterns이라 같은내용 찍힘

 

 

 

3. HTTP message body에 담아서 전송

- HTTP API에서 주로 사용(JSON, XML, TEXT)

- 데이터 형식은 주로 JSON 사용

- POST, PUT, PATCH

 

 

주로 쓰는 JSON형식으로 전달하는 예제

 

HelloData.java

package hello.servlet.basic;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class HelloData {
    
    private String username;
    private int age;

//    public String getUsername() {
//        return username;
//    }
//
//    public void setUsername(String username) {
//        this.username = username;
//    }
//
//    public int getAge() {
//        return age;
//    }
//
//    public void setAge(int age) {
//        this.age = age;
//    }

}

 

- JSON형식으로 파싱가능하도록 객체 생성

- 원래였으면 getter,setter 다 생성해야지만, lombok사용해서 @Getter @Setter만 적어주면 됨

 

 

 

RequestBodyJsonServlet.java

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 {

    //스프링부트에서 기본적으로 제공해주는 json라이브러리
    private ObjectMapper objectMapper = new ObjectMapper();

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

        System.out.println("message " + message);

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

        ///객체로 변환
        System.out.println("helloData.username : "+helloData.getUsername());
        System.out.println("helloData.userage : "+helloData.getAge());
        
        response.getWriter().write("!!!!");
    }
}

- JSON형식의 결과를 파싱할수 있는 객체로 변화하려면 Jackson, Gson같은 JSON변환 라이브러리를 추가해야함

- 스프링 부트에서는 Jackson 라이브러리(ObjectMapper)를 기본적으로 제공 -> 파싱하기 쉬워진다

 

 

 

Postman을 사용해서 테스트

 

댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday