2012-07-10 14 views
12

Buscando usar múltiples directorios estáticos con Jetty. Cuando se ejecuta el servidor:Agregue más de un directorio de recursos al embarcadero

http://localhost:8282/A 
    http://localhost:8282/B 
    http://localhost:8282/C 
  • A se coloca en X/V/A
  • B se coloca en Q/Z/B
  • C se coloca en P/T/C

Los siguientes fallaron:

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

¿Cómo puedo agregar más de un directorio de recursos estática?

Respuesta

16

Desde 6.1.12, esto es apoyado por el uso de un ResourceCollection a base de recursos de la WebAppContext:

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

Para abrir posteriormente un archivo, utilice la ServletContext (por ejemplo, WebAppContext), que podría ser parte de una definición de interfaz, tales como:

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

tales como:

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

Esto abrirá filename.txt si existe en uno de los directorios especificados. Tenga en cuenta que getResourceAsStream volverá null, en lugar de lanzar una excepción, por lo que es una buena idea para comprobar que:

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

    return in; 
    } 

A continuación, puede actualizar el método open de la siguiente manera:

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

Si quieren para "montar" directorios de recursos independientes a URIs arbitrarios en el espacio de nombres del servidor, usando múltiples instancias del DefaultServlet con configuraciones independientes resourceBase es la mejor opción.

el siguiente fragmento servirá URI /A/* de ruta de sistema de archivos X/V/A y /B/* de la trayectoria del sistema de ficheros 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(); 

Nota: Como se puede ver en el código anterior, no hay necesidad de que el nombre del directorio desde donde se sirve /A/* es exactamente A como en su ejemplo. Ambos nombres, el nombre del sistema de archivos del directorio a servir y el URI para mapear los contenidos, son completamente independientes.

Cuestiones relacionadas