2015-04-23 58 views
1

我使用servlet和Jetty創建了一個小型Maven項目。該servlet工作正常,並輸出一個html頁面。但是,鏈接的圖像不顯示(丟失)。使用servlet和Jetty時丟失圖像

這是一小塊我的代碼來設置服務器...

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

一塊是在OUPUTS 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文件中的位置?

感謝

回答

0

在Joakim的大力幫助和反饋下,我能夠解決這個問題。

爲了幫助其他有同樣的問題,我發表我的解決方案....

步驟1 我創建了一個文件夾,裏面的構建之後位於根級別,罐子裏面文件(該文件夾的名稱是「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,改變了exteral文件的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(); 

我希望這可以幫助的人......

0

WebAppContext沒有定義的資源基礎。

這意味着它沒有任何文件可供使用。

由於您使用的是ServletContextHandler,你可能要考慮...

  1. 使用指向的網址爲您的jar文件的/webrootServletContextHandler的資源基地。在其中創建/webroot/img/只是另一個目錄。
  2. 或者添加一個DefaultServlet參考,用於爲您的靜態文件提供其自己定義的資源庫。
+0

嗨喬金姆。向'WebAppContect'和'ServletContextHandler'添加資源庫不起作用。我試過使用一個字符串和一個網址。它拒絕顯示圖像... – tmmls

+0

看看有關DefaultServlet的舊答案... http://stackoverflow.com/a/20223103/775715和http://stackoverflow.com/a/28419106/775715 –