Jsp 添加呈现/禁用属性时未激发valueChangeListener

Jsp 添加呈现/禁用属性时未激发valueChangeListener,jsp,jsf,Jsp,Jsf,我有以下和平的准则: <h:selectOneMenu id="countrycode" styleClass="Width300" value="#{customer.countrycode}" valueChangeListener="#{customer.countrycodechange}" onchange="submit()"

我有以下和平的准则:

        <h:selectOneMenu id="countrycode"
                styleClass="Width300"
                value="#{customer.countrycode}"
                valueChangeListener="#{customer.countrycodechange}"
                onchange="submit()"
                immediate="true"
                rendered="#{customer.validcountry}">
                <f:selectItem itemValue="None"
                    itemLabel="-------Select a Country------" />
                <f:selectItem itemValue="AU" itemLabel="Australia" />
                <f:selectItem itemValue="NZ" itemLabel="New Zealand" />
        </h:selectOneMenu>

任何帮助都将不胜感激

只有在提交表单期间,
呈现的
禁用的
属性分别评估为
时,才会处理输入组件。因此,您需要确保
#{customer.validcountry}
在表单提交期间的计算结果与在显示表单期间的计算结果相同。显然,在您的情况下,bean是请求范围的,或者
isValidcountry()
依赖于请求范围的参数,该参数在表单提交期间没有正确保留。您需要确保在表单提交期间保留相同的条件

在JSF2.0中,这将是将bean放在视图范围而不是请求范围中的问题。然而,看到您的
valuechangeenner
hack,我认为您仍然在使用JSF1.x,它还没有视图范围。如果没有看到代码的其余部分,就很难提出正确的解决方案。在输入组件本身应该选择一个有效的国家时,在“Isa valid country?”上有一个呈现属性至少对我来说没有意义

    public void countrycodechange (ValueChangeEvent vce) {

        PhaseId phaseId = vce.getPhaseId();
        if (phaseId.equals(PhaseId.ANY_PHASE))
        {
            vce.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
            vce.queue();
        }
        else if (phaseId.equals(PhaseId.UPDATE_MODEL_VALUES))
        {
            ...