2011-05-11 10 views
3

我想問你一個問題,這是關係到another question我問過一些時間前(無答案不幸的是:()將JS,CSS和圖像資源放在JSF應用程序的JAR中是一個好主意嗎?

試想一下,你的項目分成幾個網絡的應用程序,也有很多共享資源(JS,CSS,images) 這個想法是爲了避免在每個網絡應用程序中出現重複,因爲你將被迫在所有的網絡應用程序中同步你的更改

因此,最好有這些資源一個地方

如果我看看Richfaces項目,所有的資源都由JSF管理。 例如,<rich:calendar>組件顯示一個小圖標。 如果我們看的HTML代碼這個形象,我們看到src屬性是指​​鏈接,而不是一個.png直接:

<img src="/richfaces-demo/a4j/g/3_3_3.Finalorg.richfaces.renderkit.html.iconimages.CalendarIcon/DATB/eAH7cW0fw6znAA8XBA4_.jsf" 
    style="vertical-align: middle" id="j_id354:j_id355PopupButton" class="rich-calendar-button " alt=""> 

我看到這樣的方法的優點如下:

  • 將資源包含在經典庫(即JAR中)中,這可以簡化在Eclipse上的部署;
  • 允許生成動態文件(即僅包含所需屬性的CSS或JS);
  • 允許僅包含所需的資源(例如,如果頁面上的組件不需要,我們將不加載CSS文件)。

關於我的申請,我只需要第一點,但這對我來說非常重要(參見我在SO上的其他相關問題)。

此解決方案的主要缺點是瀏覽器將無法緩存資源,因爲它們被視爲JSF請求。此外,這些請求將不得不通過整個JSF生命週期,它可以是一個性能問題,如果資源在當前頁面的數量是很重要的......

問題

謝謝。

回答

1

是的,將共享資源放在一個單獨的項目中是一個好主意,該項目將作爲JAR包含在主要Web應用程序中。然而,我們使用一個簡單的@WebServlet來直接從類路徑提供靜態資源,以及緩存和gzip支持。我們不把這項工作委託給JSF,我們只是利用JSF資源管理,而後者又通過URL完全透明地調用servlet。


允許生成動態文件(即CSS或JS僅包含所要求的特性)

這也是可行的,通過使用特定的URL,然後使獨立的文件名資源作爲查詢字符串。然後,靜態資源servlet將執行將多個資源讀入單個響應的令人討厭的工作。


只允許所需的資源列入(爲前。如果在頁面上不需要通過一個組件,但是我們不會加載CSS文件)。

這是由@ResourceDependency註釋完成的。例如。

@ResourceDependency(library="css", name="specific.css") 
public class CustomComponentWithCSS extends UIComponentBase { 
    // ... 
} 

我們用這個FileServlet被改變,以從classpath,而不是從本地磁盤文件系統獲取資源的修改版本。此外,範圍支持被刪除(因爲RandomAccessFile不能直接在類路徑資源上運行)。此外,我們已經添加了一個檢查,看當前階段是否是開發階段,如果不是,則服務於CSS/JS的縮小版本,而不是放在不同的路徑中。

+0

這似乎是一個不錯的主意。不幸的是,我們仍然使用** JSF 1.2 **,所以沒有'@ WebServlet'和'@ ResourceDependency'可用:( – romaintaz 2011-05-11 12:49:04

+0

那麼,你必須使用''條目來混亂你的webapp的'web.xml'。 servlet本身只能保存在JAR中 – BalusC 2011-05-11 12:50:38

+0

我不確定如何修改'web.xml'文件... – romaintaz 2011-05-11 14:24:51

相關問題