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

Hol*_*osa 53 java jetty embedded-jetty

我正在尝试构建一个带有嵌入式Jetty的简单演示应用程序,该应用程序提供来自"html"目录的静态文件,该目录是当前工作目录的子目录.我们的想法是,包含演示jar和内容的目录可以移动到新位置并仍然有效.

我尝试过以下各种变体,但我一直在使用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();
Run Code Online (Sandbox Code Playgroud)

更新:这是Jetty教程中记录的解决方案.如正确答案所述,它使用的是a ResourceHandler而不是ServletContextHandler:

    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();
Run Code Online (Sandbox Code Playgroud)

小智 33

用a ResourceHandler代替ServletContextHandler.

  • 当Jetty 6存在时,这个建议是有道理的.今天,对于Jetty 9,这个建议不再有效.请参见http://stackoverflow.com/a/28419106/775715 (5认同)
  • 这就是诀窍!多谢你们!代码甚至在Jetty教程中给出.卫生署!http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty#Configuring_a_File_Server (4认同)

xor*_*cus 19

使用a ResourceHandler和使用a DefaultServlet(使用a ServletContextHandler)提供静态内容之间存在重要差异.

当a ResourceHandler(或HandlerList持有多个ResourceHandler实例)被设置为上下文处理程序时,它直接处理请求并忽略任何已注册的javax.servlet.Filter实例.

如果你需要过滤器,唯一的方法是使用a ServletContextHandler,向其中添加过滤器,然后添加a DefaultServlet,最后设置基础Resource.

base Resource表示ResourceHandler将初始化的resourceBase路径.如果从多个目录提供静态资源,请使用a ResourceCollection(仍然是a Resource)并使用resourceBase字符串数组初始化它:

ResourceCollection resourceCollection = new ResourceCollection();
resourceCollection.setResources(getArrayOfResourceBaseDirs());
Run Code Online (Sandbox Code Playgroud)


小智 16

在我的小型Web服务器中,我有两个文件,一个index.html和一个info.js位于下面/src/webapp,我希望它们是从嵌入式jetty Web服务器提供的.

这就是我用静态内容解决问题的方法.

Server server = new Server(8080);

ServletContextHandler ctx = new ServletContextHandler();
ctx.setContextPath("/");

DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/webapp/");

ctx.addServlet(holderPwd, "/*");
ctx.addServlet(InfoServiceSocketServlet.class, "/info");

server.setHandler(ctx);
Run Code Online (Sandbox Code Playgroud)

像魅力一样工作!

  • 你能看看这个问题 - http://stackoverflow.com/questions/39011587/jetty-files-outside-war-and-context (2认同)