我在jsf页面中有以下代码,由jsf托管bean支持
<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>
此代码片段专用于编辑项目集合。该表的每一行都包含“编辑”按钮,用于将更改的行值提交给服务器。它将项目本身作为属性。通过在支持托管bean中调用actionListener方法来执行提交。
此代码在Glassfish v 2.1上正确运行
但是当服务器更新为Glassfish v 2.1.1时,属性已停止正常传递。不是传递已编辑的项目(当我们更改表格行中的值时,我们实际上是在更改基础对象字段),而是将源项目提交给服务器,即先前提供给页面的项目。在页面上进行的所有更改都将被丢弃。
我尝试将jsf版本从1.2_02更新为1.2_14(我们使用的是jsf RI),但它没有效果。
也许有人遇到同样的问题?任何帮助和建议将不胜感激。
答案 0 :(得分:0)
Glassfish附带捆绑的JSF。 Glassfish v2.1.1 ships with Mojarra 1.2_13。实际上,您不需要在/WEB-INF/lib
中拥有自己的JSF库。我不确定这个特定问题是如何引起的,但首先,您需要确保在类路径中没有JSF版本冲突。
也就是说,传递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>
更新:我记得有些事情;这个问题表明你在类路径中仍然有一个早于1.2_05的JSF 1.2版本。组件属性的处理已根据此版本进行了更改,有利于提高性能。简而言之,如果类路径中的jsf-api.jar
早于1.2_05,而类路径中的jsf-impl.jar
为1.2_05或更新,则您将遇到此问题。
解决方案很明显:清理类路径以摆脱旧的JSF版本。 webapp的默认类路径所涵盖的路径位于每个/WEB-INF/lib
,Appserver/lib
(在Appserver/domains/domainname/*
中某处为Glassfish)以及JRE/lib
和JRE/lib/ext
下。请记住,Glassfish的javaee.jar
也包含JSF库,因此您确实需要确保在/WEB-INF/lib
或其他地方没有该JAR(或任何其他特定于应用程序服务器的JAR文件)
答案 1 :(得分:0)
答案 2 :(得分:0)
可能它与JSF 1.2实现actionListener的方式有关。 在JSF 1.1中,直到JSF 1.2(Richfaces,Trinidad等)的最近实现,顺序是setPropertyActionListener(或Attribute) - &gt; actionListener - &gt;行动。 在JSF 1.2中,现在在Richfaces和Trinidad中实现(不确定IceFaces),顺序是actionListener - &gt; setPropertyActionListener(或Attribute) - &gt;行动。 我知道这令人不安而且很烦人...... 谁想到了?他们有什么想法? 无论如何,尝试使用动作而不是actionListener,看看它是否有效。