我在我的应用程序中使用JSF v1.2。对于这个线程(由BalusC回答),这是一个类似的问题,我在几天前标记为回答。
这次没有dataTable
,只有dropdown
和panelgrid
包含一些outputText
的表单。根据用户选择的dropdown
值,必须填充outputText
内的一些panelGrid
字段。
以下是下拉列表的代码:
<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>
更改下拉值;我想从DB中填充一些outputText
,下面是代码:
<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和字符串,即空值
WHY
dropdown
元素中都存在outputText
和form
。当表单在下拉值更改时提交时,panelGrid
中显示的字段值将设置为默认值,即对于integer
,组件#submittedValue将为0
并且对于String
,它将是null
。由于我没有任何转换器/验证器,0
的组件#值也将是integer
而null
的{{1}}也是String
。然后将执行ValueChangeEvent
,并根据从DB获取的值将所有值设置为panelGrid
内容。然后在阶段4中,db命中在阶段3中设置的所有这些值应根据在转换器/验证器之后设置的组件#值重置为其默认值,因此0
应为integer
{}}和null
String
。那么为什么值正确填充而不是默认值?
然而,在概念上再次陷入生命周期事件:(请在我误解的情况下把我所缺少的东西钉在上面。
答案 0 :(得分:1)
TLDR:字段为只读
虽然panelGrid
绑定到loanBean
是可变的,但panelGrid
仅使用输出组件(javax.faces.component.UIOutput
的子类),根据定义,它们是只读的。这些没有处理请求值的方法(即UIInput.setSubmittedValue
,UIInput.getSubmittedValue
和UIInput.setValue
)。实际上,在提交表单时,请求不包含OutputText
组件的解码值。
因此,您不需要在ValueChangeListener
过程中玩弄技巧 - 更新模型值是安全的,而不必担心应用模型值阶段会覆盖。
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