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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSF: проблема с custom tag-ом, jsf: custom tag в panelGrid 
:(
    Опции темы
trace
Дата 22.2.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



добрый день,

возникла следующая проблема.
разработан некоторый jsf custom tag. он функционирует корректно, если его поместит просто в форму, но если его поместить в PanelGrid, то при сабмите формы(по кнопке либо javascript-ом), он отображается 2 раза. еще раз сабмитишь - 3 раза. еще раз - 4, и т.д. , и т.п.
Может кто-то подскажет, в чем может быть проблема?
PM MAIL   Вверх
alexsmirnov
Дата 28.2.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Скорее всего, в методах saveState/restoreState забыли сохранить или восстановить состояние суперкласса
то есть скорее всего проблемы в изменении id компонента между запросами
PM MAIL   Вверх
trace
Дата 1.3.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня вообще не были переопределены saveState() и RestoreState(). Но добавление их в виде
Код

 public Object saveState(FacesContext context)
    {
        Object[] values = new Object[1];
        values[0] = super.saveState(context);

        return values;
}
    public void restoreState(FacesContext context, Object state)
    {
        Object[] values = (Object[])state;
        super.restoreState(context, values[0]);
    }


ничего не изменило, к сожалению. Id компонента я получаю через String clientId = getClientId(context), при сабмите EncodeBegin вызывается несколько раз, и id при этом выдается тот же самый. Может в Save/RestoreState нужно добавить что-то еще?
PM MAIL   Вверх
alexsmirnov
Дата 4.3.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тогда нужно более подробно про код для понимания.
Разница с PanelGrid - он сам выводит дочерние компоненты, вместо вывода по тегам JSP.
Когда встречается такое место - jsf пытается понять - остались ли компоненты старыми ил что-то на странице поенялось ( например- сработал <c:if >
Для сравнения используются именно id компонентов, и если они не сохраняются ( после восстановления null ) - именно такое дублирование и происходит.
Но это не единственная причина , возможны варианты
Попробуй присвоить компоненту id в явном виде - если опять продублируются и не будет exception на duplicate id - ищи именно в этом направлении
Если выругается - скорее где-то в JSP теге
PM MAIL   Вверх
trace
Дата 10.3.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Id у меня и задается напрямую, это необходимый атрибут... в общем, думаю, лучше привести код:

на jsp странице (неотносящиеся к делу атрибуты опущены)
Код

 <ct:customerSelectTag  id="customerID"/>


UICustomerSelectTag(лишнее тоже опущено, основная идея в том, что ид берется из getClientId,
и используется как id input-а):

Код

public class UICustomerSelectTag extends UIInput {

    public UICustomerSelectTag(){
        super();
        this.setRendererType(null);
    }

    public String getFamily() {
        return null;
    }

    public Object saveState(FacesContext context)
    {
        Object[] values = new Object[1];
        values[0] = super.saveState(context);

        return values;
}
    public void restoreState(FacesContext context, Object state)
    {
        Object[] values = (Object[])state;
        super.restoreState(context, values[0]);
    }

    public void encodeBegin(FacesContext context) throws IOException {
        if (!isRendered()){
            return;
        }
        ResponseWriter writer = context.getResponseWriter();
        String clientId = getClientId(context);
        String customerInputId = clientId;
        writer.startElement("input", this);
        makeWriteAttribute(writer, "value", (String)eval("value"), "value");
        writer.writeAttribute("id", customerInputId, "id");
        writer.writeAttribute("name", customerInputId, "name");
        writer.endElement("input");
    }

     public void makeWriteAttribute(ResponseWriter writer, String attributeName, 
            Object attributeValue,    String componentProperty)  throws IOException {
        if (attributeValue != null) {
            writer.writeAttribute(attributeName, attributeValue, componentProperty);
        }
     }

     public void decode(FacesContext context) {
        Map requestMap = context.getExternalContext().getRequestParameterMap();
        String clientId = getClientId(context);
        String valueName = (String)requestMap.get(clientId);
        setSubmittedValue(valueName);
        setValid(true);
      }


Вот примерно так. Можете что-то посоветовать?

PM MAIL   Вверх
trace
Дата 10.3.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Еще один момент. Эта проблема 100% связана именно с заданием id тега, потому что в отсутствие этого атрибута удваивание не происходит. Однако, проблема в том что мне по функциональности никак без задания ид не обойтись...
PM MAIL   Вверх
trace
Дата 13.3.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем(может кому пригодится), проблема была таки в задании атрибута id для custom tag-а. Мне нужно было задавать id (фактически было несколько custom tag-ов, используемых в связке). Наверное, jsf как-то иначе анализирует теги при задании именно атрибута id... Anyway, заменой атрибута id на атрибут customerID(можно подставить что угодно smile) проблема была решена smile. Больше никакого удваивания, утраивания и пр., чего и всем желаю smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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