我编写了一个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执行。有办法解决这个问题吗? 非常感谢!
答案 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。