所以,我有一个会话范围的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/>
“保存”bean方法现在不执行任何操作,除了记录存储在两个列表中的值。 点击按钮时,现在正在发生两件事。如果客户更改了inputFields上的值,则bean的列表值将设置为null。如果客户没有更改任何内容,则保留bean的原始值。
我该如何解决这个问题?谢谢!
答案 0 :(得分:5)
命令按钮有2个问题:
<h:commandButton value="Save" immediate="true" type="submit" action="#{agreement.save}">
<f:ajax onevent="showAlert"/>
</h:commandButton>
immediate="true"
会导致 设置immediate="true"
的仅输入元素将被处理。但是,您的输入没有设置此属性。
<f:ajax execute>
默认为@this
,导致仅在表单提交期间处理命令按钮本身。因此,在处理过程中会跳过您的输入。
摆脱错位的属性并告诉<f:ajax>
执行整个表单。
<h:commandButton value="Save" type="submit" action="#{agreement.save}">
<f:ajax execute="@form" onevent="showAlert"/>
</h:commandButton>
然后您的数据模型可能存在问题。您似乎在向数据表而不是List<String>
提供List<SomeBean>
。 String
是不可变的,并且没有值的setter。 <h:inputText value="#{string}">
永远不会起作用。对于第一个表,您确实需要一个LicenseServer
bean,其private String name
属性。然后您可以按如下方式使用它:
<h:dataTable value="#{agreement.licenseServers}" var="licenseServer">
<h:column>
<h:inputText value="#{licenseServer.name}"/>
无关,您是否知道onevent
被调用了3次?出于此目的,您可能希望检查ajax事件状态是否等于"success"
。