2010-08-10 38 views
0

我編寫了一個小小的Java servlet,它可以動態生成一個圖像按鈕,給定參數包括標籤,高度,寬度等等,並且它會將每個新增的一個添加到緩存中。它工作正常,但它需要一個servlet調用每個調用來顯示按鈕或其突出顯示的版本。我傾倒了緩存,並在應用程序中創建了當時使用的所有按鈕的PNG文件,並將這些文件添加到應用程序中,以便它們可以被「/images/button/xyz.png」引用,其中文件名是哈希值輸入參數。根據相對URI測試資源的存在

工作正常,但我希望在有人添加新按鈕時調用原始的servlet。我使用自定義標籤來定義這些按鈕,因此JSP編譯時會調用標籤處理程序...所以我可以選擇使用其中一個預生成按鈕,或者生成對此servlet的引用它可以在顯示時渲染按鈕。

我的問題是:如何檢測圖像可用於預渲染?我不確定調用基於完整路徑創建URL對象然後調用getResource()就是答案 - 我不希望它在此時加載圖像,我只需要知道它是否存在。

是否有某種方法可以創建一個File對象,該對象將採用相對URI並允許我測試存在?

+0

現在,我有資源重複 - 一個與類,它可以被檢測到,另一個在我們的webroot。除非我把它放在類路徑中的某個地方,否則getResource就無法找到它 - 在這個論壇上已經指出了很多次。我只是希望能稍微擺脫盒子。我知道我錯過了一些東西,如果我能弄明白,我會修改這個問題。 – 2010-08-11 19:08:05

回答

5

我想你說的是getResource()方法java.lang.Class。這實際上很適合於自by contract以來的問題,如果給定路徑中不存在資源,它將返回null。在使用getResourceAsStream()(或類似)之前,資源實際上並未加載,因此這不是性能問題。

+0

我相信這個問題是圖像文件不在我的taglib的類路徑中。他們被部署到一個不同的jar文件。這些圖像是相對於web根目錄的,但即使將完全限定的URL傳遞給getResource(或File),也不會找到它。 – 2010-08-11 12:20:29

+0

標記回答。這是關於getResource的好信息;它並沒有解決我的問題,但我不確定它能以我希望解決的方式解決。 – 2010-08-11 19:08:43

1

您可以在實用程序類中嘗試以下方法。

public static boolean imageExists(final String imageFileName) throws Exception{ 
     boolean status = false; 
     HttpURLConnection conn = null; 
     URL url = new URL(imageFileName); 
     conn = (HttpURLConnection)url.openConnection(); 
     conn.setRequestMethod("HEAD"); 
      String contentType = conn.getContentType(); 
     if(contentType.contains("image")){ 
      status = true; 
     }else{ 
      status = false; 
     } 

     return status; 
    } 

這假定您的圖像文件名是唯一的。