JSF

时间:2017-08-23 16:59:46

标签: validation jsf

我试图做一个搜索功能,其中我有多个字段,至少需要其中一个字段或一组字段。

我在StackOverflow上找到的唯一答案是:How to validate if at least one of multiple input fields is entered?

那里有两个解决方案:一个使用Omnifaces(由于项目要求我无法使用),另一个不优雅,因为当字段数量很大时它会增长很多。

我有这些字段,例如:

                <p:selectOneMenu value="#{backingBean.type}"id="type">
                    <f:selectItem itemLabel="#{constantsController.SELECT_TYPE_HEADER}"
                        itemDisabled="true" />
                    <f:selectItems
                        value="#{constantsController.getTypes().entrySet()}"
                        var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />
                </p:selectOneMenu>

                <p:inputText id="number" value="#{backingBean.number}"/>

                <p:inputText id="year" value="#{backingBean.year}"/>

                <p:inputText id="number2" value="#{backingBean.number2 }"/>

                <p:selectOneMenu value="#{backingBean.state}"
                    id="state" filter="true" filterMatchMode="startsWith">
                    <f:selectItem itemLabel="Choose its state" disabled="true" />
                    <f:selectItems value="#{constantsController.getStates().entrySet()}"
                        var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />
                </p:selectOneMenu>

                <p:selectOneMenu id="entity"
                    value="#{backingBean.entity }">
                    <f:selectItem itemLabel="Select entity"
                        itemDisabled="true" />
                    <f:selectItem itemLabel="Entity1" itemValue="1"></f:selectItem>
                    <f:selectItem itemLabel="Entity2" itemValue="2"></f:selectItem>
                </p:selectOneMenu>

                <p:selectOneMenu id="documentType"
                    value="#{backingBean.documentType}">
                    <f:selectItems
                        value="#{constantsController.getDocumentTypes().entrySet()}"
                        var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />
                </p:selectOneMenu>
                <p:inputText id="documentNumber" value="#{backingBean.documentNumber}"/>

你可以看到,我有多个字段。并且要求要求我需要以下其中一项(我将写下id):

1- type + number + year

2- number2 + state

3-实体

4- documentType + documentNumber

所以当我单击commandButton时,我需要这个来检查这些组(1,2,3或4)中的一个是否被填充。

此外,这些群体本身需要被要求,即我们说我已经填满了实体&#39;,而且我也填补了这一年,它不能让我从一年起进步需要伴随着&#39;类型&#39;和&#39;数字&#39;。

1 个答案:

答案 0 :(得分:0)

我通过将辅助bean中的布尔值与每个字段/字段组相关联来解决它。它不是一个优雅的解决方案,但我没有找到任何其他解决方案。

所以我所做的是通过支持bean中的一组字段定义一个用true值初始化的布尔值:

private boolean typeNumberYear = true;
private boolean number2State = true;
private boolean entityRequired = true;
private boolean documentTypeDocumentName = true;
private boolean masterRequired = true;

然后验证它们:

public void checkRequiredFields(){

    if(!type.equals("") && number != 0 && year != 0)
        typeNumberYear = false;
    if(number2 != 0 && !state.equals(""))
        number2State = false;
    if(!entity.equals(""))
        entityRequired= false;
    if(!documentType.equals("") && documentNumber != 0)
        documentTypeDocumentName = false;

    if(!typeNumberYear || !number2State || !entityRequired || !documentTypeName)
        masterRequired = false;
}

由于所有这些都在支持bean中,我可以将此函数放在命令按钮的actionListener上,而action函数仍然在控制器中。

<p:commandButton value="Search" icon="ui-icon-search"
                actionListener="#{backingBean.checkRequiredFields}"
                action="#{controller.searchButtonClicked}"/>

现在在required参数中,我只关联了所有这些参数上的相应布尔值和masterRequired。例如。在typenumberyear输入中,我按要求提供了以下内容:

required = "backingBean.typeNumberYear and backingBean.masterRequired"

此解决方案的唯一缺点是,在界面中,将在上面指出的所有字段上显示星号,但如果您只是输入实体,它将按预期进行搜索,然后它会更新并删除星号。