본문 바로가기
Spring

HttpServletResponse 사용법 + 응답 데이터 정리 / Framework없이 순수 Java로 web MVC 구현해보기

by 리승우 2022. 12. 17.

Framework없이 순수 Java만으로 Web MVC를 구현하려고 하는 중이다.

그러기 위해서 Dispatcher Servlet을 스스로 구현해야 하는 상황인데, HTTP 응답 데이터에 관한 내용도 숙지해놓아야 하기에 공부를 시작하는 중이다!!

 

https://github.com/iswoos/no_DispatcherServlet_java

 

GitHub - iswoos/no_DispatcherServlet_java: 순수 Java로 Servlet 이용하기

순수 Java로 Servlet 이용하기. Contribute to iswoos/no_DispatcherServlet_java development by creating an account on GitHub.

github.com

HttpServletResponse 역할

 

HTTP 응답 메시지 생성

- HTTP 응답코드 지정 (404, 401 등등)

- 헤더 생성

- 바디 생성

 

편의 기능 제공

- Content-Type, 쿠키, Redirect

 

 

HttpServletResponse 사용법

 

hello.servlet.basic.response.ResponseHeaderServlet

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(200);
        */

        // 상태코드 200이라는 의미임.
        // [status-line]
        response.setStatus(HttpServletResponse.SC_OK);

        // [response-headers]
        // 이걸로 귀찮게 세팅하는 방법을 떠나, 아래에 있는 "Header 편의 메서드"들로 간편하게 세팅할 수 있다.
        response.setHeader("Content-Type", "text/plain;charset=utf-8");
        response.setHeader("Cache-Control", "no-cache, no-store, mustrevalidate");
        response.setHeader("Pragma", "no-cache");
        //내가 원하는 임의의 header "my-header"를 만들 수 있음.
        response.setHeader("my-header","hello");

        // [Header 편의 메서드]
//        content(response);
//        cookie(response);
//        redirect(response);


        //[message body]
        PrintWriter writer = response.getWriter();
        writer.println("ok");
    }

 

실행한 뒤 /response-header로 접속하면 웹 브라우저에 ok가 노출되고 있으며, 

Response Hearders 값들은 아래와 같이 지정되어 있다.

 

 

Content 편의 메서드

    // Content 편의 메서드
    // 해당 값으로 Header의 Content를 간편하게 세팅할 수 있다.
    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);
    }

 

redirect 편의 메서드

// redirect 편의 메서드
    // 해당 값으로 redirect를 간편하게 세팅할 수 있다.
    // 해당 코드로 인해 /basic/hello-form.html 주소지로 redirect된다.
    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");
    }

 

 

HTTP 응답 데이터 - 단순 텍스트, HTML

HTTP 응답 메시지는 주로 다음 내용을 담아서 전달한다.

 

- 단순 텍스트

    - 응답 앞에서 살펴봄 ( writer.println("ok"); )

- HTML 응답

- HTTP API - MessageBody JSON 응답

 

 

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 {
        //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>안녕?</div>");
        writer.println("</body>");
        writer.println("</html>");
    }
}

HTTP 응답으로 HTML을 반환할 때는 content-type을 text/html 로 지정해야 한다.

 

 

 

HTTP 응답 데이터 - API JSON 응답

hello.servlet.web.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 {

        //Content-Type: application/json
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");

        HelloData helloData = new HelloData();
        helloData.setUsername("kim");
        helloData.setAge(20);

        //{"username":"kim","age":20}
        String result = objectMapper.writeValueAsString(helloData);
        response.getWriter().write(result);
    }
}

HTTP 응답으로 JSON을 반환할 때는 content-type을 application/json 로 지정해야 한다.

Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString() 를 사용하면 객체를 JSON 문자로 변경할 수 있다.

 

댓글