2012-07-10 3 views
12

Jetty에서 여러 개의 정적 디렉토리를 사용하려고합니다. 서버에서 실행되는 경우, A는 X/V에 위치jetty에 둘 이상의 리소스 디렉토리 추가

http://localhost:8282/A 
    http://localhost:8282/B 
    http://localhost:8282/C 
  • /A
  • B는 Q/Z에 배치/B
  • C가 P에 위치/T/C

가 실패한 다음 :

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

    ResourceHandler resource_handler1 = new ResourceHandler(); 
    resource_handler1.setWelcomeFiles(new String[]{"index.html"}); 
    resource_handler1.setResourceBase(HTML_CLIENTZONE_SITE); 

    // deploy engine 
    WebAppContext webapp = new WebAppContext(); 

    String dir = System.getProperty("user.dir"); 
    webapp.setResourceBase(getWebAppPath()); 
    webapp.setContextPath("/"); 


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

는 어떻게 추가 할 수 있습니다 하나 이상의 정적 자원 디렉토리를? 의 일부가 될 수있는,

Server server = new Server(8282); 
WebAppContext context = new WebAppContext(); 
context.setContextPath("/"); 
ResourceCollection resources = new ResourceCollection(new String[] { 
    "project/webapp/folder", 
    "/root/static/folder/A",  
    "/root/static/folder/B",  
}); 
context.setBaseResource(resources); 
server.setHandler(context); 
server.start(); 

이후 (예를 들어, WebAppContext를) ServletContext 내를 사용하여 파일을 열려면 :

답변

16

6.1.12 때문에, 이것은 WebAppContext의 기본 리소스에 ResourceCollection을 사용하여 지원 인터페이스 정의와 같은 :

/** 
    * Opens a file using the servlet context. 
    */ 
    public default InputStream open(ServletContext context, String filename) { 
    String f = System.getProperty("file.separator") + filename; 
    return context.getResourceAsStream(f); 
    } 

등 :

InputStream in = open(context, "filename.txt"); 

주어진 디렉토리 중 하나에 존재하는 경우 filename.txt을 엽니 다. 같이 getResourceAsStream가 null를 반환하는 대신 예외를 Throw합니다, 그래서 그것을 확인하는 것이 좋습니다 :

return validate(context.getResourceAsStream(filename), filename); 
2

당신이 원하는 경우 다음과 같이

public default InputStream validate(InputStream in, String filename) 
    throws FileNotFoundException { 
    if(in == null) { 
     throw new FileNotFoundException(filename); 
    } 

    return in; 
    } 

그런 다음 당신이 open 방법을 업데이트 할 수 있습니다 독립 실행 형 리소스 디렉토리를 서버 네임 스페이스의 임의 URI에 "탑재"하려면 의 여러 인스턴스를 사용하여 각각 resourceBase 구성을 사용하는 것이 가장 좋습니다.

Server server = new Server(); 
SelectChannelConnector connector = new SelectChannelConnector(); 
connector.setPort(Integer.parseInt(port)); 
server.addConnector(connector); 

ServletContextHandler servletHandler = new ServletContextHandler(null, "/", true, false); 

// Configuration for serving /A/* from X/V/A 
DefaultServlet aServlet = new DefaultServlet(); 
ServletHolder aHolder = new ServletHolder(aServlet); 
aHolder.setInitParameter("resourceBase", "X/V/A"); 
aHolder.setInitParameter("pathInfoOnly", "true"); 
servletHandler.addServlet(aHolder, "/A/*"); 

// Configuration for serving /B/* from Q/Z/B 
DefaultServlet bServlet = new DefaultServlet(); 
ServletHolder bHolder = new ServletHolder(bServlet); 
bHolder.setInitParameter("resourceBase", "Q/Z/B"); 
bHolder.setInitParameter("pathInfoOnly", "true"); 
servletHandler.addServlet(bHolder, "/B/*"); 

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

server.start(); 

참고 :

다음 코드는 파일 시스템 경로 Q/Z/B에서 파일 시스템 경로 X/V/A/B/*에서 URI를 /A/*을 될 것입니다 위의 코드에서 볼 수 있듯이, 필요가 없습니다 그 디렉토리의 이름 귀하의 예와 마찬가지로 이 게재되는 주소는 정확히 A입니다. 제공 할 디렉토리의 파일 시스템 이름과 내용을 매핑하는 URI는 모두 독립적입니다.