【问题标题】:JSF Updating values in a bean from a listJSF 从列表中更新 bean 中的值
【发布时间】:2013-08-12 19:27:05
【问题描述】:

所以,我有一个会话范围的 bean,它有 2 个字符串值列表。此 bean 称为 AgreementBean.java。我在一个名为 agreementDetail.xhtml 的页面中显示这些列表,如下所示

<h:dataTable id="servers" value="#{agreement.licenseServerNames}" var="licenseServerName">
                        <h:column>
                            <h:inputText value="#{licenseServerName}"/>
                        </h:column>
                    </h:dataTable>
                    Computer IDs<br/>
                    <h:dataTable id="idNames" value="#{agreement.computerIdNames}" var="computerIdName">    
                        <h:column>
                            <h:inputText value="#{computerIdName}"/>
                        </h:column>
                    </h:dataTable>  

如您所见,我希望用户输入这些值。当客户单击“保存按钮”时,我需要进行 Ajax 调用以更新这些值。这是按钮的jsf代码。

<script type="text/javascript">
                        function showAlert(data){                          
                                 alert("SAVED!");   
                        }
                    </script>
                    <h:commandButton value="Save" immediate="true" type="submit" action="#{agreement.save}">
                        <f:ajax onevent="showAlert"/>
                    </h:commandButton><br/><br/>    

“Save”bean 方法现在什么都不做,除了记录存储在两个列表中的值。 单击按钮时,现在正在发生两件事。如果客户更改了 inputFields 上的值,则 bean 列表的值设置为 null。如果客户没有更改任何内容,则保留 bean 的原始值。

我该如何解决这个问题?谢谢!

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    您的命令按钮有 2 个问题:

    <h:commandButton value="Save" immediate="true" type="submit" action="#{agreement.save}">
        <f:ajax onevent="showAlert"/>
    </h:commandButton>
    
    1. immediate="true" 导致 设置了immediate="true" 的输入元素将被处理。但是,您的输入没有设置此属性。

    2. &lt;f:ajax execute&gt; 默认为@this,导致在表单提交期间处理命令按钮本身。因此,您的输入将在处理过程中被跳过。

    去掉放错位置的属性,告诉&lt;f:ajax&gt;执行整个表单。

    <h:commandButton value="Save" type="submit" action="#{agreement.save}">
        <f:ajax execute="@form" onevent="showAlert"/>
    </h:commandButton>
    

    另见:


    那么您的数据模型可能存在问题。您似乎向数据表提供了List&lt;String&gt; 而不是List&lt;SomeBean&gt;String 是不可变的,并且没有值的设置器。 &lt;h:inputText value="#{string}"&gt; 永远不会起作用。对于第一个表,您确实需要一个具有 private String name 属性的 LicenseServer bean。然后您可以按如下方式使用它:

    <h:dataTable value="#{agreement.licenseServers}" var="licenseServer">
        <h:column>
            <h:inputText value="#{licenseServer.name}"/>
    

    另见:


    与具体问题无关,您是否知道onevent 被调用了3 次?为此,您可能想检查 ajax 事件状态是否等于 "success"

    另见:

    【讨论】:

    • 你在 onevent 事情上很准确......我很快就会解决这个问题,谢谢!此外,现在,单击按钮时发生了一些奇怪的事情。它不是更新列表值,而是将原始值两次添加到列表中。因此,列表没有将 更改为 ,而是具有 。想法?
    • 根据目前提供的代码很难判断。它过于简单化了,它根本不起作用。你应该有类似&lt;h:inputText value="#{row.property}"&gt; 而不是&lt;h:inputText value="#{property}"&gt;
    • 问题是它是一个由数据表处理的列表。该属性是列表本身,而不是其中包含的值,这些值是 inputText 字段。 :/(对不起,如果我打扰你了......我是 JSF 的新手)
    • 我不是那个意思。你似乎有一个List&lt;String&gt; 而不是List&lt;LicenseServer&gt;。字符串是不可变的,不可能以这种方式更新值。如果那是真正的代码,那么,你还有另一个原因。
    • 好的,我会尝试寻找另一种方法来处理字符串列表中的 inputFields。谷歌时间!谢谢你的帮助,先生!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多