大家好我在JSF验证时遇到了问题。我想验证一个邮件地址,如果它已经被使用和正确的邮件格式。这是它应该看起来的图片。 https://www.dropbox.com/s/bs9nshmuurauc2e/Unbenannt.JPG 我希望能理解这个问题。我现在不知道如何实现它。 我可以为不同的事件设置不同的消息吗?
我使用primefaces 3.5和jsf 2.1
<p:row>
<p:column style="width:400px">
<h:outputLabel for="email" styleClass="outputRight" value="#{msg['regi_mail']}" />
</p:column>
<p:column style="width:350px">
<p:inputText style="width:350px" requiredMessage="#{msg['regi_mail_valid']}" validatorMessage="#{msg['regi_mail_valid']}" id="email" value="#{regiBean.user.EMAIL}" required="true">
<f:validateRegex pattern="^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$" />
<f:ajax event="blur" render="format user" />
</p:inputText>
</p:column>
<p:column style="width:410px">
<h:panelGroup id="mail" class="fa fa-question-circle fa-2x" />
<p:overlayPanel for="mail" showEvent="mouseover" hideEvent="mouseout" hideEffect="fade">
<p:panel>
TEXTTEXTTEXT
</p:panel>
</p:overlayPanel>
<p:message id="format" for="email" />
</p:column>
</p:row>
<p:row>
<p:column style="width:400px">
<h:outputLabel styleClass="outputRight" value="Username" />
</p:column>
<p:column style="width:350px">
<h:outputLabel id="user" style="color: green;" value="#{regiBean.user.EMAIL}" />
</p:column>
<p:column>
<h:panelGroup id="us" class="fa fa-minus-square fa-2x" />
<h:panelGroup/>
</p:column>
</p:row>
答案 0 :(得分:1)
我做过类似的事,但前端只是不同。
我希望你能从中得到一些帮助。
答案 1 :(得分:0)
这可能有点晚了,我看到问题已在2月份提出。但是,似乎这应该是您应该提供自定义验证器的情况。这是我的建议:
validatorMessage
元素中删除id="email"
属性。同时删除该输入元素中的f:validateRegex
验证程序。@ManagedBean
(或类似)注释(以便JSF页面中的EL可以引用它)javax.faces.validator.Validator
validate()
方法。在其中,您可以进行验证,例如:检查您的正则表达式以及查询数据库中的现有地址,例如JPA(或EJB业务方法)。如果验证失败,则抛出javax.faces.validator.ValidatorException
,该javax.faces.application.FacesMessage
由包含相关错误消息的validate()
实例构成(有各种构造函数,找到适用的构造函数)。@ManagedBean public class MyEmailValidator implements Validator {
@EJB UserEJBLocal userEJB; // supposing you want to use a method in there to get list of e-mail addresses
private static final String REGEXP = "^[_A-Za-z0-9-\+]+(\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$";
@Override public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (! Pattern.matches(REGEXP, value.toString())) {
throw new ValidatorException(new FacesMessage(component.getAttributes().get("formatMsg")));
}
List existingAddresses = userEJB.getAllAddresses(); // or whatever method your are using to obtain current addresses, e.g. JPA.
if (existingAddresses.contains(value.toString()) {
throw new ValidatorException(new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"The address already exists." // could also be passed in as attribute, etc.
));
}
}
}
方法中唯一可用的东西是FacesContext,UIComponent和值这是有效的。 (见下面的例子。)示例 - Validator类:
<p:inputText id="email" value="#{regiBean.user.EMAIL}"
requiredMessage="#{msg['regi_mail_valid']}" required="true"
>
<f:validator binding="${myEmailValidator}" />
<f:attribute name="formatMsg" value="#{msg['regi_mail_valid']}" />
: <!-- other attributes, if needed -->
<f:ajax event="blur" render="email-msg user" />
</p:inputText>
:
<p:message id="email-msg" for="email" />
示例 - JSF代码段:
{{1}}
嗯,上面的例子可能不完整,但可能会指出你正确的方向。
好的,那么也许您想要检查当前行的电子邮件与其他行中的电子邮件?你有点不幸...我能想到的唯一方法是以某种方式将它们全部收集到一个列表中,你可以通过另一个属性传递给验证器。动态表格不是很容易......您可能想重新考虑一下您的流程。