java - ¿Cuál es la diferencia entre ServletContextHandler.setResourceBase y ResourceHandler.setResourceBase cuando se usa el contenedor incrustado Jetty?
(1)
Estoy usando Jetty incrustado para crear un sitio web estático. ¿ServletContextHandler.setResourceBase ("...") tiene el mismo efecto que ResourceHandler.setResourceBase ("...")?
Ejemplo:
// ServletContextHandler case
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setResourceBase("/tmp/...");
// ResourceHandler case
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setResourceBase("/tmp/...");
He intentado probar ambos. ResourceHandler funciona exactamente lo que quiero. Pero de lo contrario no lo hace. ¿Cual es la diferencia entre ellos?
(Perdón por mi pobre inglés: P)
Actualizar
Después de cambiar, a continuación se muestra el código completo. Context ("/") sirve archivos estáticos, wsContext ("/ ws") sirve puntos finales de socket web. Por supuesto, Context ("/") también puede servir puntos finales de socket web.
server = new Server();
server.setStopAtShutdown(true);
ServerConnector connector = new ServerConnector(server);
connector.setPort(8000);
server.addConnector(connector);
// Setup the basic application "context" for this application at "/"
// This is also known as the handler tree (in jetty speak)
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
context.setResourceBase(System.getProperty("webapp.path"));
ServletContextHandler wsContext = new ServletContextHandler();
wsContext.setContextPath("/ws");
ContextHandlerCollection contexts=new ContextHandlerCollection();
contexts.setHandlers(new Handler[]{context, wsContext});
server.setHandler(contexts);
context.addServlet(DefaultServlet.class, "/");
// Initialize javax.websocket layer
ServerContainer wsContainer = WebSocketServerContainerInitializer.configureContext(wsContext);
// Add WebSocket endpoint to javax.websocket layer
// code omitted...
server.start();
logger.info("WebServer started.");
Con esa configuración, nunca se llamará a
resourceHandler
, ya que el procesamiento
Default404Servlet
(o
Default404Servlet
) al final de la cadena
ServletContextHandler
siempre responderá, lo que no permitirá que
resourceHandler
ejecute.
Si tiene un
ServletContextHandler
, no use
ResourceHandler
use el
DefaultServlet
en ese
ServletContextHandler
para configurar y servir sus archivos estáticos.
ResourceHandler
es muy simplista, si desea más control / características, use un
DefaultServlet
configurado en su
ServletContextHandler
.
Ok, con eso fuera del camino ...
ServletContextHandler.setBaseResource(Resource)
es el lugar para el
ServletContext
sí mismo para configurar su
resourceBase
todo el contexto.
(Nota: el parámetro de setResourceBase () es una cadena de URL que puede apuntar a un directorio
file://
o incluso a una ubicación
jar:file://
. Casi cualquier cosa compatible con
Resource.newResource(String)
)
-
${resourceBase}/
es el punto de búsqueda para varios métodos enjavax.servlet.ServletContext
tales como:-
String getRealPath(String path)
-
URL getResource(String path)
-
InputStream getResourceAsStream(String path)
-
Set<String> getResources(String path)
-
-
Los recursos solicitados que no coincidan con ninguno de sus servlets o filtros, serán manejados por el
DefaultServlet
, que podría servir recursos estáticos (como*.html
,*.css
,*.js
) del${resourceBase}/${request.pathInfo}
especificado${resourceBase}/${request.pathInfo}
ResourceHandler
no participa en
ServletContextHandler
es inapropiado mezclarlo con
ServletContextHandler
.
Además, no olvide configurar
ServletContextHandler.setContextPath(String)
en la ruta de contexto deseada (generalmente
"/"
)
Y sí, incluso puede tener
múltiples configuraciones
DefaultServlet
en un solo
ServletContextHandler
.