我的应用程序使用的是jsf v1.2。这是一个类似于这个线程(由balusc回答)的问题,几天前我将其标记为已回答。
JSF 1.2 Life Cycle understanding: Executing the ValueChangeListener method in InvokeApplication phase
这次没有,只有一个adataTable
和adropdown
包含一些panelgrid
的表单。根据用户选择的outputText
值,必须填充dropdown
中的一些outputText
字段。
下面是下拉列表的代码:
<h:selectOneMenu id="drpDownLoans" value="#{loanBean.loanId }" valueChangeListener="#{loanBean.getLoanDetails }" onchange="submit()">
<f:selectItem itemLabel="--Select--" itemValue="0"/>
<f:selectItems value="#{loanBean.availableLoans }"/>
</h:selectOneMenu>
在更改下拉值时;我想从数据库中填充一些
panelGrid
,下面是代码:<h:panelGrid columns="2">
<h:outputLabel id="lblLoanId" value="Loan Id"></h:outputLabel>
<h:outputText id="txtLoanId" value="#{loanBean.loanId }"></h:outputText>
<h:outputLabel id="lblROI" value="Rate of Interest (% pa)"></h:outputLabel>
<h:outputText id="txtROI" value="#{loanBean.rateOfInterest }"></h:outputText>
<h:outputLabel id="lblNOI" value="No. of Installments (months))"></h:outputLabel>
<h:outputText id="txtNOI" value="#{loanBean.noOfInstallments }"></h:outputText>
</h:panelGrid>
下面是在loanbean.java上执行的代码:
public void getLoanDetails(ValueChangeEvent event){
Integer value = (Integer)event.getNewValue();
DataService service = new DataService();
LoanBean loanBean = service.getLoanDetails(value);
this.setLoanId(loanBean.getLoanId());
this.setRateOfInterest(loanBean.getRateOfInterest());
this.setNoOfInstallments(loanBean.getNoOfInstallments());
}
代码运行得很好,但不知道为什么:(
我的理解是:应该显示整数(即0)和字符串(即null)的默认值
为什么
outputText
和dropdown
都存在于outputText
元素中。当表单在下拉值更改时提交时,form
中的字段值设置为默认值,即对于panelGrid
,component submittedValue将为integer
,对于0
,它将为String
。由于我没有任何转换器/验证器,组件值也将null
表示0
,integer
表示null
。然后执行String
并根据从数据库中获取的值将所有值设置为ValueChangeEvent
内容。然后,在第4阶段,db hit在第3阶段设置的所有这些值都应根据在转换器/验证器之后设置的组件值重置为其默认值,因此对于panelGrid
应为0
,对于integer
应为null
。那么为什么要正确地填充值而不是默认值呢?再一次在概念上停留在生命周期事件上:(请指出我在错误理解中遗漏了什么。)
最佳答案
tldr:字段是只读的
当您的panelGrid
绑定到可更改的loanBean
时,panelGrid
仅使用定义为只读的输出组件(属于javax.faces.component.UIOutput
的子类)。它们没有处理请求值的方法(即UIInput.setSubmittedValue
、UIInput.getSubmittedValue
和UIInput.setValue
)。事实上,当提交表单时,请求不包含来自OutputText
组件的解码值。
因此,您不需要在ValueChangeListener
过程中耍花招-更新模型值是安全的,而不必担心apply model value阶段会被覆盖。
uiinput javadoc:http://docs.oracle.com/cd/E17802_01/j2ee/j2ee/javaserverfaces/1.2/docs/api/javax/faces/component/UIInput.html
调试阶段:http://www.ibm.com/developerworks/java/tutorials/j-jsf2/section7.html