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.