使用 servlet 和 Jetty 时缺少图像

Missing images when using a servlet and Jetty

我使用 servlet 和 Jetty 创建了一个小型 Maven 项目。 servlet 工作正常并输出 html 页面。但是,链接的图像没有显示(丢失)。

这是我设置服务器的一小段代码...

    // Set handler 1 (Display Html)
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/");
    context.addServlet(new ServletHolder(hws),"/hello");

    // Set handler 2 (For the images)
    WebAppContext wac = new WebAppContext();
    wac.setContextPath("/img");

    // Attach handlers to server
    handlerList.setHandlers(new Handler[]{context,wac});
    myServer.setHandler(handlerList);

输出 html ...

的一段 servlet
    PrintWriter out = response.getWriter();
    response.setContentType( "text/html");

    out.println( "<html><head><title>Hellow World</title></head>");
    out.println( "<body><h1>Hello World</h1>" );   
    out.println( "<img src=\"/img/img.jpg\">" );
    out.println( "</body></html>");
    out.close();

图像文件 (img.jpg) 在生成之后,位于 jar 文件根目录的子文件夹 "img" 中 ...

我想使用更多图片、css 文件和 javascript。所有这些都将嵌入到 Jar 文件中。

有没有人有在 servlet 输出中显示图像以及图像在 jar 文件中的位置的经验?

谢谢

您的 WebAppContext 没有定义资源库。

这意味着它没有可提供的文件。

由于您使用的是 ServletContextHandler,您可能需要考虑...

  1. 在您的 ServletContextHandler 上使用指向您的 jar 文件中 /webroot 的 URL 的资源库。使 /webroot/img/ 只是其中的另一个目录。
  2. 或者添加一个 DefaultServlet 引用来为您的静态文件提供服务,它有自己定义的资源库。

在 Joakim 的大力帮助和反馈下,我得以解决问题。

为了帮助其他人解决同样的问题,我post我的解决方案....

步骤 1 我创建了一个文件夹,在构建之后位于 Jar 文件内的根级别(文件夹的名称是 "webroot")。我已将所有图片、css 和 javascript 文件放在此文件夹中。

myApp.jar
    |_ "webroot" folder
            |_ LionelRichie.jpg
            |_ style.css
            |_ myscript.js
            |_ ...

步骤 2 我已经创建了 servlet 的基本设置。

    // At the top of the class: setup the imports    
    import java.net.URL;
    import org.eclipse.jetty.server.Handler;
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.server.handler.HandlerList;
    import org.eclipse.jetty.servlet.ServletContextHandler;
    import org.eclipse.jetty.servlet.ServletHolder;
    import org.eclipse.jetty.webapp.WebAppContext;

    ...

    // somewhere in your class ...          

    // Locate the path of the "webroot" folder, containing the images etc ...      
    URL warUrl = this.getClass().getClassLoader().getResource("webroot");
    String warUrlString = warUrl.toExternalForm();

    // Create a webAppContext, pointing the "webroot" folder to the "/files" url. 
    // The files will be available at <server>:<port>/files
    WebAppContext wac = new WebAppContext();
    wac.setResourceBase(warUrlString);
    wac.setContextPath("/files");

    // Setup your servlet ("myServlet"), so it can be accessed in the browser. 
    // The servlet can be used at <server>:<port>/hello
    // Note: for some unknown reason, I was forced to configure the servlet
    // with the root contextpath "/" last !  
    ServletContextHandler sch = new ServletContextHandler(ServletContextHandler.SESSIONS);
    sch.setContextPath("/");
    sch.setResourceBase(warUrlString);
    sch.addServlet(new ServletHolder(myServlet),"/hello");

    // Attach handlers to the server
    HandlerList handlerList = new HandlerList();
    handlerList.setHandlers(new Handler[]{wac, sch});
    myServer.setHandler(handlerList);

步骤 3 在 servlet 中,将外部文件的 url 更改为正确的位置。

示例:

           PrintWriter out = response.getWriter();
           response.setContentType( "text/html");

           // output the result
           out.println( "<html><head><title>Hello</title></head>");
           out.println( "<body><h1>Hello, is it me you're looking for ?</h1>" );   
           out.println( "<img src=\"/files/LionelRichie.jpg\">" ); 
           out.println( "</body></html>");
           out.close();

我希望这对某人有所帮助...