JSF命令按钮属性传输不正确
我在jsf页面中有以下代码,由jsf托管bean支持JSF命令按钮属性传输不正确,jsf,glassfish,actionlistener,Jsf,Glassfish,Actionlistener,我在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
<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 V2.1上正确运行
但是,当服务器更新到Glassfish v 2.1.1时,该属性停止正确传递。源项不是传递已编辑的项(当我们更改表行中的值时,实际上是在更改基础对象字段),而是提交给服务器,即以前提供给页面的项。在页面上所做的所有更改都将被放弃
我试图将jsf版本从1.2_02更新到1.2_14(我们正在使用jsf RI),但没有效果
也许有人遇到过同样的问题?任何帮助和建议都将不胜感激。装有捆绑JSF的Glassfish船舶。实际上,您不需要在
/WEB-INF/lib
中拥有自己的JSF库。我不确定这个问题是如何引起的,但首先,您需要确保类路径中没有JSF版本冲突
也就是说,传递bean属性的首选JSF1.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旧的JSF1.2版本。组件属性的处理已根据此版本更改,以支持性能增强。简而言之,如果类路径中的jsfapi.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(或任何其他特定于appserver的jar文件)。Glassfish附带了捆绑的JSF。实际上,您不需要在/WEB-INF/lib
中拥有自己的JSF库。我不确定这个问题是如何引起的,但首先,您需要确保类路径中没有JSF版本冲突
也就是说,传递bean属性的首选JSF1.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旧的JSF1.2版本。组件属性的处理已根据此版本更改,以支持性能增强。简而言之,如果类路径中的jsfapi.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(或任何其他特定于appserver的jar文件)。您可以添加并编写:
#{poolBean.updatePool(item)}
您不需要整个Seam,可以与JSF RI配合使用。您可以添加并编写:
#{poolBean.updatePool(item)}
您不需要整个Seam,它可以与JSF RI配合使用。可能与JSF 1.2实现actionListener的方式有关。 在JSF1.1中,直到最近的JSF1.2实现(Richfaces、Trinidad等),顺序是setPropertyActionListener(或Attribute)->actionListener->action。 在JSF1.2中,现在在Richfaces和Trinidad中实现(不确定IceFaces),顺序是actionListener->setPropertyActionListener(或Attribute)->action。 我知道这很烦人,很烦人。。。 谁想到的?他们在想什么?
无论如何,尝试使用一个动作而不是actionListener,看看它是否有效。这可能与JSF1.2实现actionListener的方式有关。 在JSF1.1中,直到最近的JSF1.2实现(Richfaces、Trinidad等),顺序是setPropertyActionListener(或Attribute)->actionListener->action。 在JSF1.2中,现在在Richfaces和Trinidad中实现(不确定IceFaces),顺序是actionListener->setPropertyActionListener(或Attribute)->action。 我知道这很烦人,很烦人。。。 谁想到的?他们在想什么?
无论如何,试着用一个动作来代替actionListener,看看它是否有效。非常感谢您的建议。我从应用程序中删除了所有jsf库,并下载了Glassfish的干净版本。在server.log中,我可以清楚地看到我的应用程序正在使用捆绑的jsf库:初始化Mojara(1.2_13-b01-