В чем разница между 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.
