这是我的jsp:
<h:selectOneMenu value="#{member.dependentName}" onchange="this.form.submit()"
immediate="true" valueChangeListener="#{member.getDependentAddress}">
<f:selectItems value="#{member.dependentList}" />
</h:selectOneMenu>
<h:inputText value="#{member.personName}" immediate="true" />
<h:inputText value="#{member.dob}" immediate="true" />
这就是函数valuechangelistener触发。
public void getDependentAddress(ValueChangeEvent e) {
setPersonName((getDependentsList().get(e.getNewValue().toString())
.getDependentName()));
setDob(getDependentsList().get(e.getNewValue().toString()).getBirth());
System.out.println("New dob value : " + dob);
System.out.println("New name value : " + personName);
FacesContext.getCurrentInstance().renderResponse();
}
两个sysout在控制台中提供新值,但一旦页面加载,字段为空。我已经尝试了bean的所有范围。不行。我错过了什么?
由于
答案 0 :(得分:1)
你什么都没错过。你太过分了。要使其正常工作,您应该从待更改的组件中删除 immediate="true"
。
<h:selectOneMenu value="#{member.dependentName}" onchange="this.form.submit()"
immediate="true" valueChangeListener="#{member.getDependentAddress}">
<f:selectItems value="#{member.dependentList}" />
</h:selectOneMenu>
<h:inputText value="#{member.personName}" />
<h:inputText value="#{member.dob}" />
immediate="true"
组件上的UIInput
将导致其验证阶段发生在应用请求值阶段。这使您有机会在FacesContext#responseComplete()
方法中使用valueChangeListener
跳过其他未处理immediate="true"
集的组件。正如您现在所使用immediate="true"
一样,它们也处理。
请注意,这基本上是旧JSF 1.x时代的黑客攻击。如果您已经在使用JSF 2.x,那么您应该使用<f:ajax listener>
。
<h:selectOneMenu value="#{member.dependentName}">
<f:selectItems value="#{member.dependentList}" />
<f:ajax listener="#{member.getDependentAddress}" render="name dob" />
</h:selectOneMenu>
<h:inputText id="name" value="#{member.personName}" />
<h:inputText id="dob" value="#{member.dob}" />
与
public void getDependentAddress() {
Dependent dependent = getDependentsList().get(dependentName); // Isn't that actually a Map instead of List?
personName = dependent.getDependentName();
dob = dependent.getBirth();
}