【问题标题】:Serving static files with embedded Jetty使用嵌入式 Jetty 提供静态文件
【发布时间】:2012-05-04 07:16:26
【问题描述】:

我正在尝试使用嵌入式 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();

更新:这是 Jetty 教程中记录的解决方案。如正确答案中所述,它使用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();

【问题讨论】:

标签: java jetty embedded-jetty


【解决方案1】:

【讨论】:

【解决方案2】:

使用ResourceHandler 和使用DefaultServlet(使用ServletContextHandler)提供静态内容之间存在重要区别。

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

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

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

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

【讨论】:

    【解决方案3】:

    在我的小型网络服务器中,我有两个文件,一个 index.html 和一个 info.js 位于 /src/webapp 下,我希望从嵌入式码头网络服务器为它们提供服务。

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

    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);
    

    工作就像一个魅力!

    【讨论】:

    【解决方案4】:

    通过在 web.xml 中添加“css”目录的映射,我设法实现了类似的效果。明确告诉它使用 DefaultServlet:

    <servlet>
      <servlet-name>DefaultServlet</servlet-name>
      <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>DefaultServlet</servlet-name>
      <url-pattern>/css/*</url-pattern>
    </servlet-mapping>
    

    【讨论】:

      【解决方案5】:

      这是Main.java 文件:

      import org.eclipse.jetty.server.Handler;
      import org.eclipse.jetty.server.Server;
      import org.eclipse.jetty.server.handler.DefaultHandler;
      import org.eclipse.jetty.server.handler.HandlerList;
      import org.eclipse.jetty.server.handler.ResourceHandler;
      
      public class Main
      {
          public static void main(String[] args) throws Exception
          {
              Server server = new Server(8080);
              ResourceHandler resource_handler = new ResourceHandler();
              resource_handler.setResourceBase("C:/Users/serge.klimkovitch/Documents/images");
              HandlerList handlers = new HandlerList();
              handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() });
              server.setHandler(handlers);
              server.start();
              server.join();
          }
      }
      

      ======================================

      这是gradle.build文件:

      apply plugin: 'java'
      apply plugin: 'application'
      
      mainClassName = 'SheetsQuickstart'
      sourceCompatibility = 1.7
      targetCompatibility = 1.7
      version = '1.0'
      
      repositories {
          mavenCentral()
      }
      
      dependencies {
      compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.16.v20190411'
      
      }
      
      jar {
        manifest {
          attributes(
            'Main-Class': 'SheetsQuickstart'
          )
        }
        from {
          configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
        }
      }
      

      ======================================

      假设存在以下文件:C:\Users\serge.klimkovitch\Documents\images\image.html

      然后,在 Eclipse 中运行,并在浏览器中转到 http://localhost:8080/image.html 以查看正在提供的文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-11
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 2010-09-09
        • 2014-03-08
        • 2023-03-17
        • 1970-01-01
        相关资源
        最近更新 更多