使用 Jetty 嵌入式容器时 ServletContextHandler.setResourceBase 和 ResourceHandler.setResourceBase 有什么区别?
What is difference between ServletContextHandler.setResourceBase and ResourceHandler.setResourceBase when using Jetty embedded container?
我正在使用嵌入式 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("/") 也能够为网络套接字端点提供服务。
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
。
好的,不碍事了...
ServletContextHandler.setBaseResource(Resource)
是 ServletContext
本身配置其上下文范围 resourceBase
的地方。
(注意:setResourceBase() 的参数是一个 URL 字符串,可以指向 file://
目录甚至 jar:file://
位置。[= 支持的几乎所有内容47=])
${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
。
我正在使用嵌入式 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("/") 也能够为网络套接字端点提供服务。
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
。
好的,不碍事了...
ServletContextHandler.setBaseResource(Resource)
是 ServletContext
本身配置其上下文范围 resourceBase
的地方。
(注意:setResourceBase() 的参数是一个 URL 字符串,可以指向 file://
目录甚至 jar:file://
位置。[= 支持的几乎所有内容47=])
${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
。