directory jetty embedded-jetty

directory - Agregue más de un directorio de recursos a embarcadero



jetty embedded-jetty (2)

Desde 6.1.12, esto se admite mediante el uso de ResourceCollection al recurso base de 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, use el ServletContext (por ejemplo, WebAppContext), que podría ser parte de una definición de interfaz, como por ejemplo:

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

Como:

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

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

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

Luego puede actualizar el método open siguiente manera:

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

Buscando usar múltiples directorios estáticos con Jetty. Cuando el servidor se ejecuta:

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

Lo siguiente falló:

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áticos?


Si desea "montar" directorios de recursos independientes a URI arbitrarios en el espacio de nombres del servidor, la mejor opción es utilizar varias instancias del DefaultServlet con configuraciones independientes de resourceBase .

El siguiente fragmento servirá URI /A/* desde la ruta del sistema de archivos X/V/A y /B/* desde la ruta del sistema de archivos 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 puede ver en el código anterior, no es necesario que el nombre del directorio desde el que se sirve /A/* sea ​​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.