57

我正在尝试使用嵌入式 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 教程中记录的解决方案。如正确答案中所述,它使用 aResourceHandler而不是 a 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();
4

5 回答 5

34

使用 aResourceHandler而不是ServletContextHandler.

于 2012-04-23T18:53:57.120 回答
20

ResourceHandler使用 a和使用 a DefaultServlet(with a ServletContextHandler)提供静态内容之间有一个重要的区别。

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

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

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

ResourceCollection resourceCollection = new ResourceCollection();
resourceCollection.setResources(getArrayOfResourceBaseDirs());
于 2013-10-26T10:10:36.560 回答
18

在我的小型网络服务器中,我有两个文件,一个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);

像魅力一样工作!

于 2015-02-26T05:29:57.267 回答
3

我设法通过在 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>
于 2015-12-15T05:51:20.867 回答
1

这是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在浏览器中查看正在提供的文件。

于 2019-04-18T15:20:22.263 回答