2009-12-10 4 views
9

플러그인 아키텍처를 사용하는 Java 웹 애플리케이션이 있습니다. 나는 누군가가 서블릿을 추가 할 수있는 솔루션을 가지고 있는지 알고 싶습니다. 웹 앱이 실행되는 동안 서블릿 매핑에 serlvet 매핑이 필요합니까? 클래스가/WEB-INF/classes 폴더에 추가 될 수 있고 웹 응용 프로그램을 다시 시작하지 않고 서블릿으로 활성화 될 수 있다는 아이디어가 있습니다. 같은 성격으로, 사용자가 "플러그인"을 제거하기로 결정하면 코드가 servletconfig에서 클래스를 제거하게하십시오.servlet에 서블릿을 동적으로 추가하십시오 .Config

답변

5

이를 수행하기위한 표준 Servlet API는 없습니다.

Tomcat에서이 작업을 수행 할 수 있습니다. 귀하의 webapp에서 개체를 얻을 수 있도록 마스터 서블릿 (다른 하나를 만드는 서블릿)은 ContainerServlet을 구현해야합니다. 당신이 당신의 클래스 파일을 설치 한 후에는

Context context = (Context) wrapper.getParent(); 
Wrapper newWrapper = context.createWrapper(); 
newWrapper.setName(name); 
newWrapper.setLoadOnStartup(1); 
newWrapper.setServletClass(servletClass); 
context.addChild(newWrapper); 
context.addServletMapping(pattern, name); 

이러한 호출은 즉시 서블릿을 작성, 다음과 통화를 할 수 있습니다. 이 정보를 유지하는 방법을 찾아야합니다. web.xml을 업데이트하거나 자신의 파일에 쓸 수 있습니다.

+0

완벽하고 많은 감사드립니다. – BigBadOwl

1

실행중인 응용 프로그램에 클래스를 추가하거나 제거하는 것은 어렵습니다. 상용 솔루션으로는 JRebel을 참조하십시오.

사용자가 매우 오랫동안 실행중인 대화/세션이없는 경우 웹 앱을 다시 시작하면 알 수 없을 정도로 빨리 시작할 수 있습니다. 이것이 당신을 위해 그것을한다면, 문제는 꽤 쉽게됩니다.

Tomcat을 실행한다고 가정하면 reloadable=true으로 서버를 구성 할 수 있으며 web.xmlwebapps 디렉토리에 던질 때마다 앱이 다시 시작됩니다. WEB-INF/classes 디렉토리에 새 클래스를 추가 한 다음 web.xml을 업데이트하면 정상적으로 작동합니다. 이러한 클래스가 사용 중이면 클래스 제거가 어려울 수 있습니다. 주어진 서블릿 클래스로 더 이상 라우팅되지 않는 web.xml을 처음 배포 한 다음 2 단계 프로세스를 수행하여 클래스 사용자가 사라질 때까지 기다린 다음 클래스를 삭제하고 업데이트 된 web.xml을 다시 배포하십시오.

0

나는 동적으로 그렇게 할 수 있다고 생각하지 않지만 사전 구성된 필터를 사용하여 서블릿을 활성 또는 비활성으로 만들 수 있습니다. 필터가 데이터베이스 나 파일 시스템에서 동적으로 변경할 수있는 값을 확인하고 서블릿이 "꺼져"있는 경우 요청을 다시 라우팅하는 방법을 알려줍니다.

나는 사용자에게 일종의 피드백을주지 않고 서블릿을 끄는 것이 무례 할 것이라고 생각한다.

관련 문제