使用Jetty嵌入式容器时,ServletContextHandler.setResourceBase和ResourceHandler.setResourceBase有什么区别?

时间:2015-02-09 20:13:13

标签: java jetty

我使用嵌入式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.");

1 个答案:

答案 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)
  • 请求与您的任何servlet或过滤器不匹配的资源将由DefaultServlet处理,*.html可能会提供静态资源(例如*.css*.js${resourceBase}/${request.pathInfo}来自指定的ResourceHandler

ServletContextHandler未加入ServletContextHandler是不适合与ServletContextHandler.setContextPath(String)混合使用。

另外,不要忘记将"/"设置为您想要的上下文路径(通常是{{1}})

是的,你甚至可以multiple DefaultServlet configurations in a single ServletContextHandler