JSF 2.1使用Ajax同时验证两个输入

时间:2013-02-27 14:14:25

标签: java jsf-2 validation customvalidator

我在同时验证两个输入时遇到问题。

在我的验证器中,我需要来自两者的数据:

  1. <h:selectOneListbox>
  2. <h:inputText>
  3. 想法是检查送货人员是否可以到达地址。 在验证期间,我向DB发出请求。并寻找streetName + houseNumber的组合。

    这是我的JSF页面的一部分。

        <h:form>
            <p> 
                <h:outputLabel for="streetsList" value="Street"/>
                <h:selectOneListbox id="streetsList" binding="#{theStreetsList}" 
                                    size="1" value="#{makeOrder.streetName}" required="true">
                    <f:selectItems value="#{locationView.streetNames}" var="streetName" 
                                   itemLabel="#{streetName}" itemValue="#{streetName}"/>
                </h:selectOneListbox>
            </p>
    
            <p class="address_details">
                <h:outputLabel for="houseInput" value="#{msgs.house}"/>
                <h:inputText id="houseInput" class="tab_input house_input" 
                             value="#{makeOrder.house}" required="true">
                    <f:validator validatorId="AddressValidator" />
                    <f:attribute name="street" value="#{theStreetsList}" />
                    <f:ajax event="blur" execute="streetsList houseInput" render="m_houseInput" />
                </h:inputText>
                <h:message id="m_houseInput" for="houseInput" style="color:red" />
    
                <h:outputLabel for="flatInput" class="flat_label" value="#{msgs.flat}"/>
                <h:inputText class="tab_input flat_input" value="#{makeOrder.flat}"/>
            </p>
        </h:form>
    

    这是我班级的验证方法:

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) 
            throws ValidatorException {
    
        String house = (String) value;
    
        UIInput streetsComponent = (UIInput) component.getAttributes().get("street");
        String streetName = (String) streetsComponent.getSubmittedValue();
    
        Street orderStreet = this.findStreetInDB(streetName, house);
    
        if (orderStreet.getName().equals("dummyStreet")) {
    
            // Show error
            FacesMessage msg = new FacesMessage(
                    "Unfortunately we do not deliver to this address, yet.");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);
        }
    }
    

    我的问题是String streetNamenull

    P.S。此元素的值可以正常显示。如果我不使用验证,我甚至可以提交表格。

    • 我做错了什么?
    • 这样做的正确方法是什么?

    谢谢!

1 个答案:

答案 0 :(得分:1)

  

表示提交值的String streetName现在为null。

组件按照它们在组件树中的显示顺序进行处理。在处理期间,获取,转换和验证提交的值。如果有任何成功,则转换/验证的值将设置为组件的值,并且提交的值将设置为null

如果2个组件上有验证器,则只有在第1个组件上调用validatior时,获取另一个组件的提交值才有效。但在你的情况下,它是在第二个组件上调用的,你应该使用UIInput#getValue()而不是getSubmittedValue()。请注意,这将返回已转换和验证的值,因此不会返回“原始”提交的值。