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