JSF命令按钮属性不正确地传递
-
23-09-2019 - |
题
我具有以下在JSF页面代码,由JSF管理豆备份
<h:dataTable value="#{poolBean.pools}" var="item">
<h:column>
<f:facet name="header">
<h:outputLabel value="Id"/>
</f:facet>
<h:outputText value="#{item.id}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputLabel value="Start Range"/>
</f:facet>
<h:inputText value="#{item.startRange}" required="true"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="End Range"/>
</f:facet>
<h:inputText value="#{item.endRange}" required="true"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Pool type"/>
</f:facet>
<h:selectOneMenu value="#{item.poolType}" required="true">
<f:selectItems value="#{poolBean.poolTypesMenu}"/>
</h:selectOneMenu>
</h:column>
<h:column>
<f:facet name="header"/>
<h:commandButton id="ModifyPool" actionListener="#{poolBean.updatePool}" image="img/update.gif" title="Modify Pool">
<f:attribute name="pool" value="#{item}"/>
</h:commandButton>
</h:column>
</h:dataTable>
此代码段是专用于编辑的项目来收集。表的每一行包含“编辑”按钮用于提交更改行的值到服务器。它有项目本身作为一个属性。提交是通过调用的ActionListener方法在背衬托管bean进行。
此代码正确运行在Glassfish的V 2.1
但是,当服务器被更新为Glassfish的v 2.1.1,属性停止被正确地传递。相反,经过修改的项目(当我们在表行更改值,我们实际上是在不断变化的基础对象字段),源项目被提交到服务器,即先前提供给页面的项目。所有的页面上所做的更改将被丢弃。
我试图更新版本JSF从1.2_02到1.2_14(我们使用JSF RI),但它没有任何效果。
也许有人在同样的问题就来了?任何帮助和建议将不胜感激。
解决方案
Glassfish的时捆绑JSF。 Glassfish的V2.1.1附带钻嘴鱼科1.2_13 。你其实并不需要有自己的JSF库在/WEB-INF/lib
。我不知道这个特殊的问题是怎么造成的,而是要开始,你需要确保你没有JSF版本的碰撞在classpath。
也就是说,通过bean属性的优选JSF 1.2的方式是使用f:setPropertyActionListener
。
<h:commandButton id="ModifyPool" actionListener="#{poolBean.updatePool}" image="img/update.gif" title="Modify Pool">
<f:setPropertyActionListener target="#{poolBean.pool}" value="#{item}"/>
</h:commandButton>
<强>更新强>:回想东西;这个问题建议你还是有一个JSF 1.2版本在classpath中年纪比1.2_05左右。组件属性的处理有利于增强性能的改变按这个版本。概括地说,如果你有一个年纪比1.2_05在您的classpath中jsf-api.jar
,虽然没有在你的classpath 1.2_05或更新一个jsf-impl.jar
,您将体验正是这个问题。
解决的办法是显而易见的:清理你的classpath摆脱旧的JSF版本。通过web应用程序的默认类路径覆盖路径下的每个/WEB-INF/lib
,Appserver/lib
(这是在Appserver/domains/domainname/*
Glassfish的地方的情况下)和JRE/lib
和JRE/lib/ext
。请记住,GlassFish的javaee.jar
包括JSF库一样,所以你真的需要确保你没有在你的/WEB-INF/lib
或者其他更为JAR(或任何其他应用程序服务器特定的JAR文件)。
其他提示
可能它具有与方式JSF 1.2器具的ActionListener做。 在JSF 1.1和直到最近JSF 1.2(RichFaces的,特立尼达等)的顺序为setPropertyActionListener(或属性)的实施方式中 - >的ActionListener - >动作。 在JSF 1.2,现在在RichFaces和特立尼达实现(不知道ICEfaces的)顺序的ActionListener - > setPropertyActionListener(或属性) - >操作。 我知道这是令人不安,很讨厌... 谁想到呢?他们怎么有什么想法? 无论如何,请尝试使用一个动作,而不是ActionListener的,看看它是否工作。