2011-05-27 20 views
2

我已經將一個.js文件與.css文件和所需圖像一起放入Java包中。目錄結構:來自Javascript的圖像src放置在同一個Java包中

  • info.release.wicket.custom.ajax.link
    • AjaxLoadingLink.java
    • AjaxLoadingLink.css
    • AjaxLoadingLink.js
    • indicator.gif

現在來自.css文件indicator.gif可以作爲background-image:url(indicator.gif);訪問。但在.js文件中spinner.innerHTML = "<img src='indicator.gif'>";不起作用。

在這種情況下,Javascript中圖像的路徑是什麼。

如果我將該映像放入WAR的資源文件夾並將其作爲spinner.innerHTML = "<img src='../resources/indicator.gif'>";訪問它正在工作。但我需要通過上述方式來完成這個工作,那就是將其放入包裝中。

感謝和問候。

+0

什麼是Java的有,要怎麼辦? – jwueller 2011-05-27 07:21:07

+0

用html將其重新標記。 – Jordan 2011-05-27 07:26:12

回答

0

indicator.gif的路徑將相對於調用js文件的實際HTML文檔。如果.gif與html文檔位於同一文件夾中(或者我猜.java文件在您的情況下? ),那麼你可以從那裏打電話。

+0

謝謝。但在這種情況下,我不需要從.java文件調用圖像。 .js的方法是從.java調用的,因此應該從該.js中訪問圖像。 – 2011-05-27 07:53:24

+0

加載該javascript時,其內部的任何路徑都將與您將其加載到的任何路徑相關,因此無論它是HTML文件還是.java文件,您的路徑必須相對於包含該文件的路徑。 JavaScript從來沒有真正運行...它的內容被下載到容器環境並運行內聯。用src調用它與直接寫入它沒有區別,因此所有的路徑引用都是相對於容器環境的。 – Jordan 2011-05-27 07:55:46

0

爲什麼把JS放在java包中?如果您將所有文件放在一個目錄中,例如/ ajaxloading /它應該工作。包中的Java資源放在WEB-INF \ classes中,你不能通過那裏的關聯url來尋找資源。

另一種可能性是編寫一個servlet,將所有文件形成一個包,然後將這個servlet映射到web.xml中的一個url小瓶servlet-mapping。

我也在項目中使用它。這裏的源:

public class StyleProviderServlet extends HttpServlet { 

    private static final long serialVersionUID = 7156462313946659366L; 

    /** 
    * read buffer. 
    */ 
    private static final int BUFFER_SIZE = 102400; 

    private final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(StyleProviderServlet.class); 

    /** 
    * Package 
    */ 
    private static final String PACKAGE = "com/mycompany/mypackage/style"; 

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    this.handleRequest(req, resp); 
    } 

    protected void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    String pathInfo = req.getPathInfo(); 
    logger.debug("pathInfo = {}", pathInfo); 

    StringBuilder resourcePathBuilder = new StringBuilder(100); 
    resourcePathBuilder.append("/"); 
    resourcePathBuilder.append(PACKAGE); 
    resourcePathBuilder.append(pathInfo); 
    String resourcePath = resourcePathBuilder.toString(); 
    logger.debug("resourcePath: {}", resourcePath); 

    InputStream inputStream = this.getClass().getResourceAsStream(resourcePath); 

    if (inputStream != null) { 
     String mimeType = getMimeType(pathInfo); 
     if (mimeType != null) { 
     resp.setContentType(mimeType); 
     } 

     BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 
     try { 
     logger.debug("at least {} bytes are ready to be read", bufferedInputStream.available()); 
     ServletOutputStream outputStream = resp.getOutputStream(); 
     int index = -1; 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     while ((index = bufferedInputStream.read(buffer)) != (-1)) { 
      outputStream.write(buffer, 0, index); 
     } 

     } finally { 
     bufferedInputStream.close(); 
     } 
    } else { 
     logger.debug("no resource found for resourcePath '{}'", resourcePath); 
    } 
    } 

    protected String getMimeType(String pathinfo) { 
    if (pathinfo != null) { 
     ServletContext servletContext = getServletContext(); 
     String mimeType = servletContext.getMimeType(pathinfo); 
     logger.debug("pathInfo :{}, mimeType={}", pathinfo, mimeType); 
     return mimeType; 
    } else { 
     return null; 
    } 
    } 

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    this.handleRequest(req, resp); 
    } 
} 

而這裏的web.xml中的映射:

<servlet-mapping> 
    <servlet-name>StyleProviderServlet</servlet-name> 
    <url-pattern>/style/*</url-pattern> 
    </servlet-mapping> 

現在你可以從包裝COM/myCompany中/ mypackage中/風格通過URL /風格/例如訪問所有文件/style/AjaxLoadingLink.css

你也可以把所有文件在JAR這種方式,並把這個JAR放到WEB-INF/lib目錄

相關問題