【问题标题】:Missing images when using a servlet and Jetty使用 servlet 和 Jetty 时缺少图像
【发布时间】:2015-06-30 22:18:46
【问题描述】:

我使用 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 文件和 javascripts。它们都将嵌入到 Jar 文件中。

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

谢谢

【问题讨论】:

    标签: java maven servlets jetty


    【解决方案1】:

    您的WebAppContext 没有定义资源库。

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

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

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

    【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2020-04-01
      • 2012-04-10
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      相关资源
      最近更新 更多