我在Spring Webflow中遇到了primefaces組件的持久性問題。如果組件實例化爲原始頁面請求的一部分,則一切正常。但是,如果組件在ajax請求期間被實例化,它們沒有被正確保存,並且在稍後檢索它們時會得到一個空對象。這樣做的效果是,例如tabview的第二個選項卡上的組件(dynamic = true)不起作用。一個例子:Spring Webflow中的primefaces組件的持久性
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<ui:insert name="headIncludes" />
</h:head>
<h:body>
<h:form id="testForm">
<p:tabView id="myTabView" dynamic="true">
<p:tab title="Tab One" id="tabOne">
<h:panelGroup id="tabOneGroup">
<p:commandLink id="linkX" value="Link X" actionListener="#{sandboxBean.testCommandLinkx}" >
<f:ajax />
</p:commandLink>
</h:panelGroup>
</p:tab>
<p:tab title="Tab Two" id="tabTwo">
<h:panelGroup id="tabTwoGroup">
<p:commandLink id="linkY" value="Link Y" actionListener="#{sandboxBean.testCommandLinky}" >
<f:ajax /><!-- Only matters if we switch to h:commandLink -->
</p:commandLink>
</h:panelGroup>
</p:tab>
</p:tabView>
</h:form>
</h:body>
</html>
當首次加載頁面,代表commandlink linkX被實例化並關於「的ActionListener」的屬性值在UIComponent被保存。當我們點擊「鏈接X」時,該屬性值再次被檢索並用於調用testCommandLinkx()。這工作正常。
當我們切換到Tab Two時,發出ajax請求,在此期間,另一個表示linkY的UIComponent以相同的方式創建並保留。但是,當我們實際點擊命令鏈接並嘗試檢索actionListener屬性值時,我們發現沒有這樣的屬性。相反,我們會收到一個全新的對象。
如果我們更改爲tabView的dynamic =「false」,則兩個命令鏈接都將在初始頁面請求期間創建並保持,並且一切正常。如果我們保持dynamic =「true」,但是使用h:commandLink而不是p:commandLink,那麼一切都可以正常工作。
現在,我真的不認爲這是一個primefaces錯誤,就好像其他人也會注意到它一樣。其他人也沒有問題測試過這個特定的代碼片段。出於同樣的原因,我懷疑這是一個webflow錯誤。這似乎更可能是我們項目中的配置錯誤,但我不知道在哪裏。包含每個單獨的配置文件似乎有點冗長,但如果你想看到一個只是評論的內容,我會添加它。
至於不同組件的版本,因爲人們無疑會問:
- Primefaces:3.0.1和所有更高版本的動態tabViews(因爲這是支持它真正的第一個版本),但它可能在早期版本中重新創建它,如果您使用另一個實例化Ajax請求中的組件的構造。
- 鑽嘴魚科:2.0.4(但我自己也嘗試2.0.8和2.1.6無改善)
- 春天的Webflow:2.2.1(也試圖2.3)
- 的Tomcat:7.0.12(曾嘗試各種其他)
嘗試將''替換爲''。此外'' ''標籤是不必要的。所有的PrimeFaces命令鏈接/按鈕默認已經被設置爲ajaxified,應該由接受布爾值的'ajax'屬性配置。 –
BalusC
2012-03-23 11:53:06
切換表格並不會改變任何恐懼。 p:commandLink不需要 ,但它確保在切換到h:commandLink時功能相同。我不希望人們認爲h:commandLink工作的原因是它不是ajax請求。 –
MatsT
2012-03-23 12:40:00
您能否詳細說明*「但是,當我們實際點擊命令鏈接並嘗試檢索actionListener屬性值時,我們發現沒有這樣的屬性,我們反而會收到一個全新的對象。你的意思是你從動作偵聽器方法中的視圖根(或從動作事件參數)中檢索組件,然後嘗試通過'getValue()'從它獲取命令組件的值?如果是這樣,爲什麼? – BalusC 2012-03-26 14:07:07