验证约束阻止actionListener

时间:2014-06-11 09:48:45

标签: jsf java-ee jsf-2

我编写了一个JSF应用程序,它在其上半部分包含一个带字段的表单,在其下半部分有一个数据表,每个项目都有一个删除按钮:

            <h:panelGrid columns="2" styleClass="default">

                <h:outputLabel for="name" value="Name: " />



                <h:inputText id="name" value="#{user.name}" />

                <h:outputLabel for="name" value="Surname: " />
                <h:inputText id="surname" value="#{user.surname}" />

                <h:outputLabel for="name" value="Email: " />
                <h:inputText id="email" value="#{user.email}" />



                <h:commandButton actionListener="#{manager.save}"
                    styleClass="buttons" value="Save" />
                <h:messages errorStyle="color: red" infoStyle="color: green"  />
                <br/>
                <ui:debug/>
            </h:panelGrid>

           <br/>
            <h:dataTable value="#{userList}" var="item" styleClass="table"
                headerClass="table-header"
                rowClasses="table-odd-row,table-even-row">
                <h:column>
                    <f:facet name="header">Name</f:facet>
                    <h:outputText value="#{item.name}" />
                </h:column>
                <h:column>
                    <f:facet name="header">Surname</f:facet>
                    <h:outputText value="#{item.surname}" />
                </h:column>

                <h:column>
                    <f:facet name="header">Email</f:facet>
                    <h:outputText value="#{item.email}" />
                </h:column>
                <h:column>
                    <f:facet name="header">Delete</f:facet>
                    <h:commandButton actionListener="#{manager.delete(item)}"
                        styleClass="buttons" value="Delete" />
                </h:column>

            </h:dataTable>

        </h:form>

应用程序一直有效,直到我在User Bean上应用了约束:

public class User  {

@Size(min = 5, max = 20, message = "Please enter a valid name (5-20 characters)")
private String name;
@Size(min = 5, max = 20, message = "Please enter a valid surname (5-20 characters)")
private String surname;
@Size(min = 5, message = "Mail size is at least 5 characters")
@Pattern(regexp = "[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+", message = "Email format is invalid.")
private String email;
}

现在,当我点击页面上的“删除”按钮时 - 文本字段为空白 - “约束”验证器启动,阻止actionListener执行。有办法解决这个问题吗? 非常感谢!

1 个答案:

答案 0 :(得分:1)

由于您没有使用ajax,因此提交整个表单并自动触发验证程序。

为了防止这种情况,您可以使用ajax,以便仅提交您要提交的表单部分,或使用两种不同的表单。

使用ajax,您可以执行以下操作:

<h:dataTable id="dataTable" ...>
    ...
    <h:commandButton actionListener="#{manager.delete(item)}"
                    styleClass="buttons" value="Delete" >
        <f:ajax execute="dataTable" render="dataTable" />
    </h:commandButton>
</h:dataTable>
对具体问题

无关,我建议在commandButton中使用属性action而不是actionListener。请参阅Differences between action and actionListener