Создание ваших собственных валидаторов в JSF 1.2 с Facelets 1.1.12 - PullRequest
2 голосов
/ 12 октября 2009

Я просматривал следующую ссылку и обнаружил, что javax.faces.webapp.ValidatorTag устарел и заменен ValidatorELTag, однако я не могу найти какую-либо хорошую информацию об этом.

Я хочу создать средство проверки регулярных выражений, которое принимает входные данные: регулярное выражение и сообщение об ошибке.

То есть я бы хотел иметь такой элемент управления:

<regexValidator for="myControl" check="([a-Z]^)" errorMessage="Your input contained incorrect characters" />

Теперь приведенная выше ссылка показывает, как сделать небольшую часть этого, но многое изменилось с тех пор, как это было написано, и методы устарели, как мне решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 12 октября 2009

См. Создание пользовательского валидатора в JEE5 Tutorial . Раздел Создание пользовательского тега подробно описывает, как реализовать класс ValidatorELTag.


for="myControl"

Я сомневаюсь, что вам понадобится этот атрибут (я не уверен, как бы вы его использовали). Валидатор будет установлен на родительский элемент управления. for атрибуты обычно используются, только когда один элемент управления ссылается на другой, как в компоненте метки.


РЕДАКТИРОВАТЬ: я неправильно понял вопрос; ответ выше относится к JSP (те связанные с тегами классы в базовом JSF 1.2 предназначены только для JSP; Facelets имеет собственную систему тегов ; хорошая новость в том, что вам не нужен Java-класс специально для определения тег).

Пример валидатора:

public class RegexValidator implements Validator, StateHolder {
  private boolean isTransient;
  private String regex;

  public String getRegex() { return regex; }
  public void setRegex(String regex) { this.regex = regex; }

  public void validate(FacesContext context, UIComponent component, Object value)
      throws ValidatorException {
    //TODO: throw ValidatorException if not valid
  }

  //TODO: implement remaining StateHolder methods...
}

Этот валидатор затем регистрируется в faces-config.xml:

  <validator>
    <validator-id>regex.validator</validator-id>
    <validator-class>val.RegexValidator</validator-class>
  </validator>

Затем вы добавляете библиотеку тегов в приложение (например, WEB-INF/facelets/foo.taglib.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
  "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
  "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
  <namespace>http://demo</namespace>
  <tag>
    <tag-name>regexValidator</tag-name>
    <validator>
      <validator-id>regex.validator</validator-id>
    </validator>
  </tag>
</facelet-taglib>

Добавьте объявление xmlns:demo="http://demo" к любым представлениям Facelets, в которых вы хотите использовать библиотеку тегов; Ваш тег валидатора начнется в форме <demo:regexValidator ...; атрибуты будут выбраны посредством самоанализа класса валидатора.

0 голосов
/ 17 мая 2010

Вот кусок, который я забыл добавить к своему коду, который подвел меня ...

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/WEB-INF/faces/foo.taglib.xml</param-value>
</context-param>

Вы также можете изменить check="([a-Z]^)" на regex="..."

Мне нравится этот подход, потому что нет необходимости расширять ValidatorELTag. Я очень большой поклонник личинок, и это еще одна крутая особенность.

...