2

我在 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),但没有任何效果。

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

4

3 回答 3

0

Glassfish 附带捆绑的 JSF。Glassfish v2.1.1 随 Mojarra 1.2_13 一起提供。实际上,您不需要在/WEB-INF/lib. 我不确定这个特定问题是如何引起的,但首先,您需要确保类路径中没有 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 版本。组件属性的处理已根据此版本进行了更改,以支持性能增强。简而言之,如果您的类路径中有 1.2_05jsf-api.jar之前的 a ,而您的类路径中有jsf-impl.jar1.2_05 或更新的 a ,您将遇到这个问题。

解决方案很明显:清理您的类路径以摆脱旧的 JSF 版本。webapp 的默认类路径覆盖的路径位于 each 下/WEB-INF/libAppserver/lib如果 Glassfish 位于 中的某处Appserver/domains/domainname/*)和JRE/liband下JRE/lib/ext。请记住,Glassfishjavaee.jar也包含 JSF 库,因此您确实需要确保您的/WEB-INF/lib或其他地方没有该 JAR(或任何其他特定于应用服务器的 JAR 文件)。

于 2010-04-02T14:37:54.263 回答
0

您可以添加JBoss EL并编写:

#{poolBean.updatePool(item)}

您不需要整个 Seam,与 JSF RI 一起工作得很好。

于 2010-04-02T18:53:16.267 回答
0

可能它与 JSF 1.2 实现 actionListener 的方式有关。在 JSF 1.1 和最近的 JSF 1.2 实现(Richfaces、Trinidad 等)中,顺序是 setPropertyActionListener(或 Attribute)-> actionListener -> action。在 JSF 1.2 和现在在 Richfaces 和 Trinidad(不确定 IceFaces)中实现的顺序是 actionListener -> setPropertyActionListener(或属性)-> action。我知道这很烦人,很烦人……谁想到的?他们有什么想法?无论如何,尝试使用一个动作而不是一个动作监听器,看看它是否有效。

于 2010-04-21T17:13:23.003 回答