1) HttpServletResponse 역할
- HTTP 응답 메시지 생성
- HTTP 응답 코드 지정
- 헤더 생성
- 바디 생성
- 편의 기능 제공
- Content-Type, 쿠키, Redirect
2) 기본 사용법
package hello.servlet.basic.response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "responseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setStatus(HttpServletResponse.SC_OK);
response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("my-header","hello");
content(response);
cookie(response);
redirect(response);
PrintWriter writer = response.getWriter();
writer.println("ok");
}
}
Content 편의 메서드
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);
response.addCookie(cookie);
}
redirect 편의 메서드
private void redirect(HttpServletResponse response) throws IOException {
response.sendRedirect("/basic/hello-form.html");
}
3) HTTP 응답 데이터
- HTTP 응답 메시지는 주로 다음 내용을 담아서 전달함
- 단순 텍스트 응답
- 앞에서 살펴봄(
write.println("ok"))
- HTML 응답
- HTMP API - MessageBody JSON 응답
(1) HttpServletResponse - HTML 응답
hello.servlet.web.response.ResponseHtmlServlet
package hello.servlet.basic.response;
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;
import java.io.PrintWriter;
@WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
public class ResponseHtmlServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println(" <div>안녕?</div>");
writer.println("</body>");
writer.println("</html>");
}
}
- HTTP 응답으로 HTML을 반환할 때는 content-type을
text/html로 지정해야 함
실행
4) HTTP 응답 데이터 - API JSON
hello.servlet.response.ResponseJsonServlet
package hello.servlet.basic.response;
import com.fasterxml.jackson.databind.ObjectMapper; import hello.servlet.basic.HelloData;
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;
@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.setHeader("content-type", "application/json");
response.setCharacterEncoding("utf-8");
HelloData data = new HelloData();
data.setUsername("kim");
data.setAge(20);
String result = objectMapper.writeValueAsString(data);
response.getWriter().write(result);
}
}
- HTTP 응답으로 JSON을 반환할 때는 content-type을
application/json으로 지정해야 함
- jackson 라이브러리가 제공하는
objectMapper.writeValueAsString()를 사용하면 객체를 JSON 문자로 변환할 수 있음
실행
참고
application/json은 스펙상 utf-8 형식을 사용하도록 정의되어 있음
- 그래서 스펙에서
charset=utf-8과 같은 추가 파라미터를 지원하지 않음
- 따라서
application/json이라고만 사용해야지 application/json;charset=utf-8이라고 전달하는 것은 의미없는 파라미터를 추가한 것이 됨
response.getWriter()를 사용하면 추가 파라미터를 자동으로 추가해버림
- 이때는
response.getOutputStream()으로 출력하면 그런 문제는 발생하지 않음
강의 출처 : 스프링 MVC 1편