Java 使用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

我正在使用嵌入式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”)服务于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或筛选器不匹配,然后将由
    DefaultServlet
    处理,该servlet可能从指定的
    ${resourceBase}/${request.pathInfo}
    提供静态资源(例如
    *.html
    *.css
    *.js
ResourceHandler
不参与
ServletContextHandler
是一个不适合与
ServletContextHandler
混合使用的文件

另外,不要忘记将
ServletContextHandler.setContextPath(String)
设置为所需的上下文路径(通常是
“/”


是的,您甚至可以这样做。

为什么设置上下文路径很重要?