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://localhost:8080/request-param?username=hello&age=20
*/
@WebServlet(name = "requestParamServelt", urlPatterns = "/request-param")
public class RequestParamServelt 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("[단일 파라미터 조회] - start");
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("[이름이 같은 복수 파라미터 조회]");
//http://localhost:8080/request-param?username=hello&age=20&username=bye
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("name = " + name);
}
System.out.println("[단일 파라미터 조회] - end");
}
}
위의 코드를 http://localhost:8080/request-param?username=hello&age=20&username=bye 로 실행해보면 get 방식으로 서블릿을 통해 파라미터를 조회하는 방법을 확인할 수 있다.
만약 복수 파라미터인데 getParameter로 조회하면 첫번째 파라미터로 조회된다.
<!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으로 위의 form을 전송하면 자동으로 데이터들을 똑같이 읽어내는데 이는 get 방식은 url에 파라미터를 key=value&key=value 형식으로 전송하고 post-form 또한 http message body에 form data인 key=value&key=value 형식으로 데이터를 전송하기 때문이다. get 파라미터 방식과 post-form 방식은 똑같이 request.getParameter()로 데이터를 파싱해올 수 있다.
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 = "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(); //바이트로 message body를 읽어옴
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);//인코딩 정보
System.out.println(messageBody);
response.getWriter().write("ok");
}
}
위 코드는 http로 전송된 message body를 byte로 읽어서 다시 byte를 인코딩하여 String으로 반환해주는 코드이다. postman으로 post요청을 해보면
위와 같이 내가 요청한 내용을 확인할 수 있다.
이 내용은 굳이 정리하지 않으려 했는데 .getInputStream()과 스프링에서 제공하는 StreamUtils라는 기능을 사용해볼 수 있는 간단한 예시 코드여서 정리해봤다.
import lombok.Data;
@Data
public class HelloData {
private String username;
private int age;
}
json 데이터를 담을 class를 만들어준다.
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.username = " + helloData.getUsername());
System.out.println("helloData.age = " + helloData.getAge());
}
}
다음 코드로 json 또한 text요청과 같이 inputStream으로 읽어오고 jackson libarary의 ObjectMapper를 통해 자동으로 파싱하여 사용하면 된다. json을 읽는 라이브러리는 자기가 편한거 사용하면 되는데. 지금 프로젝트는 간단하게 스프링에서 제공하는걸로 했다. 그리고 나서 postman으로 요청한 결과를 확인하면
다음과 같이 정상적으로 String으로 읽어온 것과 json형식으로 파싱한 결과를 확인할 수있다.