¿Cuál es la diferencia entre ServletContextHandler.setResourceBase y ResourceHandler.setResourceBase cuando se usa el contenedor integrado Jetty?

2 minutos de lectura

avatar de usuario
Haigang Feng

Estoy usando Embedded Jetty 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 como yo 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.");

avatar de usuario
Joaquín Erdfelt

Con esa configuración, el resourceHandler nunca será llamado, como el DefaultServlet procesamiento (o Default404Servlet) al final de ServletContextHandler la cadena siempre responderá, no permitiendo resourceHandler incluso ejecutar.

Si tienes un ServletContextHandlerno utilice ResourceHandler utilizar el DefaultServlet en eso ServletContextHandler para configurar y servir sus archivos estáticos.

ResourceHandler es muy simple, si desea más control / funciones, use un DefaultServlet configurado en su ServletContextHandler en lugar de.

Ok, con eso fuera del camino…

los ServletContextHandler.setBaseResource(Resource) es el lugar para el ServletContext mismo para configurar su contexto resourceBase.

(Nota: el parámetro de setResourceBase() es una cadena de URL que puede apuntar a un file:// directorio o incluso un jar:file:// ubicación. Prácticamente cualquier cosa respaldada por Resource.newResource(String))

  • ${resourceBase}/ es el punto de búsqueda para varios métodos en javax.servlet.ServletContext tal 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 DefaultServletque podría servir recursos estáticos (como *.html, *.css, *.js) de lo especificado ${resourceBase}/${request.pathInfo}

ResourceHandler no participa en ServletContextHandler es un es inapropiado para mezclar con ServletContextHandler.

Además, no olvide configurar ServletContextHandler.setContextPath(String) a la ruta de contexto deseada (generalmente "https://stackoverflow.com/")

Y sí, incluso puedes tener múltiples DefaultServlet configuraciones en un solo ServletContextHandler.

  • ¿Por qué es importante establecer la ruta de contexto?

    – kleinfreund

    8 de marzo de 2017 a las 10:33

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad