2010-11-01 7 views
8

에 액세스하는 동안 나는 그런 시나리오에 대한 실용적인 사례를 실제로 생각할 수는 없지만, 이것은 순수하게 호기심으로 이끌어내는 질문으로 생각합니다.서블릿 인스턴스

서블릿 컨테이너가 서블릿으로 생성 된 모든 인스턴스를 보유하고 있음을 이해하고 요청 스레드를이 인스턴스에 위임합니다. 컨테이너 인스턴스 범위 밖에서 서블릿 인스턴스의 라이프 사이클을 변경하려는 부당한 요청을 피하기 위해 이러한 인스턴스를 관리하는 것도 의미가 있습니다.

하지만 실제로 서블릿 인스턴스에 액세스 할 수있는 방법이 있습니까?

답변

5

서블릿 2.1 (이미 10 년 이상 된) 이전에는 ServletContext#getServlet()을 사용할 수있었습니다. 그러나 그 이후로는 더 이상 사용되지 않습니다. 그것이 나쁜 디자인이기 때문에 간단합니다. 요청 - 응답 체인에서 서블릿 내부에서 다른 서블릿을 호출하려면 RequestDispatcher#include()을 사용하십시오. 다른 서블릿의 서블릿이 아닌 특정 메소드를 호출하려면 해당 코드를 별도의 자바 클래스로 리팩터링하여 두 서블릿 모두에서 가져올 수 있습니다.

+0

매우 흥미로운 행동입니다. JSP의 컨텍스트에만 "포함"한다는 사실을 알고 있었지만 서블릿 서비스 메소드를 체인으로 연결할 수 있다는 사실은 뉴스로 제공됩니다. 학습에 감사드립니다. – anirvan

+0

여전히이 기술은 디자인 냄새를 나타 내기 때문에주의해서 사용해야합니다. 종종 호출 서블릿은 처음부터 필터 였거나 [프런트 컨트롤러] (http://stackoverflow.com/questions/3541077/design-patterns-web-based-applications)를 따르도록 변형되어야합니다. /) 패턴. – BalusC

2

컨테이너는 서블릿의 인스턴스 하나만 생성하고 같은 인스턴스를 사용하여 여러 요청을 처리합니다. "SingleThreadModel"이 있습니다. 구현하면 컨테이너가 여러 개의 Servlet 인스턴스를 만들지 만 지금은 더 이상 사용되지 않습니다.

0

표준 Servlet API를 통하지 않으므로 (응답이 아니오)

그러나 실제 구현 및 불쾌한 속임수에 대한 지식을 사용하여 구현에서 서블릿 인스턴스를 보유하는 데 사용되는 데이터 구조를 유지할 수 있습니다 (예 : 대답).

그러나 서블릿 컨테이너에는 해당 불쾌한 속임수 사용을 금지하는 SecurityManager가있을 수 있습니다 (따라서 대답이 어쩌면 가능할 수 있습니다).