Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSF Пишем свой ReqExValidator tag, Не получается(( 
V
    Опции темы
Fedrus
Дата 3.10.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



Здравствуйте все!
Сейчас работаем на JBoss 4.2.0 (JSF 1.2) (пишим в MyEclipse). 
Появилась необходимость написания ReqExValidatorа (думаю это покажется интересным не только мне)

1. Создаем класс валидатора (у меня в src.controller):
Код

package controller;

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 RegExValidator implements
 Validator {

 String regex;

 public void validate(
 FacesContext _context,
 UIComponent _component,
 Object _value)
 throws ValidatorException {

 String val = (String) _value;
 if (!val.matches(regex)) { 
 throw new ValidatorException(
 new FacesMessage(
 "Incorrect value, does not match regular expression: "
 + regex)); }

 }

 public String getRegex() {
 return regex;
 }

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


2. Создаем клас тега валидатора(там же):
Код

package controller;

import javax.faces.validator.Validator;
import javax.faces.webapp.ValidatorTag;
import javax.servlet.jsp.JspException;

public class RegExValidatorTag extends
 ValidatorTag {

 private String regex;
 
 public RegExValidatorTag(){
 super();
 super.setValidatorId("regexValidator");
 }

 protected Validator createValidator()
 throws JspException {
 RegExValidator result = null;
 result = (RegExValidator)super.createValidator();
 result.setRegex(regex);
 return result;
 }

 public String getRegex() {
 return regex;
 }

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


3.Добавляем файл описания библиотеки тегов сюда <PROJECT_HOME>/web/WEB-INF/mylib.tld
содержание файла(у меня):
Код

<taglib>
 <tlibversion>0.1</tlibversion>
 <jspversion>2.0</jspversion>
 <shortname>JSF test 1 taglib</shortname>
 <tag>
 <name>regexValidator</name>
 <tagclass>controller.RegExValidatorTag</tagclass>
 <attribute>
 <name>regex</name>
 <required>true</required>
 <rtexprvalue>false</rtexprvalue>
 </attribute>
 </tag>
</taglib>


4. Добавляем валидатор в faces-config.xml(это скорее всего нужно чтоб использовать его как  <f:validator validatorId=, хоя не знаю-это я не понял) :
Код

<validator>
        <validator-id>regexValidator</validator-id>
        <validator-class>controller.RegExValidator</validator-class>
        <attribute>
            <attribute-name>regex</attribute-name>
            <attribute-class>java.lang.String</attribute-class>
        </attribute>
    </validator>


5. Добавляем на странице свою библиотеку тегов и используем валидатор(у меня) :
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="/WEB-INF/mylib.tld" prefix="j" %>

<f:subview id="tagTestModule">

<h:form>
<h:messages showDetail="true"></h:messages>

<h:outputText value="Input" ></h:outputText>

<h:inputText id= "input1">
<j:regexValidator regex="[A-Za-z]+"/>
</h:inputText>
<h:commandButton value="submit"></h:commandButton>


</h:form>
</f:subview>
оригинал статьи(http://andrej.racchvs.com/archives/2004/03/25/jsf-a-regular-expression-validator/)

И так выполнение: при первом заходе на страницу (как я понял) создается RegExValidator и назначется в переменную regex мое выражение [A-Za-z]+,но когда я ввожу в поле данные и нажимаю кнопку соответственно вызывается RegExValidator но почемуто в regex уже NULL и соответственно на строке if (!val.matches(regex)) {    выбрасывается ошибка java.lang.NullPointerException.
Вот такая проблемма.Помогите пожалуйста разобраться. Думаю что можно будет потом написать статью, людям пригадиться (еще плз посоветуейте литературу по Java так как я скорее всего не знаю решения как раз из-за малознания java)

Вот листинг ошибки:
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
    backend.NavigationFilter.doFilter(NavigationFilter.java:62)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

root cause

java.lang.NullPointerException
    java.util.regex.Pattern.<init>(Pattern.java:1123)
    java.util.regex.Pattern.compile(Pattern.java:817)
    java.util.regex.Pattern.matches(Pattern.java:919)
    java.lang.String.matches(String.java:1921)
    controller.RegExValidator.validate(RegExValidator.java:21)
    javax.faces.component.UIInput.validateValue(UIInput.java:1013)
    javax.faces.component.UIInput.validate(UIInput.java:867)
    javax.faces.component.UIInput.executeValidate(UIInput.java:1065)
    javax.faces.component.UIInput.processValidators(UIInput.java:666)
    javax.faces.component.UIForm.processValidators(UIForm.java:229)
    javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1030)
    javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1030)
    javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1030)
    javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:662)
    com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
    backend.NavigationFilter.doFilter(NavigationFilter.java:62)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

У кого какие предложения?

Это сообщение отредактировал(а) Fedrus - 3.10.2007, 11:58
--------------------
Если вы идете через ад, идите не останавливаясь.
PM MAIL   Вверх
ivg
Дата 3.10.2007, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Цитата

но когда я ввожу в поле данные и нажимаю кнопку соответственно вызывается RegExValidator но почемуто в regex уже NULL и соответственно на строке if (!val.matches(regex)) {    выбрасывается ошибка java.lang.NullPointerException.

JSF сохраняет состояние View перед рендерингом (фаза RENDER_RESPONSE) и восстанавливает его на фазе RESTORE_VIEW. Соотв. нужно обеспечить такую возможность для вашего Валидатора. Где то читал, что для JSF 1.2 достаточно сделать класс Serializable, ну а если залезть в исходники JSF и сделать как там, то что то вроде этого:

Код

package controller;

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;
import javax.faces.component.StateHolder;

public class RegExValidator implements Validator, StateHolder {

 String regex;

  public void validate(FacesContext _context, UIComponent _component, Object _value)
    throws ValidatorException {

    String val = (String) _value;

    if (!val.matches(regex)) { 
      throw new ValidatorException(
        new FacesMessage("Incorrect value, does not match regular expression: "
          + regex));
    }
 }

  public String getRegex() {
    return regex;
  }

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

  public Object saveState(FacesContext context) {

        Object values[] = new Object[1];
        values[0] = this.regex;
        return (values);

    }


    public void restoreState(FacesContext context, Object state) {

        Object values[] = (Object[]) state;
        this.regex = ((String) values[0]);

    }


    private boolean transientValue = false;


    public boolean isTransient() {

        return (this.transientValue);

    }


    public void setTransient(boolean transientValue) {

        this.transientValue = transientValue;

    }
}

PM MAIL   Вверх
Fedrus
Дата 4.10.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 20.9.2007

Репутация: нет
Всего: нет



ОГромное спасибо ivg  smile  smile .
Все заработало сейчас добавил тегу атрибут  message  smile  .
В принципе все понятно как работает но хочу полностью разобраться, потому
сейчас буду читать про StateHolder про фазы JSF (кстати может кто посоветует хорошый ресус по теме фаз JSF)

Это сообщение отредактировал(а) Fedrus - 4.10.2007, 09:35
--------------------
Если вы идете через ад, идите не останавливаясь.
PM MAIL   Вверх
Maksym
Дата 4.10.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Fedrus
JSF Life Cycle

Это сообщение отредактировал(а) Maksym - 4.10.2007, 11:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0734 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.