차근차근/JAVA JSP

Response 객체

예쁜꽃이피었으면 2014. 7. 26. 01:39

http://www.silverwolf.co.kr/9924

Response는 클라이언트로 돌려보낼 놈입니다. 이 정보를 분석해서 브라우저는 화면을 출력합니다. 일반적으로 Response 객체의 출력 스트림(보통 Writer)을 사용하여 HTML(아니면 다른 타입의 컨텐츠)을 작성합니다. Response 객체에는 I/O 출력 이외에 다른 메소드들도 있습니다.

 

ServletResponse <- HttpServletResponse

 

ServletResponse interface

(javax.servlet.ServletResponse)

 

  • getBufferSize()
  • setContentType()
  • getOutputStream()
  • getWriter()
  • setContentLength()
  • 기타 메소드...
HttpServletResponse interface
(javax.servlet.http.HttpServletResponse)
  • addCookie()
  • addHeader()
  • encodeURL()
  • sendError()
  • setStatus()
  • sendRedirect()
  • 기타 메소드...
대부분 클라이언트에 데이터를 전송하기 위하여 Response 객체를 사용합니다. 이를 위하여 Response 객체의 setContentType()과 getWriter() 메소드를 이용합니다.
그 다음 스트림에  HTML을 작성하거나 아니면 다른 컨텐츠를 기록하거나 하는 I/O 작업을 하면 됩니다.
이외에도 헤더 정보를 설정하거나, 오류를 발생시키거나, 쿠키를 추가할 때도 Response 객체를 사용합니다.

두 가지 출력 방식 : 문자와 바이트
ServletResponse 인터페이스는 두 가지 스트림을 제공합니다. 바이트(bytes)를 출력하기 위한 ServletOutputStream과 문자(character data)를 출력하기 위한 PrintWriter.

PrintWriter

1.PrintWriter writer = response.getWriter();
2.writer.println("some text and HTML");

텍스트 데이터를 출력할 때 사용합니다. 물론 OutputStream으로 문자를 쓸 수 있지만, PrintWriter가 바로 문자를 사용하기 위해 만들어졌습니다.

 

OutputStream

 

1.ServletOutputStream out = response.getOutputStream();
2.out.write(aByteArray);

무엇이든 여기에 써도 무방합니다.

 

PrintWriter는 사실 ServletOutputStream을 둘러싼(wrap) 것입니다. 즉 PrintWriter는 내부에 ServletOutputStream에 대한 참조를 가지고 있으며, 작업을 ServletOutputStream에게 부탁합니다. 사실 클라이언트에 대한 출력스트림은 오직 하나 밖에 없습니다. PrintWriter는 이 스트림에다가 좀더 쓰기 쉽게, 문자를 쉽게 핸들링할 수 있는 메소드들로 ServletOutputStream을 꾸민 것으로 생각하면 됩니다.

 

Response 헤더에 값을 설정, 추가할 수 있습니다.

setHeader()와 addHeader() 둘 다 Response에 헤더(첫 번째 인자)와 값(두 번째 인자)을 추가할 수 있습니다. 차이는 이름 그대로 이미 헤더가 존재할 때 값을 설정(set)하느냐 아니면 추가(add)하느냐 입니다.

 

  • setHeader() 이미 존재하는 값을 덮어 씁니다.
  • addHeader() 값을 하나 더 추가합니다.
setContentType("text/html")도 다음과 같이 바꿔 쓸 수 있습니다.
1.serHeader("content-type""text/html");

1.// 이 이름으로 헤더가 이미 존재한다면, 새로운 값으로 대체합니다. 만약 없다면, 새로운 헤더와 값을 추가합니다.
2.response.setHeader("foo""bar");
3. 
4.// 새로운 헤더(Header)와 값을 추가합니다. 또는 이미 헤더가 존재한다면 값을 하나 더 추가합니다.
5.response.addHeader("foo""bar");
6. 
7.// 현재 존재하는 헤더의 값을 주어진 정수값으로 대체하는 편리한 메소드입니다. 존재하지 않는 헤더라면 헤더와 값을 추가합니다.
8.response.setIntHeader("foo"42);

 

리다이렉트와 디스패치

요청에 대한 응답을 누가할지 선택할 수 있습니다. 요청을 완전히 다른 URL로 방향을 바꿀 수 있으며(이를 리다이렉트(redirect)라고 함), 아니면 웹 애플리케이션에 있는 다른 컴포넌트(보통 JSP)에게 처리를 위임할 수도(이를 디스패치(dispatch)라고 함) 있습니다.


 

 

서블릿 리다이렉트는 브라우저가 이 작업을 합니다.

 

1.if (worksForMe) {
2.// 요청을 핸들링합니다.
3.else {
4.response.sendRedirect("http://www.redirect.com");
5.}

 

sendRedirect()의 URL에 상대 경로 사용하기

sendRedirect()의 인자로 들어가는 URL에 상대경로를 사용할 수 있습니다. 상대경로에는 /로 시작하는 것과 /가 없는 것 두 가지가 있습니다. 제일 먼저 브라우저 주소창에 사용자가 다음과 같이 입력했다고 합시다.

 

 

 

bar.do 서블릿에서 이 요청을 sendRedirect() 메소드를 호출하여 / 없는 상대경로 URL로 방향을 바꾸었다면 :

 

sendRedirect("foo/stuff.html"); 

 

컨테이너는 원래 주소를 가지고 "foo/stuff.html"의 전체 경로를 재작성합니다. (Location 헤더에는 전체 경로가 들어가야 하기 때문입니다) 컨테이너는 원래 경로가 myApp/cool 경로에서 왔다는 것을 알고 있기 때문에 /가 없는 경우에는 "foo/stuff.html" 앞에 원래 경로를 추가하여 절대경로를 만듭니다.

 

http://www.silverwolf.co.kr/myApp/cool/foo/stuff.html

 

그런데 상대 경로가 /로 시작하는 경우에는:

 

sendRedirect("/foo/stuff.html");

 

컨테이너는 웹 애플리케이션에서부터 URL의 전체 경로를 재작성합니다. /는 웹 애플리케이션 루트를 의미합니다(예제에서는 "myApp"가 되겠죠). 이렇게 하면 절대경로는 다음과 같습니다.

 

http://www.silverwolf.co.kr/myApp/foo/stuff.html



반응형

'차근차근 > JAVA JSP' 카테고리의 다른 글

Http 기초  (0) 2014.07.26
Request 객체  (0) 2014.07.26
Response 객체를 이용한 파일 전송  (0) 2014.07.26
[Tip] getWriter() 와 getOutputStream() 차이점  (0) 2014.07.26
inputstreamreader  (0) 2014.07.26