如何解决寻找一种方法来验证jsf中的预先提交
在提交整个对象之前,我在验证某些输入(电子邮件)时遇到了问题。
jsf看起来像这样:
<h:panelGroup id="reportingRecipientTable">
<table cellspacing="0" class="table no-footer" width="100%" style="word-wrap: break-word;">
<thead>
<tr>
<th><h:inputText p:type="email" p:placeholder="Add a valid Email address" value="#{viewModel.reportingRecipient}"
styleClass="form-control #{component.valid ? '' : 'has-errors'}">
<f:ajax execute="@this" />
</h:inputText></th>
<th class="col-sm-3">
<div class="text-center">
<h:commandLink immediate="true" style="width:95px" styleClass="btn btn-default" actionListener="#{viewModel.addReportingRecipient}">
<i class="icon-plus" /> Add
<f:ajax render="reportingRecipientTable" />
</h:commandLink>
</div>
</th>
</tr>
</thead>
<tbody>
<c:forEach items="#{viewModel.getReportingRecipients()}" var="reportingRecipient">
<tr>
<td><h:outputText required="true" value="#{reportingRecipient}" styleClass="form-control" /></td>
<td class="col-sm-3">
<div class="text-center">
<h:commandLink styleClass="btn btn-default" style="width:95px" actionListener="#{viewModel.removeReportingRecipient(reportingRecipient)}">
<i class="icon-trash" /> Remove
<f:ajax render="reportingRecipientTable" />
</h:commandLink>
</div>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</h:panelGroup>
如您所见,我要在提交所有内容之前向表行添加一个(应该有效的)电子邮件地址:
public void addReportingRecipient() {
if (!Utils.isNullOrBlank(reportingRecipient) && reportingRecipient.matches("(^.*@.*\\..*$)")) {
getReportingRecipients().add(reportingRecipient);
this.reportingRecipient = "";
} else{ //not valid
}
}
好吧,这行得通(仅当电子邮件与模式匹配时才添加电子邮件),缺少一个小细节:如果它不是有效的电子邮件地址,我想将“ inputText”标记为无效(styleClass="form-control #{component.valid ? '' : 'has-errors'}"
)。像这样向inputText添加一个验证器:
<h:inputText p:placeholder="Add a valid Email address" validator = "#{emailValidator.isCorrectEmail}" value="#{viewModel.reportingRecipient}"
styleClass="form-control #{component.valid ? '' : 'has-errors'}">
仅在我按下最后一个提交按钮时才起作用-但我想在用户尝试添加无效电子邮件时将该字段标记为无效。
有人知道/有一些提示吗?
解决方法
您使用验证器的代码示例是正确的方法。不要在业务方法中进行验证。
<h:inputText p:type="email" p:placeholder="Add a valid Email address" value="#{viewModel.reportingRecipient}"
styleClass="form-control #{component.valid ? '' : 'has-errors'}">
<f:ajax execute="@this" />
</h:inputText></th>
是否正确使用#{component.valid...}
来设置组件样式。但这在ajax调用上不起作用,因为您没有(重新)呈现ajax事件上的输入。 f:ajax
的默认值为render="@none"
,因此没有任何更新。添加render="@this"
,或者如果您还想显示一条消息,则可以使用其他ID进行操作。
它在“删除”按钮上起作用的事实是,由于输入上的Ajax调用已经更新了状态,因此您可以render
完成整个表。因此,输入被(重新)呈现。
另请参见
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。