2010-01-13 4 views
3

서블릿 프로그램의 커플을 작성하지만 서블릿이 어떻게 실행되는지 완전히 이해하지 못한다고 생각합니다. 그래서 여기에 내가 가진 커플 질문이 있습니다 :서블릿은 어떻게 작동합니까?

서블릿에 대해 쓴 모든 코드는 넷빈즈에서 아파치 톰캣과 함께 실행됩니다. 서블릿에 요청하는 HTML 파일을 실행할 때 일반적으로 서블릿을 찾을 수 없다는 오류가 발생하고 서블릿을 다시 배포해야합니다. 그러면 모든 것이 정상적으로 실행됩니다. 잠시 후에 서블릿 시간 초과가 된 것처럼 보입니다.

서블릿이 항상 실행됩니까? 서블릿에는 init() 및 destroy()가 있으므로 항상 실행하지 않는 것이 좋습니다. 그렇다면 언제 시작할까요? 언제 끝나요? 클라이언트로부터의 요청이있을 때 시작하여 타임 아웃 될 때 종료합니까? 그리고 어떻게하면 서블릿을 끊임없이 재배치해야만하는지 문제를 해결할 수 있습니다. 고맙습니다.

답변

4

일반적으로 서블릿은 시스템 종료시 (예 : Tomcat과 같은 응용 프로그램 컨테이너가 종료 된 경우)에만 파괴됩니다. 그렇지 않으면 응용 프로그램이 실행되는 동안 메모리에 남아 있습니다. Netbeans 설정에서 어떤 일이 벌어지는 지 말할 수는 없지만 WAR 파일을 독립 실행 형 Tomcat 설치에 배포하고 문제가 해결되지 않는지 확인하십시오.

응용 프로그램 컨테이너가 서블릿에서 destroy을 호출하는 또 다른 시간은 메모리가 부족한 경우입니다. 그러나 이것은 덜 일반적입니다.

요청과 관련하여 서블릿은 많은 요청을 처리하도록 설계되었습니다. 서블릿은 애플리케이션 스코프이지만 요청에는 자체 스코프가 있다고합니다.

+0

WAR 파일을 독립 실행 형 Tomcat에 배포 할 때 Apache Tomcat 폴더의 webapps 폴더에있는 WAR 파일을 의미합니다. 나 맞아? 실제로 배포하려면 다른 작업을해야합니까, 그렇지 않으면 Tomcat이 자동으로 WAR 파일을 배포합니다. –

+1

아니요, Tomcat이 자동으로 WAR 파일을 확장합니다. WAR 파일과 같은 이름을 가진'webapps' 디렉토리를 볼 때 이런 일이 일어 났음을 알 수 있습니다 (예를 들어,'myapp.war'를 배치했다면'$ CATALINA_HOME/webapps/myapp /). 사용중인 Tomcat의 버전에 따라 Tomcat을 다시 시작해야 할 수도 있고 자동으로 발생할 수도 있습니다. – danben

0

당신이 서블릿의 라이프 사이클을 연구 할 필요가 - 그게 무슨 초기화() 파괴 방법은 거기에 있습니다입니다

일반적으로()을 serlvet가 첫 번째 (호출 될 때, 한 번이라고 초기화하기 당신은 세트 같은 짓을하지 않는 한 컨테이너가 종료 될 때 호출되는)() 바람둥이에

을 자동으로 실행하고 파괴

의 doPost() 또는의 doGet()가 (그것이 HTTP 서블릿의 경우) 각 요청

1

서블릿 "에 대한라고 실행될 때 "실행됩니다. 서버는 클라이언트로부터 연결이 오기를 기다리고 헤더를 읽고 web.xml의 매핑을 기반으로 적절한 서블릿을 찾은 다음 해당 서블릿의 service() 메서드를 호출합니다. 서블릿 객체는 컨테이너가 처리하기로 결정할 때까지 메모리에 남아 있습니다 (요청을 처리하지 못하는 경우 언제든지 수행 할 수 있음). 서버가 특정 서블릿 인스턴스를 처리하기로 결정하면 다음에 서블릿에 대한 요청이 들어올 때 새 서블릿 인스턴스를 생성합니다.

즉, 서블릿을 찾을 수 없다는 오류 메시지가 표시되지 않습니다. 응용 프로그램이 배포되었고 정확한 서블릿 매핑이 있다고 가정하면 컨테이너는 요청을 처리 할 수 ​​있습니다. 요청을 수정하고 정확한 오류 메시지를 붙여 넣으면 다른 사람이 왜 이런 일이 일어나지 않았는지 말할 수 있습니다.

+0

감사합니다. 귀하의 응답은 제게 많은 도움이됩니다. 내 서블릿이 종료되는 경우는 드물다. 그럴 때, 나는 정확한 오류를 게시하려고 노력할 것이다. 지금 당장은 WAR 파일을 독립 실행 형 TOMCAT에 배치하려고 시도합니다. –

2

서블릿을 개발하는 중일 것입니다. 또는 Servlet 클래스 중 하나를 변경할 때마다으로 webapp이 으로 완전히 게시되도록해야합니다. 그렇지 않으면 리소스를 찾을 수없는 위험이 있습니다.

쉬운 용어로 "자원을 찾을 수 없음"오류는 기본적으로 "404 페이지를 찾을 수 없습니다"와 동일합니다.서블릿 컨테이너가 URL과 일치하는 리소스 또는 url-pattern을 찾지 못하는 것 같습니다. 그게 다야.

Servlet 라이프 사이클에 관해서는, 그것은 웹 애플리케이션의 시작 (문맥의 작성, 게시)에 init() 메서드가 호출되고 인스턴스가 종류에서 서버의 메모리에 저장됩니다 동안 한 번 만 을 생성됩니다 Map<Url-Pattern, Servlet>init() 메서드를 에 오버라이드 한 경우Servlet이 호출됩니다. 서블릿 컨테이너는 web.xml에 선언 된 모든 서블릿 (또는 Java EE 6에 따라 @WebServlet으로 주석 처리 됨)에 대해 동일한 작업을 수행합니다.

URL이 Servleturl-pattern과 일치 할 때마다 service() (상속 된) 메서드가 호출됩니다. 그런 다음 보통 HttpServlet 구현은 HttpServletRequest#getMethod()을 기반으로 실행할 메소드를 결정합니다. Servlet에있는 해당 메서드 (doGet(), 등)를 재정의 한 경우 그에 따라 호출됩니다.

마지막으로 웹 응용 프로그램이 종료 될 때 (게시 취소, 컨텍스트 삭제) 서버의 메모리에 유지되는 Servlet 인스턴스에 대해 destroy()이 호출됩니다. destroy() 메서드를 으로 재정의 한 경우Servlet이 호출됩니다.

+0

"웹 응용 프로그램이 완전히 게시되었는지 확인하십시오."라는 메시지가 표시되면 업데이트 된 WAR 파일을 Tomcat의 webapp 폴더에 복사한다는 의미입니까? –

+0

넷빈즈를 사용하지는 않지만 이클립스에서는 서버 콘솔에 "동기화 됨"상태가 표시됩니다. Netbeans에 비슷한 것이 있는지 확인하십시오. – BalusC

관련 문제