Chapter.04 서블릿은 평생을 서비스 클라이언트로 삶니다.
서블릿의 일생 (Web Container에 의해서)
- Class Loading : class 찾아서 class loading 한다.
- Servlet Instance : 서블릿의 생성자 실행(디폴트 생성자 실행)
- init() : 전체 일생에서 단 한번만 실행됨. 반드시 service() 이전에 실행 되어야 함.
- service() : 대부분의 시간을 보냄, 클라이어느 요청을 핸들링함. (doGet(), doPost() 실행하고
요청이 들어 올때 마다 새로운 쓰레드에서 실행됨. - destory() : 죽기전에 모든 자원 해지 할 수 있는 기회를 줌.
Servlet 관련 주요 인터페이스 , 클래스
- Servlet Interface (javax.servlet) : 생명주기 관련 메소드가 선언되어 있다.
- service(ServletRequest,ServletResponse)
- init(ServletConfig)
- destory()
- getServletConfig()
- getServletInfo()
- GenericServlet Class (java.servlet) : 추상화 클래스, 대부분의 서블릿 행위가 이 클래스에서 구현 되었다.
- service(ServletRequest,ServletResponse)
- init(ServletConfig)
- init()
- destory()
- getServletConfig()
- getServletInfo()
- getInitParameter(String)
- getInitParameterNames()
- getServletContext()
- log(String)
- log(String,Throwable)
- HttpServlet Class (javax.servlet.http) : 추상화 클래스, HTTP 관련 해서 service() 재정의 함.
HttpServletRequest(Response) 만 파라미터로 받는 새로운 service()메소드를 구현함. - service(HttpServletRequest,HttpServletResponse)
- service(ServletRequest,ServletResponse)
- doGet(HttpServletRequest,HttpServletResponse)
- doPost(HttpServletRequest,HttpServletResponse)
- doHead(HttpServletRequest,HttpServletResponse)
- doOptions(HttpServletRequest,HttpServletResponse)
- doPut(HttpServletRequest,HttpServletResponse)
- doTrace(HttpServletRequest,HttpServletResponse)
- doDelete(HttpServletRequest,HttpServletResponse)
- getLastModified(HttpServletRequest)
- MyServlet : 여러분이 작성은 HTTP 관련 메소드만을 구현 하면 된다.
서블릿 Life Cycle 3 KEY Point
- init() : 클라인언트의 요청을 처리하기 전에 서블릿을 초기화할 기회를 줌
- 재정의 여부 : 초기화할 코드가 있는 초기화 함. (예, DB접속)
- service() : 클라이언트의 HTTP 메소드를 참조 하여 doGet()을 호출하지 doPost() 호출할지 판단합니다.
- 재정의 여부 : 거의 재정의 하지 않는다.
- doGet() / doPost() : 웹 어플리케이션 실제 작업을 하는 곳
- 재정의 여부 : 둘 중 하나는 반드시 재정의 해야 함.
컨테이너 - 서블릿 하나에 대한 다수의 요청을 처리하기 위해 다수의 스레드를 실행하지 다수의 인스턴스를 만들지 말아야 합니다.
- 서블릿 초기화 시점 - 컨테이너 시작 할때(tomcat) , 관련 클래스를 찾아서 로딩 시킴.
- 클래스 로딩 방법
- - class finding & loading
- - Just-In-Time (즉, 실행시 로딩하기
객체가 서블릿이 된다는 것은 :: 서블릿에 따라오는 고유한 권한을 가진다는 것을 의미합니다.
ServletConfig 객체
- 서블릿당 ServletConfig 객체 하나
- 배포시 설정된 정보를 서블릿에게 넘겨 주기 위해서(DB 나 EJB 참조)
- ServletContext에 접근하기
- 파라미터값은 배포 서술자(DD)에서 설정 가능
- 서블릿이 배포하는 동안 수정되지 않는다. 만약 변경 되면 서블릿을 다시 배포 해야 한다.
ServletContext 객체
- 웹 어플리케이션 당 하나
- 웹 어플리케이션의 파라미터 정보를 읽어 오기 위하여 사용합니다.(DD 안에 설정됨)
- 일종의 어플리케이션용 게시판이며 여기에 기록하면 다른 객체에서 참조 가능하다.
- 서버 정보를 파악하기 위해 사용, 예) 컨테이너 이름 및 버젼, 지원하는 API 버젼등
Request / Response 주요 클래스 및 인터페이스
- ServletRequest (javax.servlet) Interface :
- getAttribute(String)
- getContentLength()
- getInputStream()
- getLocalPort()
- getParameter()
- getParameterNames()
- HttpServletRequest (javax.servlet.http) Interface : HTTP 관련 서비스를 제공 합니다.
- getContextPath()
- getCookies()
- getHeader(String)
- getQueryString()
- getSession()
- getMethod()
- ServletResponse (javax.servlet) Interface :
- getBufferSize()
- setContentType()
- getOutputStream()
- getWriter()
- getContentType()
- HttpServletResponse (javax.servlet.http) Interface :
- addCookie()
- addHeader()
- encodeRedirectURL()
- sendError()
- setStatus()
- HttpServletRequest 와 HttpServletResponse 는 누가 구현 하는가 - 컨테이너 , API로 구현된 클래스가 없음.
- GenerlcServlet 과 ServletRequest 와 ServletResponse 있는 이유는 HTTP 이외 사용될것 가정하여 설계 하였기 때문에 있음.
HTTP 메소드
- GET - URL로 자원 또는 파일 달라고 요청함.
- POST - 요청한 URL로 이 정보를 넘겨 주라고 요청함. 부가 정보를 가진 GET 이라고도 함.
- HEAD - 헤더 정보만 요청함. 이는 Response 몸체 정보가 없다는 것 빼고 GET과 동일함.
- TRACE - 요청한 메시지의 loopback 테스트를 요청함. 서버쪽에서 무엇을 받았는지 알고 싶을 때 하는 테스트
테스트 목적혹은 문제 해결을 위해 사용함. - PUT - 동봉한 몸체 정보를 요청한 URL로 올리기 위해 사용함.
- DELETE - 요청한 URL에 있는 자원이나 파일을 삭제하기 위해 사용
- OPTIONS - 요청한 URL이 응답할 수 있는 HTTP 메소드가 무엇인지 요청함.
- CONNECT - 터널링의 목적으로 연결을 요청함.
- 요청 멱등(Idempotent) 이란 - 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미
동일한 작업을 한 번이고 두 번이고 계속 해서 할 수 있습니다. 어떤 부작용도 없이
- method의 기본값 : 만약 <form>에서 method 속성을 생략할 경우는 기본적인 값을 “GET” 임.
- doGet() 과 doPost() 모든 지원 방안
public void doPost(...) throws{
doGet(request,response);
}
- 파라미터 정보 얻는 메소드
- 주어진 paraName에 대한 단일 값인 경우 : getParameter()
- 주어진 paraName에 대한 여러 값인 경우 : getParameterValues() , 배열로 리턴함.
- Request 객체에 얻을 수 있는 정보
- 클라이언트 플랫폼 정보 및 브라우저 정보 :getHeader(“User-Agent”)
- getIntHeader() : 요청 정보의 응답값이 정수형인 경우를 보장한다.
- 요청에 관련된 쿠기 정보 :getCookies();
- 클라이언트의 세션 정보 : getSession();
- Request의 HTTP 메소드 : getMethod();
- Request의 입력 스트림 : getInputStream();
- getRemotePort() : 요청을 보낸 클라이언트의 포트
- getServerPort() : Request가 들어오는 포트 번호
- getLocalPort() : 스레드를 처리 위한 포트
- Response 처리시 주의 사항
** setContentType를 설정 후 정보쓰기 작업을 수행 한다.
JAR를 내려받는 서블릿 코드 (잘 동작할까?)
doGet(...){
response.setContentType(“application/jar”);
ServletContext ctvx = getServletContext();
inputStream is = ctx.getResourceAsStream(“/bookCode.jar”);
int read = 0;
byte[] bytes = new byte[1024];
OutputStream os = response.getOutputStream();
while((read = is.read(bytes) != -1){
os.write(bytes,0,read);
}
os.flush();
os.close();
|
일반적인 MIME 타입
- text/html
- application/pdf
- video/quicktime
- application/java
- image/jpeg
- application/jar
- application/octect-stream
- application/x-zip
다른 URL로 이동 시키기
- 서블릿 Redirect
- 요청을 완전히 다른 URL로 방향을 바꾸는 것
- 클라이언트에서 일어남.
- 관련메소드 : response.sendRedirect(URLString);
- 상대경로 사용가능
- Request Dispatch
- 다른 컴포넌트에게 위임을 하는 것
- 서버에서 일어남
- 관련코드 : request.getRequestDispathcher(“xxx.jsp”).forward(request,response);