valuechangelistener不会在文本框中填充值

时间:2012-02-02 12:24:46

标签: jsf valuechangelistener

这是我的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的所有范围。不行。我错过了什么?

由于

1 个答案:

答案 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();
}