В чем разница между ServletContextHandler.setResourceBase и ResourceHandler.setResourceBase при использовании встроенного контейнера Jetty?

Я использую встроенный причал для создания статического веб-сайта. Делает ServletContextHandler.setResourceBase("...") имеют тот же эффект, что и ResourceHandler.setResourceBase("...")?

пример:

// ServletContextHandler case
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setResourceBase("/tmp/...");
// ResourceHandler case
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setResourceBase("/tmp/...");

я попробовал проверить оба из них. ResourceHandler работает именно так, как я хочу. Но в остальном-нет. Какая между ними разница?

(извините за мой плохой английский: P)

обновление

после изменения Ниже приведен весь код. Контекст("/") обслуживает статические файлы, wsContext("/с WS") служит конечные точки веб-сокет. Конечно, контекст ( " / " ) также может обслуживать конечные точки веб-сокетов.

 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.");

1 ответов


С этой установкой,resourceHandler никогда не будет вызван, как DefaultServlet обработки (или Default404Servlet) в конце ServletContextHandler цепь всегда будет отвечать, не позволяя resourceHandler даже казнить.

если у вас ServletContextHandler, не используйте ResourceHandler использовать DefaultServlet в этой ServletContextHandler для установки и обслуживания статических файлов.

ResourceHandler очень упрощенно, если вы хотите больше Управления / функций, используйте DefaultServlet настроить в своем .

Ok, с это в сторону ...

на ServletContextHandler.setBaseResource(Resource) место для ServletContext сам настроить свой контекст-широкий resourceBase.

(Примечание: параметр setResourceBase () - это строка URL, которая может указывать на или даже jar:file:// расположение. Почти все, что поддерживается Resource.newResource(String))

  • ${resourceBase}/ точка поиска для различных методов javax.servlet.ServletContext такие как:
    • String getRealPath(String path)
    • URL getResource(String path)
    • InputStream getResourceAsStream(String path)
    • Set<String> getResources(String path)
  • запрошенные ресурсы, которые не соответствуют ни одному из ваших сервлетов или фильтров, затем будут обрабатываться DefaultServlet, которые могут обслуживать статические ресурсы (например,*.html, *.css, *.js) из указанного ${resourceBase}/${request.pathInfo}

ResourceHandler не участвует в ServletContextHandler неуместно смешивать с ServletContextHandler.

кроме того, не забудьте установить ServletContextHandler.setContextPath(String) к нужному контекстному пути (обычно "/")

и да, вы даже можете иметь несколько DefaultServlet конфигурации в одном ServletContextHandler.