我使用嵌入式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)
更改后,下面是整个代码。 Context(" /")提供静态文件,wsContext(" / ws")提供Web套接字端点。当然,Context(" /")也能够为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.");
答案 0 :(得分:9)
使用该设置,永远不会调用resourceHandler
,因为DefaultServlet
链末尾的Default404Servlet
处理(或ServletContextHandler
)将始终响应,而不是允许resourceHandler
甚至执行。
如果您有ServletContextHandler
,请不要使用ResourceHandler
使用DefaultServlet
中的ServletContextHandler
来设置和提供静态文件。
ResourceHandler
非常简单,如果您想要更多控制/功能,请改用DefaultServlet
中配置的ServletContextHandler
。
好的,不管怎样......
ServletContextHandler.setBaseResource(Resource)
是ServletContext
本身配置其上下文范围resourceBase
的地方。
(注意:setResourceBase()的参数是一个URL字符串,可以指向file://
目录甚至是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)
混合使用。
另外,不要忘记将"/"
设置为您想要的上下文路径(通常是{{1}})
是的,你甚至可以multiple DefaultServlet
configurations in a single ServletContextHandler
。