使用嵌入式 Jetty 提供静态文件

2022-08-31 17:01:29

我正在尝试构建一个带有嵌入式Jetty的简单演示应用程序,该应用程序从“html”目录(当前工作目录的子目录)提供静态文件。这个想法是,带有演示罐和内容的目录可以移动到新位置并且仍然有效。

我尝试了以下变体,但我一直在获得404。

ServletContextHandler context = 
                       new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");

context.getInitParams().put(
                       "org.eclipse.jetty.servlet.Default.resourceBase", "html");
context.addServlet(new ServletHolder(new DefaultServlet()), "/html");

Server jetty = new Server(8080);
jetty.setHandler(context);

jetty.start();

更新:下面是 Jetty 教程中记录的解决方案。如正确答案中所述,它使用 a 而不是 :ResourceHandlerServletContextHandler

    Server server = new Server();
    SelectChannelConnector connector = new SelectChannelConnector();
    connector.setPort(8080);
    server.addConnector(connector);

    ResourceHandler resource_handler = new ResourceHandler();
    resource_handler.setDirectoriesListed(true);
    resource_handler.setWelcomeFiles(new String[]{ "index.html" });

    resource_handler.setResourceBase(".");

    HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
    server.setHandler(handlers);

    server.start();
    server.join();

答案 1

答案 2

使用 a 和使用 a(带 a )提供静态内容之间存在重要区别。ResourceHandlerDefaultServletServletContextHandler

当一个(或一个保存多个实例)被设置为上下文处理程序时,它直接处理请求并忽略任何已注册的javax.servlet.Filter实例。ResourceHandlerHandlerListResourceHandler

如果您需要过滤器,那么唯一的方法是使用 一个 ,向其添加过滤器,然后添加一个,最后设置基础 。ServletContextHandlerDefaultServletResource

base 表示将用于初始化的资源Base 路径。如果从多个目录提供静态资源,请使用 a(仍然是 a),并使用 resourceBase 字符串数组对其进行初始化:ResourceResourceHandlerResourceCollectionResource

ResourceCollection resourceCollection = new ResourceCollection();
resourceCollection.setResources(getArrayOfResourceBaseDirs());

推荐