2014-03-06 24 views
1

重複的ID錯誤在描述我遇到的問題之前,我會首先給出一些上下文。與更新的Mojarra 2.1.27

環境是JSF,Primefaces 3.5和GlassFish 3.1.2.2。

我正在研究用於編輯數據的應用程序。數據分成幾個表單,每個表單都在tabView的選項卡中。數據模型非常豐富,在某些情況下,有幾個嵌套tabViews。

爲了簡化開發,應用程序具有一個描述表單字段的複合組件。它將字段的標籤,輸入,工具提示和其他圖形組件分組。表單包含幾個這些複合組件。

該應用程序是使用GlassFish 3及其提供的Mojarra(版本2.1.6)設計和編碼的。起初,它廣泛使用JSTL標籤(c:if,c:forEach和c:choose),這對於根據具體情況動態構建頁面內容非常方便。

因此,複合組件具有許多c:if標籤來根據其類型(輸入文本,組合框,日曆等)構建字段。同樣,應用程序最複雜的屏幕(使用3個嵌套tabViews)使用大量c:if和c:choose標籤構建。

隨着Mojarra 2.1.6,應用程序按需要工作。但是在複雜的屏幕上,由於a bug in older Mojarra versions,應用程序的性能非常差。然後我們決定將Mojarra升級到最新的2.1版本,即2.1.27。

由於升級我們遇到問題,最重要的是在表單加載和AJAX更新期間出現重複的ID錯誤。重複的ID總是涉及複合組件的內部組件。看起來複合組件連續兩次使用相同的clientId實例化。例示本部分組件樹如下:

+id: DataDashboard 
type: [email protected] 
    +id: Data_property 
    type: [email protected] 
    +id: j_idt1286 
    type: [email protected] 
     +id: j_idt1287 
     type: [email protected] 
     +id: j_id4 
     type: [email protected] 
      +id: j_idt1288 
      type: [email protected] 
      +id: j_idt1289 
      type: [email protected] 
       +id: j_idt1290 
       type: <html xmlns="http://www.w3.org/1999/xhtml"> 

       +id: hType <=============== 
       type: [email protected] 
       +id: lId 
       type: [email protected] 
       +id: j_idt1299 
       type: [email protected] 
       +id: j_idt1300 
       type: [email protected] 
(...) 
      +id: j_idt3300 
      type: [email protected] 
      +id: j_idt3301 
      type: [email protected] 
       +id: j_idt3302 
       type: <html xmlns="http://www.w3.org/1999/xhtml"> 

       +id: hType <=============== 
       type: [email protected] 

閱讀本網站的文章,如this oneBalusC's blog後,我決定擺脫JSTL標記,這可能涉及的問題(但我不能確定);無論如何,這將是「更好」(或者是?)。

所以,與其

<c:if test="#{someCriterion}"> 
    (some stuff) 
</c:if> 

我外部化(一些東西)在名爲someStuff.xhtml另一個文件,並寫入

<ui:include src="#{someCriterion ? 'someStuff.xhtml' : ''}" /> 

在測試中使用的標準是複合組件的屬性,會話範圍Bean的屬性或上述標準(函數或三元運算符)的衍生物。

據我所知,我已經使用此方法轉換了所有JSTL標記,並且該應用程序的行爲與轉換之前的行爲相同。不幸的是,這包括重複的ID錯誤。

我也嘗試使用測試用例應用程序複製錯誤,很不幸,我還沒有設法做到這一點。看來,簡單的應用程序工作。

我很迷茫,因爲如何解決這個問題。任何幫助,將不勝感激。

非常感謝。

編輯:加入的局部組件樹。

回答

1

你的問題是一個很長的故事。我不驚訝地發現它在莫哈拉一再失敗,我已經看到多年來一直存在同樣問題的報道,而且隨着時間的推移將會更多。之所以難以解決這個問題,是因爲有必要對Facelets原始算法做一些大的改動,並將其與JSF 2.0 PSS算法混合使用,而且這樣做確實很難。如果使用c:if,c:choose或ui:include,則無關緊要,它將無法按照您希望在啓用PSS的情況下使用Mojarra。你可以嘗試

一個選項是關閉部分國家儲蓄(PSS)的鑽嘴魚科(javax.faces.PARTIAL_STATE_SAVING網絡配置參數)。這樣,PSS和facelets算法之間的問題就消失了(因爲你不再使用它,但性能不會是最好的)。有一個名爲可用於指示需要滿狀態保存的意見javax.faces.FULL_STATE_SAVING_VIEW_IDS PARAM,所以如果你有重複的ID異常的視圖只設置在參數的觀點,僅此而已。

該問題的最佳解決方案是切換到Apache MyFaces。 JSF for 2.0.x和2.1.x的實現已經解決了這個問題,兩者都非常穩定。在JSF 2.2中,它已經完成了一個使用c:forEach標記的解決方案,但是最近的修復已經完成,所以如果使用這些工件,請嘗試使用2.2.1或更高版本。

我個人強烈的原因有很多推薦的Apache MyFaces的。最新的代碼非常穩定。如果您正在尋找最佳性能,請參閱JSFCentral上的這篇文章Understanding JSF Performance。我希望它有幫助。

+0

謝謝你花時間回答我。我會嘗試禁用PSS。我已經嘗試將MyFaces替換爲Mojarra,但我遇到了一些其他問題。毫無疑問,他們將被列在另一個StackOverflow文章中。 – Charlie