JSF从列表中更新bean中的值

Nac*_*321 0 jsf jsf-2

所以,我有一个会话范围的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>  
Run Code Online (Sandbox Code Playgroud)

如您所见,我希望用户输入这些值.当客户点击"保存按钮"时,我需要进行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/>    
Run Code Online (Sandbox Code Playgroud)

除了记录存储在两个列表中的值之外,"保存"bean方法现在不执行任何操作.点击按钮时,现在正在发生两件事.如果客户更改了inputFields上的值,则bean的列表值将设置为null.如果客户没有更改任何内容,则保留bean的原始值.

我怎样才能解决这个问题?谢谢!

Bal*_*usC 5

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

<h:commandButton value="Save" immediate="true" type="submit" action="#{agreement.save}">
    <f:ajax onevent="showAlert"/>
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
  1. immediate="true"使该只有其输入元件immediate="true"设置将被处理.但是,您的输入没有设置此属性.

  2. <f:ajax execute>默认为@this,导致在表单提交期间处理命令按钮本身.因此,在处理过程中会跳过您的输入.

摆脱错位的属性并告诉<f:ajax>执行整个表单.

<h:commandButton value="Save" type="submit" action="#{agreement.save}">
    <f:ajax execute="@form" onevent="showAlert"/>
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)

也可以看看:


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

<h:dataTable value="#{agreement.licenseServers}" var="licenseServer">
    <h:column>
        <h:inputText value="#{licenseServer.name}"/>
Run Code Online (Sandbox Code Playgroud)

也可以看看:


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

也可以看看: