JSF命令按钮属性传输不正确

时间:2010-04-02 10:28:03

标签: 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="#{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),但它没有效果。

也许有人遇到同样的问题?任何帮助和建议将不胜感激。

3 个答案:

答案 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/libAppserver/lib(在Appserver/domains/domainname/*中某处为Glassfish)以及JRE/libJRE/lib/ext下。请记住,Glassfish的javaee.jar也包含JSF库,因此您确实需要确保在/WEB-INF/lib或其他地方没有该JAR(或任何其他特定于应用程序服务器的JAR文件)

答案 1 :(得分:0)

您可以添加JBoss EL并写入:

#{poolBean.updatePool(item)}

您不需要整个Seam,可以使用JSF RI。

答案 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,看看它是否有效。