当前位置: 首页 > 面试题库 >

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

池阳伯
2023-03-14
问题内容

我正在使用嵌入式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将永远不会调用,因为链末尾的DefaultServlet处理(或Default404ServletServletContextHandler将始终响应,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



 类似资料:
  • 本文向大家介绍Java如何使用Jetty实现嵌入式的Servlet容器,包括了Java如何使用Jetty实现嵌入式的Servlet容器的使用技巧和注意事项,需要的朋友参考一下 最近在项目中遇到关于jetty的问题,所以在网上做一些科普,接下来就给大家做一些分享: Jetty是一个Java实现的开源的servlet容器,它既可以像Tomcat一样作为一个完整的Web服务器和Servlet容器,同时也

  • 我想要主持我的第一个基于Java的网站。我了解到有基于云的服务提供网站托管。但是也有一些未知的术语,比如已经可用的容器和Docker。我对GlassFish,Tomcat等容器知之甚少,但对Docker不太了解。那么码头工人到底是什么?

  • 本文向大家介绍页面导入样式时,使用link和@import有什么区别?相关面试题,主要包含被问及页面导入样式时,使用link和@import有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 link是HTML标签,@import在css中使用 @import会block后续资源加载 我记得以前网上有人测试过,在IE下@import的文件会被安排到最后下载,也就是顺序会有问题,而使用link不

  • 在使用Docker时,我们从一个基图像开始。我们启动它,创建更改,这些更改保存在图层中,形成另一个图像。 所以最终我有了一个用于我的PostgreSQL实例的映像和一个用于我的web应用程序的映像,对这些映像的更改将持续保持。 什么是容器?

  • 我刚接触Spring,我读到BeanFactory也称为基本IOC,ApplicationContext称为高级IOC。 我读到: BeanFactory容器是为DI提供基本支持的最简单的容器,由org.springframework.beans.factory.BeanFactory接口定义。BeanFactory和相关接口,如BeanFactoryAware、InitializingBean、

  • 我正在考虑是否将视频存储在我的服务器上并通过HTML5标记调用它,或者将视频上传到YouTube并使用iframe嵌入YouTube链接。我不确定哪一种更有效,也不确定它们之间的区别。使用HTML5视频标签与使用YouTube链接和iframe标签有什么区别?