Контроллер проверки JSF 2.0 - PullRequest
1 голос
/ 19 августа 2010

Я очень новичок в JSF / Java, но я хотел бы знать, если кто-нибудь знает хороший способ создать пользовательский контроллер проверки.В моем веб-приложении много форм с перекрывающимися полями, такими как Имя, SSN или адрес электронной почты.Я хотел создать контроллер, который будет обрабатывать все эти проверки и сообщения.

Это хорошая идея?Я искал онлайн документацию, но похоже, что в каждом примере, который я нашел, они помещают метод проверки в конкретный компонент, а не в контроллер.

Любые примеры / ссылки на примеры / советы о хорошем способереализовать что-то вроде этого было бы здорово.

Я использую JSF 2.0

Ответы [ 4 ]

6 голосов
/ 19 августа 2010

Это не нормальный подход.Вы должны делегировать управляющую задачу на FacesServlet.Он отлично справляется со своей работой.Если все, что вам нужно, это отделить проверку от управляемого компонента, просто создайте отдельный класс, который реализует javax.faces.validator.Validator.Чтобы загрузить его автоматически, просто пометьте его соответствующей @FacesValidator аннотацией.

Вот пример запуска:

package com.example;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

@FacesValidator(value="ssnValidator")
public class SSNValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // Implement as you did originally in the bean method.
    }

}

Вы можете объявить его как1013 *<f:validator> в любом UIInput компоненте следующим образом:

<h:inputText value="#{bean.ssn}">
    <f:validator validatorId="ssnValidator" />
</h:inputText>
2 голосов
/ 19 августа 2010

Валидаторы JSF определены для каждого компонента и лучше всего их использовать для предотвращения попадания нежелательной информации в вашу модель.Старайтесь не использовать их для выполнения проверки, когда значение одного компонента влияет на достоверность другого.

Если вы работаете на сервере JEE6, взгляните на JSR 303 Bean Validation .

Из спецификации JSF 2.0 :

В версии 2 спецификации представлена ​​поддержка проверки bean-компонента JSR 303.Внедрение JSF должно поддерживать проверку bean-компонента JSR 303, если среда, в которую включена среда выполнения JSF, требует проверки bean-компонента JSR 303.В настоящее время единственной такой средой является случай, когда JSF включен в среду выполнения Java EE 6.

В спецификации дается определение того, как и на каких этапах выполняется проверка бина жизненного цикла JSF.

1 голос
/ 19 августа 2010

Я думаю, что следующий пример будет работать для вас: http://viralpatel.net/blogs/2009/02/javaserver-faces-jsf-validation-tutorial-error-handling-jsf-validator.html. Он даже имеет валидатор адреса электронной почты в качестве примера.

например, с этой страницы:

Написать валидатор с помощью интерфейса Validator:

package net.viralpatel.jsf.helloworld;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class EmailValidator implements Validator{
    public void validate(FacesContext context, UIComponent component, Object value)
            throws ValidatorException {

        String email = (String) value;

        if(!email.contains("@")) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary("Email is not valid.");
            message.setDetail("Email is not valid.");
            context.addMessage("userForm:Email", message);
            throw new ValidatorException(message);
        }
    }
}

Затем вам понадобится ссылка на этот валидатор в вашем Face-config.xml

    <validator>
        <validator-id>emailValidator</validator-id>
        <validator-class>net.viralpatel.jsf.helloworld.EmailValidator</validator-class>
    </validator>

Тогда используйте это!

<h:inputText id="Email" value="#{userBean.email}" required="true">
    <f:validator validatorId="emailValidator" />
</h:inputText>
0 голосов
/ 21 декабря 2010

А если вы хотите иметь более одного валидатора / класса?

Например:

public class UserValidator implements Validator {

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

        if(username.equals("erik") {
            // some code here...        
            throw new ValidatorException("No Eriks is allowed here..");
        }
    }

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

        String email = (String) value;

        if(!email.contains("@")) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary("Email is not valid.");
            message.setDetail("Email is not valid.");
            context.addMessage("userForm:Email", message);
            throw new ValidatorException(message);
        }
    }
}

Спасибо за вашу помощь =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...