스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의 중 서블릿을 이용한 http 요청, 응답에 대한 내용을 정리해보았다.
?
를 시작으로 보낼 수 있다. 추가 파라미터는 &
로 구분하면 된다.HttpServletRequest
가 제공하는 메서드를 통해 쿼리 파라미터를 편리하게 조회할 수 있다.
String username = request.getParameter("username"); //단일 파라미터 조회
Enumeration<String> parameterNames = request.getParameterNames(); //파라미터 이름들 모두 조회
Map<String, String[]> parameterMap = request.getParameterMap(); //파라미터를 Map 으로 조회
String[] usernames = request.getParameterValues("username"); //복수 파라미터 조회
request.getParameter()
는 하나의 파라미터 이름에 대해서 단 하나의 값만 있을 때 사용해야 한다.
중복일 때는 request.getParameterValues()
를 사용해야 한다. 만약 중복일 때 request.getParameter
를 사용하면 맨 첫번째 값을 반환한다.
application/x-www-form-urlencoded
username=hello&age=20
application/x-www-form-urlencoded
형식은 GET에서 본 쿼리 파라미터 형식과 같다. 따라서 쿼리 파라미터 조회 메서드를 그대로 사용하면 된다.
request.getParameter()
는 GET URL 쿼리 파라미터 형식, POST HTML Form 형식 둘 다 지원한다.
HTTP메세지 바디의 데이터를 InputStream
을 사용해서 직접 읽을 수 있다.
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);
InputStream
은 byte 코드를 반환한다. byte코드를 우리가 읽을 수 있는 문자(String) 로 보려면 문자표(Charset)을 지정해주어야 한다.
{"username": "hello", "age": 20}
messageBody = {"username": "hello", "age": 20}
JSON 형식으로 파싱할 수 있게 객체를 생성한다.
@Getter @Setter
public class HelloData {
private String username;
private int age;
}
lombok이 제공하는 @Getter
,Setter
를 사용하면 게터 세터가 자동 추가된다.
@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");
}
}
HttpServletResponse
를 이용한 응답 메세지 생성
Content-Type 편의 메소드
private void content(HttpServletResponse response) {
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
}
쿠키 편의 메소드
private void cookie(HttpServletResponse response) {
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600초
response.addCookie(cookie);
}
redirect 편의 메소드
private void redirect(HttpServletResponse response) throws IOException {
response.sendRedirect("/basic/hello-form.html");
}
HTTP 응답으로 JSON을 반환할 때는 content-type을 application/json
으로 지정해야 한다.
Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString()
을 사용하면 객체를 JSON문자로 변경할 수 있다.
@WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
public class ResponseJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Content-Type:application/json
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
HelloData helloData = new HelloData();
helloData.setUsername("kim");
helloData.setAge(20);
//{"username":"kim", "age";20}
String result = objectMapper.writeValueAsString(helloData);// 객체를 문자로 바꿔줌
response.getWriter().write(result);
}
}