java jetty

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 en javax.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 .