티스토리 뷰
모든 서블릿은 javax.servlet.servlet의 인터페이스를 구현한다
javax.servlet.servlet 안에는 5개의메소드가 있는데 getServletlnfo, getServletConfig 그중 init, service, destroy는 생명주기와 연관있다
init 은 최초요청이 들어와서 서블릿 클래스를 인스턴스화하고 init을 실행한다
init은 요청이 들어오기전에 성공적으로 끝내야한다
init안의 내용은 초기값 관련내용으로 채워지며 오직1번만 실행되는것만 작성할수있다.
보통은 init안을 비워둔다
service request객체와 response객체를 받고 그것들을 가지고 일을 처리한다
destroy 톰켓이 종료되었거나 메모리정리가 필요한시점 service에서 모든 스레드가 빠져나간뒤 제한시간후에 호출된다
완전한 기능을 갖춘 서블릿 컨테이너는 서블릿의 HTTP 요청을 다음과 같이 처리해야 한다.
어떤 서블릿을 처음으로 요청받았을 때, 해당 서블릿 클래스를 로드하고 서블릿의 init 메
소드를 (딱 한 번) 호출한다.
각 요청에서 javax. servlet. ServletRequest와 javax. servlet. ServletResponse 인스턴스를 생성한다.
ServletRequest와 ServletResponse 객체를 전달해 서블릿의 service 메소드를 호
출한다.
서블릿 클래스를 종료하면서 서블릿의 destroy 메소드를 호출하고 서블릿 클래스를 언로
드해야 한다
1장의 await과는 다르게 정적자원만 처리하는게 아닌 서블릿에대한 처리도할수있다
serVletRequest를 구현한 request를 사용하기때문에 serVletRequest의 모든 메소드를 구현해야한다
지금은 필요한거만 구현하고 차후에 다 구현
serVletResponse를 구현한 response를 사용하기때문에 serVletRequest의 모든 메소드를 구현해야한다 지금은 필요한거만 구현하고 차후에 다 구현
autoflush(printwriter에 데이터가 들어오면 바로 그걸 전송)가 true면 println일경우 바로 보내지만 print는 보내지않는다
서블릿 요청 처리방법
1. uri를 가져온다 /servlet/어쩌구servlet
2. 서블릿 이름을 추출한다 어쩌구servlet
3. URI클래스로더를 생성한다
4. URI클래스로더에게 로드할 클래스들이 있는곳을 알려준다
5. 로드할 클래스들이 있는곳으로 가서 서블릿이름에 맞는 클래스를 로드한다
6. 그 로드한 서블릿클래스를 인스턴스화한다
7. 인스턴스화된 서블릿의 service를 호출하여 인자로받은 servletRequest, servletResponse를 service의 인자로 넘겨준다
URI클래스로더는 클래스로더의 자식클래스이며 3가지 생성자를이용하여 만들수있다
그중 간단한 urls 인자만 주면 생성할수있는데 urls는 검색할위치가 담긴 배열을 주면된다
서블릿 컨테이너에서 클래스로더가 로드할 클래스들이 있는곳을 레파지토리라고한다
init이 최초1번만 실행되는이유는 서블릿 인스턴스가 만들어지면 그것의 스레드를 만들어서 사용한다 앞으로 이거에대한 요청이 들어올시 인스턴스가 만들어지게아니라 스레드가 만들어지기때문에 init은 최초1번만 호출된다
2장의 첫번째 어플리케이션에서 request를 service에 인자로주는데 servletRequest로 업캐스트되서 넘겨주기때문에 다른사용자가 다운캐스팅해서 막 쓰게되면 보안이 위험해질수있기 때문에
2번째 어플리케이션에서는 퍼사드패턴을 이용한 퍼사드 리퀘스트객체를 만들어서 request객체를 퍼사드 리퀘스트객체의 인자로 주게되면 servlet리퀘스트로 들어가기때문에 다운캐스팅을 하더라도 servletRequest이기때문에 request가 가지고있던 parse, parseuri는 조금 안전해질수있다