2012-12-19 4 views
8

다음 작업 코드는 두 개의 서블릿을 jetty의 임베디드 인스턴스에 포함시키는 방법을 보여줍니다. 대신 URL "/ 아이폰"을 사용하여, 그것은 서블릿의 주석에 urlpatterns을 사용하도록 주석이 달린 서블릿 패턴이 포함 된 Embedded Jetty?

Server server = new Server(8080); 
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
context.setContextPath("/"); 
context.addServlet(new ServletHolder(new Html()), "/html"); 
context.addServlet(new ServletHolder(new Iphone()), "/iphone");  
server.setHandler(context); 
server.start(); 
server.join(); 

어떻게

이는 즉

@WebServlet(urlPatterns={"/json", "/iphone"}) 
public class Iphone extends HttpServlet { 
    .... 
} 

답변

6

서블릿은 서버의에 있으며, 변경해야 클래스 패스가 아니라 WAR에 패키지화되어 있습니다.

Servlet 3.0 specification 상태 : 웹 응용 프로그램에서

, 클래스 그들이에있는 jar 파일 에 포장하는 경우 자신의 주석 그들이 WEB-INF/classes 디렉토리에있는 경우에만 처리, 또는해야합니다 주석을 사용하여 애플리케이션 내의 WEB-INF/lib.

웹 응용 프로그램 배포 설명자에 web-app 요소에 "metadata-complete"특성이 새로 포함되어 있습니다. "metadata-complete"속성은 웹 설명자가 인지 여부 또는 jar 파일의 클래스 파일이 배포시 주석 및 웹 조각을 검사 할 이어야하는지 여부를 정의합니다. "metadata-complete"이 "true"으로 설정된 경우 배포 도구는 응용 프로그램 및 웹 조각의 클래스 파일에있는 서블릿 주석을 무시해야합니다 ( ). metadata-complete 속성이 지정되지 않았거나 "false"로 설정된 경우 배포 도구는 주석 파일을 검사하고 웹 조각을 검색해야합니다.

WAR 패키징을 살펴보고 WebAppContext과 같은 기능이 추가 된 컨텍스트를 사용해야 할 수도 있습니다.

또는 사용자가 직접 주석을 검색 할 수도 있습니다. 형태의 뭔가 :

void registerServlets(ServletContextHandler context, 
           Class<? extends HttpServlet> type) 
      throws InstantiationException, IllegalAccessException, 
       InvocationTargetException, NoSuchMethodException { 
    WebServlet info = type.getAnnotation(WebServlet.class); 
    for (String pattern : info.urlPatterns()) { 
     HttpServlet servlet = type.getConstructor().newInstance(); 
     context.addServlet(new ServletHolder(servlet), pattern); 
    } 
} 
+0

디버그 빌드이고 IDE가 WEB-INF/classes 외부에 클래스를 배치하면 어떻게됩니까? –

+0

@ RobertVažan 위에서 설명한 이유로 인해 주석이 스캔되지 않을 수 있습니다. – McDowell

+0

두 번째 연결이 끊어졌습니다. – user2418306

0

여기 내 대답을 참조하십시오 : 한마디로 Embedded Jetty does not find Annotated Servlet

을, 다음을 수행해야합니다

  1. 필요한 구성을 설정 대답
  2. 힘 부두에 명시된 바와 같이 컴파일 된 서블릿이있는 클래스/디렉토리를 검사합니다. 기본적으로 그것은 단지 내가 생각하는 항아리를 검사합니다.
관련 문제