在同一组件中使用JSF绑定+验证程序两次显示消息

在同一组件中使用JSF绑定+验证程序两次显示消息,jsf,Jsf,我有两个组件select和inputText,其中的值是相互依赖的。例如,如果选择选项1,则inputText必须是数字 在我的bean中,我为绑定的2个组件和一个验证方法添加了属性,而在jsp中,我添加了validator和binding属性来选择并绑定到inputText 我使用绑定来获取两个组件的提交值以进行验证 这是正确的方法吗?是否有其他方法获取提交的值 这样做的结果是显示重复的消息。如果我从select中删除binding属性,那么它将按预期工作,但我无法获取所选的值,而是在会话中使

我有两个组件select和inputText,其中的值是相互依赖的。例如,如果选择选项1,则inputText必须是数字

在我的bean中,我为绑定的2个组件和一个验证方法添加了属性,而在jsp中,我添加了validator和binding属性来选择并绑定到inputText

我使用绑定来获取两个组件的提交值以进行验证

这是正确的方法吗?是否有其他方法获取提交的值

这样做的结果是显示重复的消息。如果我从select中删除binding属性,那么它将按预期工作,但我无法获取所选的值,而是在会话中使用缓存值bean值

提前谢谢

阿尔梅罗

代码:


通过将隐藏组件值与选择组件绑定,可以使用黑客绕过。在的onchange方法中,可以设置此隐藏组件的值,并在服务器中获取值:

<h:form id="myForm">
    <h:selectOneMenu id="cmbOptions"
        onchange="document.getElementById('myForm:hidSelectOption').value=this.value">
        <f:selectItem itemLabel="Option 1" itemValue="1" />
        <f:selectItem itemLabel="Option 2" itemValue="2" />
        <f:selectItem itemLabel="Option 3" itemValue="3" />
    </h:selectOneMenu>
    <h:inputHidden id="hidSelectOption" value="#{bean.selectedOption}" />
    <h:commandButton value="Click me" action="#{bean.someAction}" />
</h:form>

我尝试了上述解决方案,但检索到的值是模型值。我希望在模型更新之前的验证阶段获得值。您可以将验证应用于隐藏的组件值。
<h:form id="myForm">
    <h:selectOneMenu id="cmbOptions"
        onchange="document.getElementById('myForm:hidSelectOption').value=this.value">
        <f:selectItem itemLabel="Option 1" itemValue="1" />
        <f:selectItem itemLabel="Option 2" itemValue="2" />
        <f:selectItem itemLabel="Option 3" itemValue="3" />
    </h:selectOneMenu>
    <h:inputHidden id="hidSelectOption" value="#{bean.selectedOption}" />
    <h:commandButton value="Click me" action="#{bean.someAction}" />
</h:form>
@RequestScope
@ManagedBean
public class Bean {
    private String selectedOption;
    //getters and setters...
    public Bean() {
    }

    public void someAction() {
        //showing the actual value of the hidden component...
        //remember that you should use a logger, this is a basic example
        System.out.println(selectedOption);
    }
}