2012-07-04 47 views
3

JSF表達式語言,我發現這個問題,並回答Mixing JSF EL in a JavaScript file包括JavaScript的

問題2年多前有人問這樣是否有與JSF 2.0任何其他替代方案不知道。

我一直在尋找使用

<h:outputStylesheet> 

用於包括在這些文件中的CSS和這個EL似乎得到解析。

但是使用

<h:outputScript> 

似乎並沒有這樣做。

所以

問題1)請問上面是這樣做(如果它的工作)的更好的辦法?

問題2)因爲它似乎沒有JS的工作,Mixing JSF EL in a JavaScript file後的哪個答案被認爲是更好的選擇。

感謝

回答

2

我加入的BalusC提供的第一個變化是會避免一個全局變量選項列表:

<script id='message-data' type='text/json'> 
    { "messages": [  
    <ui:repeat items="#{bean.messages}" var="message">"#{message.value}",</ui:repeat> null 
    ] } 
</script> 

然後從JavaScript,當你需要的信息您可以:

var msgData = document.getElementById('message-data').innerHTML; 
msgData = JSON.parse(msgData); 

的想法是在未分析<script>標籤來創建一個JSON對象(也就是設置了「類型」爲「text/JSON」會做),然後通過閱讀JSON.parse

另一種(通用)方法是使用類和data-xxx屬性將東西從JSF上下文放入HTML中,然後可以通過JavaScript「發現」這些HTML。

使用服務器端模板系統處理整個JavaScript文件有一個明顯的缺點,即使這些文件不能被客戶端緩存。

2

目前,通過JSF API無法將JS添加到EL支持的資源。在Mojarra的情況下,它在com.sun.faces.application.resource.ResourceHelper類中被硬編碼。

private static final String[] EL_CONTENT_TYPES = { 
    "text/css" 
}; 

無法通過包裝其中一個資源管理組件來覆蓋此操作。 EL支持CSS,唯一目的是在CSS背景圖像聲明中支持「static」#{resource['library:image.png']}表達式。我用「靜態」來表示他們保證在整個應用範圍內得到相同的評估結果。 JSF規範中還沒有考慮其他用例,也用於JS。可以基於每個請求評估不同結果的EL表達式在JS/CSS資源中失敗,因爲默認情況下,webbrowser在第一次請求後將這些資源緩存一段確定的時間,這可能會持續至少一週。

您可以通過實現自定義資源處理程序來始終使其工作,其中您通過EL評估輸入流提取JS文件並設置適當的響應標頭,以便瀏覽器不會緩存它們。但這並不是一項簡單的工作,因爲你基本上需要重寫整個資源管理系統。如果你真的打算並且有足夠的經驗,那麼起點將擴大ResourceHandlerWrapper課程。剩下的人應該自己說話。

至於哪個提到的替代方案是更好的選擇,是你必須自己做的選擇。對於你的特殊情況,這種方法或多或少的用處大於你自己。