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

Hai*_*eng 7 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/...");
Run Code Online (Sandbox Code Playgroud)

我试过测试它们.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.");
Run Code Online (Sandbox Code Playgroud)

Joa*_*elt 9

使用该设置,resourceHandler永远不会调用,因为链末尾的DefaultServlet处理(或Default404Servlet)ServletContextHandler将始终响应,resourceHandler甚至不允许执行.

如果你有一个ServletContextHandler,不采用ResourceHandler使用DefaultServletServletContextHandler设置并为您的静态文件.

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)所需的上下文路径(通常"/")

是的,您甚至可以在一个配置中拥有多个DefaultServlet配置ServletContextHandler.