|
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()
- 기타 메소드...
- addCookie()
- addHeader()
- encodeURL()
- sendError()
- setStatus()
- sendRedirect()
- 기타 메소드...
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() 값을 하나 더 추가합니다.
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 |