我在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