=========================================
HttpServletResponse 인터페이스
=========================================
1. 인터페이스 형태
public interface HttpServletResponse extends ServletResponse {
public void addCookie(Cookie cookie);
public boolean containsHeader(String name);
public String encodeURL (String url);
public String encodeRedirectURL (String url);
public String encodeUrl(String url);
public String encodeRedirectUrl(String url);
public void sendError(int sc, String msg) throws IOException;
public void sendError(int sc) throws IOException;
public void setStatus(int sc);
public void setStatus(int sc, String sm);
public void sendRedirect(String location) throws IOException;
public void setDateHeader(String name, long date);
public void setHeader(String name, String value);
public void setIntHeader(String name, int value);
public static final int SC_CONTINUE = 100;
public static final int SC_SWITCHING_PROTOCOLS = 101;
public static final int SC_OK = 200;
public static final int SC_CREATED = 201;
public static final int SC_ACCEPTED = 202;
public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
public static final int SC_NO_CONTENT = 204;
public static final int SC_RESET_CONTENT = 205;
public static final int SC_PARTIAL_CONTENT = 206;
public static final int SC_MULTIPLE_CHOICES = 300;
public static final int SC_MOVED_PERMANENTLY = 301;
public static final int SC_MOVED_TEMPORARILY = 302;
public static final int SC_SEE_OTHER = 303;
public static final int SC_NOT_MODIFIED = 304;
public static final int SC_USE_PROXY = 305;
public static final int SC_BAD_REQUEST = 400;
public static final int SC_UNAUTHORIZED = 401;
public static final int SC_PAYMENT_REQUIRED = 402;
public static final int SC_FORBIDDEN = 403;
public static final int SC_NOT_FOUND = 404;
public static final int SC_METHOD_NOT_ALLOWED = 405;
public static final int SC_NOT_ACCEPTABLE = 406;
public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
public static final int SC_REQUEST_TIMEOUT = 408;
public static final int SC_CONFLICT = 409;
public static final int SC_GONE = 410;
public static final int SC_LENGTH_REQUIRED = 411;
public static final int SC_PRECONDITION_FAILED = 412;
public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;
public static final int SC_REQUEST_URI_TOO_LONG = 414;
public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
public static final int SC_INTERNAL_SERVER_ERROR = 500;
public static final int SC_NOT_IMPLEMENTED = 501;
public static final int SC_BAD_GATEWAY = 502;
public static final int SC_SERVICE_UNAVAILABLE = 503;
public static final int SC_GATEWAY_TIMEOUT = 504;
public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
}
2. 목 적
HTTP 프로토콜의 응답 생성을 편리하게 한다.
응답 상태 설정
- setStatus(int sc), setStatus(int sc, Stirng sm)
정상적인 응답의 경우에 상태코드(sc)를 설정한다.
응답부를 Return 하기전에 호출되어야 한다.
3. 응답상태코드
SC_OK(코드:200) : 클라이언트의 요청이 성공임을 표시, 서버의 응답은 요청된
자료를 포함(Default Message : OK)
SC_MOVED_PERMENTLY(코드:301) : 요청된 리소스가 영구적으로 새위치로 이동,
새위치는 Location Header에 포함(Default Msg : Moved
Permanently)
SC_MOVED_TEMPORARILY(코드:302) : 요청된 리소스가 임시로 새위치로 이동,
새로운 위치는 Location Header에 포함
(Default Msg : Moved Temporaily)
SC_NOT_FOUND(코드 : 404) : 요청된 Resource가 없는 경우
(Default Msg : Not Found)
SC_INTERNAL_SERVER_ERROR(코드:500) : 예상치못한 오류가 서버내에서 발생
(Default Msg : Internal Server Error)
SC_CREATED(코드:201) : 요청은 성공되었고,서버에서 새로운 Resource가
생성되었음을 표시
(Default Msg : Created)
4. 오류 재지정을 위한 응답
- sendError(int sc, String msg) throws IOException
클라이언트에게 상태 코드 sc 및 상세 메시지 msg과 함께 오류 응답을 전송 한다.
- sendError(int sc) throws IOException
디폴트 메시지로 오류 응답을 전송한다.
서블릿이 요청을 처리하는 동안 오류설정
- sendRedirect(String location) throws IOException
클라이언트에게 재지정 URL(location) 과 함께 재지정 응답을 전송한다.
5. 응답 헤더 설정 : 헤더 이름(name)에 대하여 그 값(value)을 설정한다.
setHeader(String name, String value)
setIntHeader(String name, int value)
setDateHeader(String name, long date)
boolean containsHeader(String name)
HTML
<META HTTP-EQUIV>
예: <META HTTP-EQUIV=“name” CONTENT=“value”>
6. 응답헤더
Chache-Control : 해당 문서에 대해 캐싱 시스템이 처리해야 하는 방식을 표시
no-cache(캐시되어서는 안된다),no-store(프록시서버에의해
캐시되거나, 저장되어서는 안된다) HTTP/1.1에 도입
Pragma : HTTP1.0의 Cache-Control과 같은것, no-cache만 사용가능
Connection : Client와의 접속을 유지할지 여부표시, Keep-Alive나 close등으로
표시, 서블릿에서 자신의 Content-Length Header를 세팅하면 자동적
으로 Keep-Alive갑으로 설정됨
Location : 문서의 새로운 위치를 기술, SC_CREATED,
SC_MOVED_PERMENENTLY, SC_MOVE_TEMPORARILY등의
상태코드와 함께 사용, 이헤더의 값은 http://를 포함해야 한다
------------------------
예제(sendError예제)
------------------------
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class FileNotFound extends HttpServlet {
int count=0;
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/plain; charset=euc-kr");
PrintWriter out = res.getWriter();
try {
FileReader fr = new FileReader("bitcamp.txt");
BufferedReader br = new BufferedReader(fr);
String initial = br.readLine();
count = Integer.parseInt(initial);
}
//c:\javawebserver2.0 아래에 BITCAMP.TXT 라는 파일이 없는 경우에
//Client Broser에 오류메시지를 전송
catch (FileNotFoundException ignored) {
FileNotFoundError(res,"bitcamp.txt File Not Found!!" + "\r\n " + ignored);
}
out.println("count ---> " + count);
}
//FileNotFound Exception을 처리하는 에러루틴
public void FileNotFoundError(HttpServletResponse res,String message) throws IOException {
//응답중에 오류메시지 전송시 sendError 사용
res.sendError(res.SC_NOT_FOUND,message);
}
}
------------------
예제2(이미지 검색)
------------------
[imageRetriever.html]
<html>
<head><title> Image 검색 Servlet </title></head>
<body>
<form method=get action=/servlet/ImageRetriever>
<input type=file name=gifLocation>
<input type=submit name=ok>
</form>
</body>
</html>
-------------
/* Local PC의 이미지 파일을 읽어 Local Browser에 이미지를 출력하는 Servlet */
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ImageRetriever extends HttpServlet {
public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException {
String file =req.getParameter("gifLocation"); //file의 물리적경로를 읽는다.
try {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(512);
int imageByte;
while((imageByte = in.read()) != -1) {
byteStream.write(imageByte);
}
in.close();
res.setContentType("image/gif");
res.setContentLength(byteStream.size());
byteStream.writeTo(res.getOutputStream());
} catch(IOException ioe) {
reportError(res, "Error: " + ioe);
}
}
//에러 처리루틴
public void reportError(HttpServletResponse res,String message) throws IOException {
response.sendError(res.SC_NOT_FOUND,message);
}
}
------------------
예제3(Redirector)
------------------
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Redirector extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/html; charset=euc-kr");
PrintWriter out = res.getWriter();
String site = "http://www.bitcamp.co.kr";
res.setStatus(res.SC_MOVED_TEMPORARILY);
res.setHeader("Location", site);
}
}
//아래의 2줄은 아래2줄은
//res.sendRedirect(site)및res.setHeader("refresh", "0; URL="+site)와 동일