서블릿 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_BAD_REQUEST);
// [response-header]
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);
PrintWriter writer = response.getWriter();
writer.println("ok");
}
}
HTTP 응답 데이터이다. 사용자가 요청을 하는 것이 아니라, 해당 url로 들어가면 개발자가 setHeader로 설정한 헤더를 통해 응답을 해주는 것이다.
setHeader 4줄이 있는데 첫 번째 줄은 기본 형식으로 데이터를 응답해주는 것이고, 2, 3번째 줄은 이전 데이터를 삭제하는 등 정보가 잘 유지되게 하는것이다.
4번째 response.setHeader("my-header", "hello");는 my-header라는 key값과 hello라는 value를 가진 Header를 내가 직접 만든 것이다. url에 들어가서 개발자 정보를 보게 된다면 위의 헤더들이 잘 응답하는 것을 확인할 수 있다.
쿠키와 리다이렉트
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");
}
쿠키를 만들거나 리다이렉트를 하는 방법이다.
여러 방법이 있지만 가장 좋은 방법은 쿠키는 쿠키 객체를 생성하고 생성값과 maxAge를 설정한 다음 response.addCookie(cookie)를 통해 쿠키를 넣어주는 것이다.
리다이렉트 해당 url로 리다이렉트할 수 있게 도와주는 것이다.
http:localhost:8080/response-header로 사이트를 들어가도 리다이렉트 해주는 코드가 있으면 바로 http:localhost:8080/basic/hello/-form.html로 넘어가게 된다.
응답 방법
1. 단순 텍스트 응답
2. HTML 응답
3. HTTP API - MessageBody JSON 응답
1. 단순 텍스트 응답
PrintWriter writer = response.getWriter();
writer.println("ok");
}
단순 텍스트로 응답하는 방법이다.
해당 웹 사이트에 들어가면 단순히 ok라는 메세지만 출력하게 된다.
위에 코드에 포함된 내용이라 나머지 코드는 생략했는데 Content-Type은 text/plain으로 지정해줘야 한다.
2. 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"); // 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>");
}
}
html 방식으로 웹 사이트에서 응답을 해주는 것이다.
writer.println안에 들어간 <html>, <body> 등은 웹 사이트에 표시하지 않아서 웹 사이트에 들어가보면 안녕?이라는 문자만 출력되어있다. 만약 특정 고객이 들어간다면 정적이 아니라 동적으로 사용할 수도 있다.
HTTP 응답으로 HTML을 반환할 때는 content-type을 무조건 text/html로 지정해줘야 한다.
3. HTTP API - MessageBody JSON 응답
@WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
public class ResponseJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper(); // json 방식으로 변경하기 위해 꼭 필요함
@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는 따로 만든 클래스(username, age의 객체)
helloData.setUsername("kim");
helloData.setAge(20);
//{"username": "kim", "age": 20} 으로 변경
String result = objectMapper.writeValueAsString(helloData);
response.getWriter().write(result);
}
}
json 방식으로 웹 사이트에서 응답을 할 수 있다.
아주 간단한 예제지만 username과 age를 설정하면 웹 페이지에서 json방식으로 응답해준다.
{"username":"kim","age":20}
웹 사이트에 출력되는 것은 위와 같다.