Java 使用Jetty嵌入式容器时,ServletContextHandler.setResourceBase和ResourceHandler.setResourceBase之间有什么区别?
我正在使用嵌入式Jetty创建一个静态网站。ServletContextHandler.setResourceBase(“…”)是否与ResourceHandler.setResourceBase(“…”)具有相同的效果 例如:Java 使用Jetty嵌入式容器时,ServletContextHandler.setResourceBase和ResourceHandler.setResourceBase之间有什么区别?,java,jetty,Java,Jetty,我正在使用嵌入式Jetty创建一个静态网站。ServletContextHandler.setResourceBase(“…”)是否与ResourceHandler.setResourceBase(“…”)具有相同的效果 例如: // ServletContextHandler case ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setRes
// ServletContextHandler case
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setResourceBase("/tmp/...");
// ResourceHandler case
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setResourceBase("/tmp/...");
我试过测试他们两个。ResourceHandler正是我想要的。但除此之外,情况并非如此。他们之间有什么区别
(对不起,我的英语很差:p)
更新
更改后,下面是整个代码。上下文(“/”)服务于静态文件,wsContext(“/ws”)服务于web套接字端点。当然,上下文(“/”)也能够为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.");
通过该设置,永远不会调用
resourceHandler
,因为ServletContextHandler
链末尾的DefaultServlet
处理(或Default404Servlet
)将始终响应,甚至不允许执行resourceHandler
如果您有ServletContextHandler
,请不要使用ResourceHandler
使用该ServletContextHandler
中的DefaultServlet
来设置和服务静态文件
ResourceHandler
非常简单,如果您想要更多的控制/功能,请使用ServletContextHandler
中配置的DefaultServlet
好吧,那就别挡道了
是ServletContext
自身配置其上下文范围resourceBase
的地方
(注意:setResourceBase()的参数是一个URL字符串,可以指向文件://
目录,甚至是jar:file://
位置。几乎可以指向
是中各种方法的查找点,例如:${resourceBase}/
String getRealPath(字符串路径)
URL获取资源(字符串路径)
InputStream getResourceAsStream(字符串路径)
设置getResources(字符串路径)
- 请求的资源与您的servlet或筛选器不匹配,然后将由
处理,该servlet可能从指定的DefaultServlet
提供静态资源(例如${resourceBase}/${request.pathInfo}
,*.html
,*.css
)*.js
ResourceHandler
不参与ServletContextHandler
是一个不适合与ServletContextHandler
混合使用的文件
另外,不要忘记将ServletContextHandler.setContextPath(String)
设置为所需的上下文路径(通常是“/”
)
是的,您甚至可以这样做。为什么设置上下文路径很重要?