使用Jetty嵌入式容器时,ServletContextHandler.setResourceBase和ResourceHandler.setResourceBase有什么区别?
我正在使用嵌入式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.");
使用该设置,将永远不会调用resourceHandler
,因为ServletContextHandler
链末尾的DefaultServlet
处理(或Default404Servlet
)将始终响应,不允许resourceHandler
甚至执行。
如果您有ServletContextHandler
,请不要使用ResourceHandler
使用ServletContextHandler
的DefaultServlet
来设置和提供静态文件。
ResourceHandler
非常简单,如果您想要更多控件/function,请使用ServletContextHandler
配置的DefaultServlet
。
好的,开始了……
ServletContextHandler.setBaseResource(Resource)
是ServletContext
本身配置其上下文范围resourceBase
。
(注意:setResourceBase()的参数是一个URL字符串,可以指向file://
目录,甚至是jar:file://
location。几乎所有Resource.newResource(String)
支持的内容)
-
${resourceBase}/
是javax.servlet.ServletContext
各种方法的查找点,例如:-
String getRealPath(String path)
-
URL getResource(String path)
-
InputStream getResourceAsStream(String path)
-
Set
getResources(String path)
-
- 然后,
DefaultServlet
将处理与任何servlet或filter不匹配的请求资源,DefaultServlet
可能从指定的${resourceBase}/${request.pathInfo}
提供静态资源(例如*.html
,*.css
,*.js
)${resourceBase}/${request.pathInfo}
ResourceHandler
不参与ServletContextHandler
是不适合与ServletContextHandler
混合的。
另外,不要忘记将ServletContextHandler.setContextPath(String)
设置为所需的上下文路径(通常为"/"
)
是的,您甚至可以在一个ServletContextHandler
拥有多个DefaultServlet
配置 。