HTTP 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 {
//status-line
response.setStatus(HttpServletResponse.SC_OK); //http 응답코드 200으로 적어도 되지만 이미 선언되어있는 상수를 사용하는게 의미 있는 값으로 사용할 수 있음.
//response-header
//response.setHeader("Content=Type", "text/plain;charset=urf-8"); //응답하는 데이터의 타입
response.setHeader("Cache=Control", "no-cache, no-store, must-revalidate"); //캐시를 저장하지 않게
response.setHeader("Pragma", "no-cache"); //캐시를 저장하지 않게2
response.setHeader("my-header", "hello"); //커스텀 헤더
//header 편의 메서드
content(response);
cookie(response);
//redirect(response);
//message body
PrintWriter writer = response.getWriter();
writer.write("ok");
}
private void content(HttpServletResponse response) {
//Content-Type: text/plain;charset=utf-8
//Content-Length: 2
//response.setHeader("Content-Type", "text/plain;charset=utf-8");
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");
}
}
우리가 웹 프로젝트를 사용하면 api 통신이 아닌 내부 통신의 경우 html 소스를 그대로 반환해야하는 경우가 있다. 이럴때 servlet에서 html 코드를 어떻게 처리해주는지 확인하는 예시를 코드로 보자.
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 {
//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>hi 에이치 아이</div>");
writer.println("</body>");
writer.println("</html>");
}
}
간단해 보이지만 우리가 사실 저렇게 간단한 html을 보내진 않는다... 엄청나게 복잡한 html 소스를 보낼텐데 그걸 다 저렇게 해줘야하는 것이다. 서블릿 너무 감사하다... 하여튼 저런식으로 소스를 response를 보내면
이런 결과를 얻을 수 있는데. 아까 메세지 바디에 텍스트만 담은것과 차이가 없다고 생각할 수 있다. 하지만 소스보기를 눌러 보거나 개발자 도구를 켜서 response를 확인해 보면
다음과 같이 html 소스가 그대로 내려온 것을 확인할 수 있다.
위의 html로 응답하는 방법도 있지만 요즘 가장 많이 사용되는 api 방식으로 응답하는 방법도 있다. 이것도 소스로 확인해보자!
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 {
//Content-Type: application/json
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
HelloData helloData = new HelloData();
helloData.setUsername("choi");
helloData.setAge(28);
//{"username":"choi", "age":28}
String result = objectMapper.writeValueAsString(helloData);//class를 파싱하여 json 형식 string으로 변환
response.getWriter().write(result);
}
}
방법은 똑같은데 우리가 세팅해주는 방법이 좀 달라진다. 먼저 Content-Type을 application/json으로 세팅해줘야하고 응답하는 데이터를 직접 손으로 {"key":"value"} 형식의 String을 만들어서 보내도 되겠지만 ㅎㅎ 우리는 class를 만들어서 json library를 통해 파싱하여 데이터를 간단하게 변환할 수 있으니까 저번에 사용했던 helloData를 통해 값을 세팅하고 jackson을 통해서 String으로 변환 후 response에 담아서 내보내면 된다. 이건 그냥 단순한 json으로 응답하는 과정을 만들어 봤다.