서블릿의 응답 처리 - 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으로 변환할 수 있다.

+ Recent posts