如何使用嵌入式Jetty设置静态资源和自定义服务?

7
我正在尝试通过嵌入Jetty来设置一个简单的Web服务,我想要有两个不同的Web服务可用,一个是简单的HTTP服务器,只提供静态内容(最终将成为GWT应用程序),另一个是自定义servlet,可以为应用程序生成JSON状态消息。
我的分发文件夹结构大致如下:
+ dist/
  - MyApp.jar
  + lib/
  + html/
    - index.html

以下是我为配置嵌入式服务器所做的工作。当我访问 http://localhost/data/ 时,我可以正确地从我的自定义servlet中获取测试输出,但我似乎无法让DefaultServlet找到我的index.html文件。
public Webserver(int port) {
    server = new Server(port);

    ServletContextHandler context = new ServletContextHandler();
    context.setResourceBase("./html/");
    server.setHandler(context);


    JsonDataApiServlet dataServlet = new JsonDataApiServlet();
    DefaultServlet staticServlet = new DefaultServlet();

    context.addServlet(new ServletHolder(dataServlet), "/data/*");
    context.addServlet(new ServletHolder(staticServlet), "/*");
}

“似乎这对于将Jetty嵌入其他项目的人来说是一个常见的任务。那我是不是在正确的方向上?”
“编辑:原来这个问题是由于我误解了Jetty内部计算相对路径的方式所导致的。我正在运行位于dist文件夹上一级的位置,使用“java -jar dist\MyApp.jar”,而Jetty正在寻找“dist\..\html”,而不是正确的“dist\html”。从dist文件夹中运行该jar文件可以解决这个问题。我将回答如何使其在不必从dist目录中运行的情况下正常工作。”

1
我似乎无法让DefaultServlet找到我的index.html文件。那么,当您访问“/index.html”时,您看到什么行为?Jetty会产生什么日志输出? - Tim
谢谢Tim,你的评论让我朝着正确的方向前进。 - Collin
1个回答

6

正如编辑所说,这只是由于我运行jar文件的目录出了问题。以下是我用来找到html文件夹的方法,无论从哪里运行Jar:

首先,我将html文件夹添加到Jar的清单类路径中。以下代码提供了从Jar加载的任何位置获取html文件夹的方法:

ClassLoader loader = this.getClass().getClassLoader();
File indexLoc = new File(loader.getResource("index.html").getFile());
String htmlLoc = indexLoc.getParentFile().getAbsolutePath();

这里使用类加载器在类路径中查找索引文件,然后找到绝对目录并传递给Jetty:
server = new Server(port);

ServletContextHandler context = new ServletContextHandler();
context.setResourceBase(htmlLoc);
context.setWelcomeFiles(new String[] { "index.html" });
server.setHandler(context);


JsonDataApiServlet dataServlet = new JsonDataApiServlet();
DefaultServlet staticServlet = new DefaultServlet();

context.addServlet(new ServletHolder(dataServlet), "/data/*");
context.addServlet(new ServletHolder(staticServlet), "/*");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接