Http Servlet Request
Servlet은 개발자가 Http요청 메세지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP요청 메세지를 파싱한다. 그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다.
HTTP 요청 방법
GET - 쿼리 파라미터
- /uri?username=lee&age=26
- 메세지 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해서 전달.
- 검색, 필터등에서 많이 사용함.
POST - HTML Form
- username=lee&age=26
- 메세지 바디에 쿼리 파라미터 형식으로 전달
Http message body
- HTTP API에서 주로사용
- 주로 JSON형식으로 주고받음.
HTTP GET 쿼리 파라미터
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. 파라미터 전송기능
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class ReqiestParamServlet 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 요청 : localhost:8080/request-param?username=lee&age=26
- request-param으로 요청이 들어오면 밑의 함수가 실행이 된다.
- getParameter함수를 이용해 각 파라미터별 값을 조회할수 있다.
- 복수파라미터 같은 경우는 getParameterValues로 해당 key값으로 조회 할수 있다.
출력 결과
[전체 파라미터 조회] - start
username=hello
age=20
[전체 파라미터 조회] - end
[단일 파라미터 조회]
username = lee
age = 26
[이름이 같은 복수 파라미터 조회]
username=lee
HTTP POST HTML Form
username=lee&age=26
package hello.servlet.basic.request;
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();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("messageBody = " + messageBody);
response.getWriter().write("ok");
}
}
post man의 요청 데이터타입을application/x-www-form-urlencoded
으로 지정해주고 그안에 데이터를 입력하고 Post방식으로 보내면 html폼데이터에서 보낸거하고 똑같이 전송된다.
- inputStream은 byte코드를 반환한다. 그래서 지정해줬다.
출력 결과
messaagebody = username=lee&age=26
HTTP API 메세지 바디 - JSON
package hello.servlet.basic;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class HelloData {
private String username;
private int age;
}
@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());
}
}
- form이랑 방식은 똑같은데 post man으로 전송방식을 application/josn으로 설정해주고 데이터를 보냄.
출력결과
{
username : lee
age : 26
}
와~ 서블렛 방식 설명해주세요! 직접 들어보고 싶네요