서블릿의 응답 처리 - HttpResponseServlet
개발자는 HttpResponseServlet 객체에 HTTP 응답 메세지에 담을 정보를 저장할 수 있다. 그리고 서블릿 컨테이너는 이 HttpResponseServlet 객체를 통해 HTTP 응답 메세지를 생성하고 클라이언트로 전송한다. HttpResponseServlet을 통해 개발자가 처리할 수 있는 정보는 다음과 같다.
- HTTP 응답 코드 설정
- 직접 숫자를 적어도 되지만 HttpResponseServlet의 상수 필드를 사용하는 것이 더 안전하다.
- HTTP 헤더 생성
- 기존 HTTP 스펙에서 제공되는 헤더 뿐만 아니라 개발자가 임의의 헤더를 생성할 수 있다.
- HTTP 바디 생성
- 단순 텍스트 응답
- HTML 응답
- JSON 응답
HTTP 응답 코드 및 헤더 설정
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// [status-line]
response.setStatus(HttpServletResponse.SC_OK);
// [Header 편의 메서드]
content(response);
cookie(response);
redirect(response);
// [response-header]
response.setHeader("Pragma", "no-cache");
response.setHeader("my-header", "hello-my-header");
response.getWriter().write("ok");
}
private void content(HttpServletResponse response) {
//Content-Type: text/plain;charset=utf-8
//Content-Length: 2
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
//response.setContentLength(2); //(생략시 자동 생성)
}
private void cookie(HttpServletResponse response) {
//Set-Cookie: myCookie=good; Max-Age=600;
//response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600초
response.addCookie(cookie);
}
private void redirect(HttpServletResponse response) throws IOException {
//Status Code 302
//Location: /basic/hello-form.html
//response.setStatus(HttpServletResponse.SC_FOUND); //302
//response.setHeader("Location", "/basic/hello-form.html");
response.sendRedirect("/basic/hello-form.html");
}
}
- response.setHeader()를 통해 ("헤더 이름, "헤더 값")으로 헤더를 설정할 수 있다.
- 그러나 response.setContentType(), response.setCharacterEncoding() 같은 메서드를 활용하는 것이 더 안전하다.
HTTP 바디 생성 - 단순 텍스트
@WebServlet(name = "responseTextServlet", urlPatterns = "/response-text")
public class ResponseTextServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("plain text");
writer.println("plain 단순 텍스트 응답");
}
}

- ContentType을 text/plain으로 지정한 후, PrintWriter를 통해 브라우저에 출력할 텍스트를 입력하면 된다.
HTTP 바디 생성 - HTML
@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Content-type: text/html;charset=utf-8
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println("<div>HTML 응답</div>");
writer.println("</body>");
writer.println("</html>");
}
}

- ContentType을 text/html로 지정해야 한다.
- 텍스트 응답과 같은 방식으로 HTML 태그를 보내면 브라우저에서 HTML 태그를 자동으로 파싱 해준다.
- 화면에는 출력할 메세지만 보이지만 개발자 모드를 통해 메세지 바디를 확인해 보면 HTML 태그가 응답을 보내진 것을 알 수 있다.
HTTP 바디 생성 - 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 {
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
HelloData helloData = new HelloData();
helloData.setUsername("kyj");
helloData.setAge(28);
// helloData를 json으로 변환
String result = objectMapper.writeValueAsString(helloData);
response.getWriter().write(result);
}
}

- ContentType을 application/json으로 지정해야 한다.
- Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString()을 통해 객체를 JSON으로 변환할 수 있다.
'Java' 카테고리의 다른 글
| [Java] 서블릿의 요청 처리 - HttpRequestServlet (0) | 2023.08.14 |
|---|---|
| [Java] 서블릿(Servlet)의 개념과 동작 과정 (0) | 2023.08.13 |
| [Java] 상속과 참조변수 형변환을 활용한 다형성 구현 (0) | 2023.04.29 |
| [Java] 오버로딩 vs 오버라이딩 (0) | 2023.04.21 |
| [Java] 메서드의 기본형 매개변수와 참조형 매개변수 (0) | 2023.04.13 |