2012-07-10 14 views
12

Szukam używania wielu statycznych katalogów z Jetty. Gdy działa serwer:Dodaj więcej niż jeden katalog zasobów do pomostu

http://localhost:8282/A 
    http://localhost:8282/B 
    http://localhost:8282/C 
  • A jest umieszczone w X/V/A
  • B jest umieszczony w Q/Z/B
  • C jest umieszczona w P/T/C

Poniżej failed:

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); 

Jak mogę dodać więcej niż jeden katalog zasobów statycznych?

Odpowiedz

16

Od 6.1.12, to jest obsługiwane za pomocą ResourceCollection do WebAppContext za bazowej zasobu:

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(); 

Aby następnie otworzyć plik, użyj ServletContext (np WebAppContext), który może być częścią definicja interfejsu, takiego jak:

/** 
    * 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); 
    } 

Przykładowo:

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

Otworzy się filename.txt, jeśli istnieje w jednym z podanych katalogów. Zauważ, że getResourceAsStream powróci null, raczej niż wyjątek, więc jest to dobry pomysł, aby sprawdzić go:

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

    return in; 
    } 

Następnie można zaktualizować metodę open następująco:

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

Jeśli chcesz aby "montować" niezależne katalogi zasobów do dowolnych identyfikatorów URI w przestrzeni nazw serwera, najlepszym wyborem jest używanie wielu instancji DefaultServlet z niezależnymi konfiguracjami resourceBase.

następujący fragment posłuży URI /A/* ze ścieżki systemu plików X/V/A i /B/* od ścieżki systemu plików Q/Z/B:

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(); 

Uwaga: Jak widać z powyższego kodu, nie ma potrzeby, że nazwa katalogu z którego serwowana jest /A/* jest dokładnie A jak w twoim przykładzie. Obie nazwy - nazwa systemu plików katalogu do wyświetlenia i URI do mapowania zawartości - są całkowicie niezależne.

Powiązane problemy