Link
Today
Total
12-01 18:54
Archives
관리 메뉴

초보개발자 긍.응.성

Servlet 구조 분석(5) - ServletResponse 본문

WEB

Servlet 구조 분석(5) - ServletResponse

긍.응.성 2020. 4. 18. 19:40
반응형

Servlet 구조 분석(4) - ServletRequest 에 이어서, Servlet interface의 service 메서드의 파라미터로 들어오는 응답, ServletRespone에 대해 분석해보았습니다.

 

Servlet 구조 분석(4) - ServletRequest

Servlet 구조 분석(3) - HttpServlet 스터디에 이어서 Servlet interface의 service 메서드의 파라미터로 들어오는 요청, ServletRequest에 대해 분석해보았습니다. Servlet 구조 분석(3) - HttpServlet Servlet..

ckddn9496.tistory.com

 

void service(ServletRequest request, ServletResponse response) // in interface Servlet

7. Interface ServletResponse

서블릿이 클라이언트에 응답을 보내는데 필요한 객체를 정의한다. 서블릿 컨테이너는 ServletResponse 객체를 생성 후 service 메서드의 파라미터로 전달한다.

Response Body로 데이터를 보내는 방법은 두 가지가 존재한다.

  • getOutputStream(): ServletOutputStream - Binary data를 전송 또는 Binary + Text data
  • getWriter(): PrintWriter - Character data 전송

전송하려는 Response Body 데이터는 web-app의 ServletContext에서 지정한 characterEncoding 방식을 통해 인코딩 된다.
두 개 이상의 인코딩 기술이 지정되어 있다면 순서를 우선순위로 두고 인코딩에 사용한다.
request마다 아래의 얻을 수있는 아래의 값들을 이용하며 참조하며, 아무것도 지정되지 않았을 경우 ISO-8859-1을 따른다.

  • setCharacterEncoding(String)
  • setContentType(String)
  • setLocal(Local)

세 메서드들은 모두 적어도 Writer를 부르기 전에 호출되어야 하고, 응답이 commit 되기 전 encoding 되어야 한다.

package javax.servlet;
...
public interface ServletResponse {
    String getCharacterEncoding();
    // character encoding(MIME charset) 의 이름을 반환한다 
    // ex> UTF-8

    String getContentType();
    // 응답 바디에 대한 Content type을 반환한다
    // 응답 바디가 commit되기 전에 반드시 setContentType이 지정되어야 한다.
    // ex> text/html; charset=UTF-8
    // ex> null (아무 content-type 도 지정되지 않았을 때)

    ServletOutputStream getOutputStream() throws IOException;
    // Binary data response를 전송하기위한 ServletOutputStream(outputStream)을 반환한다.
    // 서블릿 컨테이너는 binary data 이므로 encode 하지않는다
    // getWriter() 메서드와 이 메서드 중 하나만 사용되어야 한다
    // 직전에 reset()을 호출했다면 이전에 getWriter()를 호출했어도 이 메서드를 사용 가능하다

    PrintWriter getWriter() throws IOException;
    // Character data Response를 전송하기 위한 PrintWriter를 반환한다
    // 지정된 encoding방식으로 인코딩한다 (지정되지 않았다면 ISO-8859-1 을 따른다)
    // getOutputStream() 메서드와 이 메서드 중 하나만 사용되어야 한다
    // 직전에 reset()을 호출했다면 이전에 getOutputStream()을 호출했어도 이 메서드를 사용 가능하다

    void setCharacterEncoding(String charset);
    // Client에게 함께 보내질 Response의 인코딩 방식을 지정한다

    void setContentLength(int len);
    // 전송하는 Body의 길이이다.
    // HTTP에서 Content-Length 헤더의 값으로 사용된다

    void setContentLengthLong(long len);
    // setContentLength와 같으나 자료형이 long 형이다, 더 긴 body에 대해 처리할 수 있다

    void setContentType(String var1);
    // Client에게 전송될 response의 content-type을 지정한다.
    // write하기 전에지정되어야 만 한다
    // HTTP에서 Content-Type 헤더의 값으로 사용된다.

    void setBufferSize(int size);
    // 선호하는 응답 바디의 버퍼 크기를 지정한다
    // 입력받은 사이즈보다 에서 서블릿 컨테이너는 최대한 작은 사이즈로 버퍼크기를 지정한다 (알뜰하다)
    // 버퍼사이즈가 크면 더 많은 내용을 한번에 보내고 그 만큼 Header와 Status code를 작성하는 시간이 줄어든다
    // 버퍼사이즈가 작으면 서버의 memory를 적게 사용할 수 있으며, 빠른 응답이 가능하다

    int getBufferSize();
    // 응답 버퍼의 사이즈를 반환한다. 버퍼를 사용하지 않으면 0을 반환한다

    void flushBuffer() throws IOException;
    // 버퍼의 내용을 강제로 클라이언트에게 전송한다. 이때 header와 status code가 작성된다.

    void resetBuffer();
    // Header와 status code를 남기고 buffer를 비운다
    // IllegalStateException: 전송을 마친 상태에 발생하는 예외

    boolean isCommitted();
    // Response가 commit되었는지 여부를 반환한다

    void reset();
    // buffer에 존재하는 데이터와 status code, header등을 모두 비운다.
    // getWriter(), getOutputStream() 도 초기화된다.

    void setLocale(Locale loc);
    // 응답의 locale을 지정한다
    // 응답은 commit되지 않은 상태여야만 한다
    // HTTP에서 Content-Language 헤더의 값을 결정하는 요인이된다.

    Locale getLocale();
    // 응답의 Locale 값을 반환한다
}


※ 참고자료

반응형
Comments