Primefaces 5.0和Ajax。没有调用监听器方法

时间:2015-07-17 17:04:14

标签: ajax jsf primefaces

我使用Primefaces 5.0有多个下拉列表。当您在第一个下拉列表中选择一个选项(在本例中为国家/地区)时,它应该抓住该国家/地区的城市并填充城市下拉列表。但是,我有代码使用国家/地区从我的数据库填充我的城市下拉列表,但从不调用该方法。

My Region.xhtml:

<h:form>
<p:tab title="Region Selection"  rendered="true">                                    
    <p:panel header="Region Information">
        <h:panelGrid columns="2" columnClasses="label, value">
            <h:outputText value="Country" />
            <p:selectOneMenu id="country" value="#{rosterBean.selectedCountry}">
                <p:ajax listener="#{rosterBean.onCountryChange()}" update="state" />
                <f:selectItem itemLabel="Select Country" itemValue="" noSelectionOption="true" />
                <f:selectItems value="#{rosterBean.countries}" />
            </p:selectOneMenu>

            <h:outputText  value="State/ Province" />
            <p:selectOneMenu id="state" value="#{rosterBean.selectedState}">
                <p:ajax listener="#{rosterBean.onStateChange}" />
                <f:selectItem itemLabel="Select State" itemValue="" noSelectionOption="true" />
                <f:selectItems value="#{rosterBean.states}" />
            </p:selectOneMenu>

            <h:outputText value="City" />
            <p:selectOneMenu  id="city" filter="true" filterMatchMode="contains" >
                <f:selectItem  itemLabel="Johannesburg" itemValue="0" noSelectionOption="true" />
                <f:selectItem itemLabel="Pretoria" itemValue="1" noSelectionOption="true" />
            </p:selectOneMenu> 

        </h:panelGrid>
    </p:panel>
</p:tab>
</h:form>

我的豆子:

@ViewScoped
@ManagedBean
public class RosterBean implements Serializable {

public void onCountryChange() {
System.out.println("Updating State");
}
}

我得到了所有的getter和setter,但是从未调用过system.out。所以不管它是否会在那个国家打电话给正确的城市,它永远不会到达那里。

1 个答案:

答案 0 :(得分:0)

您的输入元素和p:ajax需要嵌套在h:form中,否则POST上不会提交任何数据。 actionListeners有时需要访问提交的值(通过方法参数或ActionEvent),因此如果提交的值不可用,则不会调用侦听器。

提示:您可以查看浏览器的开发人员工具,了解实际提交的内容。

另见

你似乎仍然遇到了一些麻烦,所以这里有一个完整的例子,稍微修改一下你自己:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
    </h:head>
    <h:body>                                   
        <h:form>
            <p:panel header="Region Information">
                <h:panelGrid columns="2" columnClasses="label, value">
                    <h:outputText value="Country" />
                    <p:selectOneMenu id="country" value="#{rosterBean.selectedCountry}" >
                        <p:ajax listener="#{rosterBean.onCountryChange()}" update="state" />
                        <f:selectItem itemLabel="Select Country" itemValue="" noSelectionOption="true" />
                        <f:selectItem itemLabel="Country 1" itemValue="1" />
                    </p:selectOneMenu>

                    <h:outputText  value="State/ Province" />
                    <p:selectOneMenu id="state" value="#{rosterBean.selectedState}" >
                        <p:ajax listener="#{rosterBean.onCountryChange}" />
                        <f:selectItem itemLabel="Select State" itemValue="" noSelectionOption="true" />
                        <f:selectItem itemLabel="State1 1" itemValue="1" />
                    </p:selectOneMenu>

                </h:panelGrid>
            </p:panel>
        </h:form>
        <p:commandButton value="Next"/>
    </h:body>
</html>

(请注意,我从class删除了commandButton属性。class不是commandButton上的有效属性。)

RosterBean.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class RosterBean {

    public String selectedCountry;
    public String selectedState;

    public String getSelectedCountry() {
        return selectedCountry;
    }

    public void setSelectedCountry(String selectedCountry) {
        this.selectedCountry = selectedCountry;
    }

    public String getSelectedState() {
        return selectedState;
    }

    public void setSelectedState(String selectedState) {
        this.selectedState = selectedState;
    }

    public void onCountryChange() {
        System.out.println("Updating State");
    }
}