我正在使用嵌入式 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") 服务于网络套接字端点。当然 Context("/") 也能够为 web socket端点提供服务。
 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,因为 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)
  • 请求的资源与您的任何 servlet 或过滤器都不匹配,然后将由 DefaultServlet 处理,它可能会提供来自指定 *.html
  • 的静态资源(例如 *.css*.js${resourceBase}/${request.pathInfo} )
    ResourceHandler 不参与 ServletContextHandler 是不适合与 ServletContextHandler 混合的。

    另外,不要忘记将 ServletContextHandler.setContextPath(String) 设置为您想要的上下文路径(通常是 "/" )

    是的,您甚至可以拥有 multiple DefaultServlet configurations in a single ServletContextHandler

    10-05 23:39