Java 验证程序中的JSF2消息

Java 验证程序中的JSF2消息,java,jsf,Java,Jsf,我对JSF2.0中在自定义验证器中设置的消息表示怀疑。 这是密码 public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { matcher = pattern.matcher(value.toString()); if(!matcher.matches()){ FacesMessage m

我对JSF2.0中在自定义验证器中设置的消息表示怀疑。 这是密码

public void validate(FacesContext context, UIComponent component,
        Object value) throws ValidatorException {

    matcher = pattern.matcher(value.toString());
    if(!matcher.matches()){

        FacesMessage msg = 
            new FacesMessage("E-mail validation failed.", 
                    "Invalid E-mail format.");
        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
        throw new ValidatorException(msg);

    }

}
现在我很好奇它到底是如何工作的,因为我们还没有编写代码的一部分 上下文。添加(味精)


那么,如果不在FacesContext中添加这些消息,它如何在UI上检索这些消息呢

jsf在后面有一个catch异常,他正在检索您的消息

如果这不能回答你的问题我不明白你的问题

也许此链接将帮助您:


您还必须在jsf中设置错误的位置。

jsf后面有一个catch异常,他正在检索您的消息

如果这不能回答你的问题我不明白你的问题

也许此链接将帮助您:

您还必须在jsf中为错误设置一个位置。

jsf在中这样做。它只是在
try catch
块中调用您的验证器,捕获
ValidatorException
,从中提取
FacesMessage
,最后将其添加到组件客户端ID上的
FacesContext

JSF实现是开源的。在源代码中,您可以从
UIInput
类的第1143行开始找到以下内容:

// If our value is valid and not empty or empty w/ validate empty fields enabled, call all validators
if (isValid() && (!isEmpty(newValue) || validateEmptyFields(context))) {
    if (validators != null) {
        Validator[] validators = this.validators.asArray(Validator.class);
        for (Validator validator : validators) {
            try {
                validator.validate(context, this, newValue);
            }
            catch (ValidatorException ve) {
                // If the validator throws an exception, we're
                // invalid, and we need to add a message
                setValid(false);
                FacesMessage message;
                String validatorMessageString = getValidatorMessage();

                if (null != validatorMessageString) {
                    message =
                          new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                           validatorMessageString,
                                           validatorMessageString);
                    message.setSeverity(FacesMessage.SEVERITY_ERROR);
                } else {
                    Collection<FacesMessage> messages = ve.getFacesMessages();
                    if (null != messages) {
                        message = null;
                        String cid = getClientId(context);
                        for (FacesMessage m : messages) {
/* Here --> */              context.addMessage(cid, m);
                        }
                    } else {
                        message = ve.getFacesMessage();
                    }
                }
                if (message != null) {
/* And here --> */  context.addMessage(getClientId(context), message); 
                }
            }
        }
    }
}
//如果我们的值有效且不为空或为空且启用了验证空字段,则调用所有验证器
if(isValid()&(!isEmpty(newValue)| | validateEmptyFields(上下文))){
if(验证器!=null){
Validator[]validators=this.validators.asArray(Validator.class);
for(验证器验证器:验证器){
试一试{
validator.validate(上下文、this、newValue);
}
捕获(验证异常){
//如果验证器抛出异常,我们将
//无效,我们需要添加一条消息
setValid(false);
面部信息;
String validatorMessageString=getValidatorMessage();
if(null!=validatorMessageString){
信息=
新FacesMessage(FacesMessage.SEVERITY_错误,
验证消息字符串,
验证程序(消息字符串);
message.setSeverity(FacesMessage.SEVERITY_错误);
}否则{
收集消息=ve.getFacesMessages();
if(null!=消息){
消息=null;
字符串cid=getClientId(上下文);
用于(FacesMessage m:消息){
/*这里-->*/context.addMessage(cid,m);
}
}否则{
message=ve.getFacesMessage();
}
}
如果(消息!=null){
/*这里-->*/context.addMessage(getClientId(context),message);
}
}
}
}
}
JSF在中实现了这一点。它只是在
try catch
块中调用您的验证器,捕获
ValidatorException
,从中提取
FacesMessage
,最后将其添加到组件客户端ID上的
FacesContext

JSF实现是开源的。在源代码中,您可以从
UIInput
类的第1143行开始找到以下内容:

// If our value is valid and not empty or empty w/ validate empty fields enabled, call all validators
if (isValid() && (!isEmpty(newValue) || validateEmptyFields(context))) {
    if (validators != null) {
        Validator[] validators = this.validators.asArray(Validator.class);
        for (Validator validator : validators) {
            try {
                validator.validate(context, this, newValue);
            }
            catch (ValidatorException ve) {
                // If the validator throws an exception, we're
                // invalid, and we need to add a message
                setValid(false);
                FacesMessage message;
                String validatorMessageString = getValidatorMessage();

                if (null != validatorMessageString) {
                    message =
                          new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                           validatorMessageString,
                                           validatorMessageString);
                    message.setSeverity(FacesMessage.SEVERITY_ERROR);
                } else {
                    Collection<FacesMessage> messages = ve.getFacesMessages();
                    if (null != messages) {
                        message = null;
                        String cid = getClientId(context);
                        for (FacesMessage m : messages) {
/* Here --> */              context.addMessage(cid, m);
                        }
                    } else {
                        message = ve.getFacesMessage();
                    }
                }
                if (message != null) {
/* And here --> */  context.addMessage(getClientId(context), message); 
                }
            }
        }
    }
}
//如果我们的值有效且不为空或为空且启用了验证空字段,则调用所有验证器
if(isValid()&(!isEmpty(newValue)| | validateEmptyFields(上下文))){
if(验证器!=null){
Validator[]validators=this.validators.asArray(Validator.class);
for(验证器验证器:验证器){
试一试{
validator.validate(上下文、this、newValue);
}
捕获(验证异常){
//如果验证器抛出异常,我们将
//无效,我们需要添加一条消息
setValid(false);
面部信息;
String validatorMessageString=getValidatorMessage();
if(null!=validatorMessageString){
信息=
新FacesMessage(FacesMessage.SEVERITY_错误,
验证消息字符串,
验证程序(消息字符串);
message.setSeverity(FacesMessage.SEVERITY_错误);
}否则{
收集消息=ve.getFacesMessages();
if(null!=消息){
消息=null;
字符串cid=getClientId(上下文);
用于(FacesMessage m:消息){
/*这里-->*/context.addMessage(cid,m);
}
}否则{
message=ve.getFacesMessage();
}
}
如果(消息!=null){
/*这里-->*/context.addMessage(getClientId(context),message);
}
}
}
}
}

在您提供的链接中,它有一个片段——“context.addMessage”(“userForm:Email”,message);”,这是我在没有上下文的情况下问的问题。add()消息是如何到达用户界面的?在您提供的链接中,它有一个片段——“context.addMessage”(“userForm:Email,message);”,这是我在没有上下文的情况下问的问题。add()消息是如何到达用户界面的?