2012-04-23 3 views
46

현재 작업 디렉토리의 하위 디렉토리 인 "html"디렉토리에서 정적 파일을 제공하는 Jetty가 포함 된 간단한 데모 응용 프로그램을 빌드하려고합니다. 아이디어는 데모 항아리와 내용이있는 디렉토리를 새 위치로 옮겨서 계속 사용할 수 있다는 것입니다.Jetty가 포함 된 정적 파일 검색

다음과 같은 변형을 시도했지만 404가 계속 나타납니다.

ServletContextHandler context = 
         new ServletContextHandler(ServletContextHandler.SESSIONS); 
context.setContextPath("/"); 

context.getInitParams().put(
         "org.eclipse.jetty.servlet.Default.resourceBase", "html"); 
context.addServlet(new ServletHolder(new DefaultServlet()), "/html"); 

Server jetty = new Server(8080); 
jetty.setHandler(context); 

jetty.start(); 

업데이트 : 다음은 부두 튜토리얼에 설명 된대로 솔루션입니다. 정답에 언급 한 바와 같이, 대신 ServletContextHandlerResourceHandler을 사용

Server server = new Server(); 
    SelectChannelConnector connector = new SelectChannelConnector(); 
    connector.setPort(8080); 
    server.addConnector(connector); 

    ResourceHandler resource_handler = new ResourceHandler(); 
    resource_handler.setDirectoriesListed(true); 
    resource_handler.setWelcomeFiles(new String[]{ "index.html" }); 

    resource_handler.setResourceBase("."); 

    HandlerList handlers = new HandlerList(); 
    handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() }); 
    server.setHandler(handlers); 

    server.start(); 
    server.join(); 
+0

pom.xml 파일 : https://code.google.com/p/ram-badger/source/browse/trunk/static-jetty/pom을. xml – cwash

+1

이것은 부두 9에서 작동하지 않는 것 같습니다 ... –

+1

한 얼굴이 부두 9와 동일한 문제 일 경우 @see - http://stackoverflow.com/questions/28346438/resourcehandler-stop-hosting-files-with-jetty -9-404-not-found-error-works-fin –

답변

30

ResourceHandler 대신 ServletContextHandler의를 사용합니다.

+1

참으로 ... http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/jetty/handler/ResourceHandler.html –

+4

트릭을 했어! 고마워요! 이 코드는 Jetty 튜토리얼에서도 제공됩니다. 도! http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty#Configuring_a_File_Server – HolySamosa

+1

javax.servlet이 필요한 경우에도 여전히 'ServletContextHandler'를 사용할 수 있습니다.필터 (자세한 내용은 아래 내 의견을 참조하십시오.) – xorcus

18

ResourceHandler을 사용하고 DefaultServlet (ServletContextHandler)을 사용하여 정적 콘텐츠를 제공하는 것과 중요한 차이가 있습니다.

ResourceHandler (또는 복수 ResourceHandler 인스턴스를 보유하는 HandlerList)이 컨텍스트 핸들러로 설정되면 요청을 직접 처리하고 등록 된 javax.servlet.Filter 인스턴스를 무시합니다.

필터가 필요한 경우 ServletContextHandler을 사용하여 필터를 추가 한 다음 DefaultServlet을 추가하고 마지막으로 Resource을 설정하는 것이 유일한 방법입니다.

베이스 ResourceResourceHandler이 초기화 될 resourceBase 경로를 나타냅니다. 나는 두 개의 파일하는 index.htmlinfo.js이 내 작은 웹 서버에서

ResourceCollection resourceCollection = new ResourceCollection(); 
resourceCollection.setResources(getArrayOfResourceBaseDirs()); 
12

을 : 여러 디렉토리에서 정적 리소스를 제공하는 경우 ResourceCollection를 사용 (여전히 Resource 인) 및 resourceBase 문자열의 배열을 초기화 /src/webapp 아래에서 임베디드 부두 웹 서버에서 서비스를 받고 싶습니다.

이것은 정적 콘텐츠의 문제를 해결하는 방법입니다.

Server server = new Server(8080); 

ServletContextHandler ctx = new ServletContextHandler(); 
ctx.setContextPath("/"); 

DefaultServlet defaultServlet = new DefaultServlet(); 
ServletHolder holderPwd = new ServletHolder("default", defaultServlet); 
holderPwd.setInitParameter("resourceBase", "./src/webapp/"); 

ctx.addServlet(holderPwd, "/*"); 
ctx.addServlet(InfoServiceSocketServlet.class, "/info"); 

server.setHandler(ctx); 

매력처럼 작동했습니다!

+2

을 참조하십시오.이 질문을 볼 수 있습니까? http://stackoverflow.com/questions/39011587/jetty-files-outside-war-and-context –

2

web.xml의 "css"디렉토리에 대한 매핑을 추가하여 비슷한 결과를 얻을 수있었습니다. 명시 적으로 DefaultServlet를 사용하도록 말하는이 작동

<servlet> 
    <servlet-name>DefaultServlet</servlet-name> 
    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>DefaultServlet</servlet-name> 
    <url-pattern>/css/*</url-pattern> 
</servlet-mapping>