5

我有以下问题。当我单击“Enviar”按钮时,这会调用另一个与 selectOneMenu 关联的方法(在名为“validarSelect”的属性 valueChangeListener 中),然后调用该按钮在名为“validarBoton”的属性 actionListener 中关联的方法。我想知道,为什么会发生这种情况。我希望valueChangeListener不会被调用,因为我没有更改下拉列表。

这是我的页面 JSF:

<?xml version='1.0' encoding='windows-1252'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<html xmlns="http://www.w3.org/1999/xhtml">
    <h:head></h:head>
    <h:body>
        <h:form>
            <h:commandButton value="Enviar..." id="validar" actionListener="#{Domiciliacion.validarBoton}"/>
            <h:selectOneMenu valueChangeListener="#{Domiciliacion.validarSelect}"
                             binding="#{Domiciliacion.selectCombo}">
                <f:selectItems value="#{Domiciliacion.lista}"/>
                <f:ajax event="valueChange" render="@this"/>
            </h:selectOneMenu>
        </h:form>
    </h:body>
</html>

这就是 ManagedBean:

package domiciliaciontest;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;

@ManagedBean(name = "Domiciliacion")
@ViewScoped

public class MB0001 {


private HtmlSelectOneMenu selectCombo;
private List<String> lista = new ArrayList<String>();

public MB0001() {
    super();
    System.out.println("Entro al constructor...");
    lista.add("Caracas");
    lista.add("Bogota");
    lista.add("Santiago");
}


public void validarBoton(ActionEvent actionEvent) {
    System.out.println("Entro a validarBoton...");
    // Add event code here...
}

public void validarSelect(ValueChangeEvent valueChangeEvent) {
    // Add event code here...
    System.out.println("Entro a validarSelect...");
}

public void setSelectCombo(HtmlSelectOneMenu selectCombo) {
    this.selectCombo = selectCombo;
}

public HtmlSelectOneMenu getSelectCombo() {
    return selectCombo;
}

public void setLista(List<String> lista) {
    this.lista = lista;
}

public List<String> getLista() {
    return lista;
}
}

这是我单击“Enviar”按钮时的输出:

  • 输入一个验证选择...
  • 输入一个验证器Boton...
4

1 回答 1

5

当提交的值与初始值不同时,将调用该valueChangeListener方法,无论您是否自行更改。因此,如果当前提交的值("Caracas"在您的情况下)与初始值(在您的情况下)不同,则将调用null该方法。valueChangeListener

也可以看看:


与具体问题无关,将其与属性结合使用binding给我的印象是您正在尝试实现您在针对 JSF 1.x 的文章或答案中阅读的内容。这可以作为在 JSF 1.x 中填充子下拉菜单的 hack 的一部分而被识别。对于 JSF 2.x,您不需要这种方法。此外,带有“validar”(“validate”)的方法名称具有误导性。你真的不需要一个完全值得的Validator吗?但如前所述,这是一个不同的问题。

也可以看看:

于 2012-04-17T13:32:40.673 回答