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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RichFaces: rich:extendedDataTable и selection, проблема с атрибутом selection 
V
    Опции темы
beolnix
Дата 2.3.2010, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



у rich:extendedDataTable есть классный атрибут selection. Согласно документации и примерам, данным атрибутом мапится проперти типа org.richfaces.model.selection.SimpleSelection, которая обновляется каждый раз когда список выделенных элементов в таблице изменился. Сам SimpleSelection, если я правильно понял, есть ни что иное как Map порядковый_номер_выделенной_строчки:порядковый_номер_элемента_в_коллекции_ClientsListAction.getAllClients() .

другими словами, если есть таблица вида: 

Код

<rich:extendedDataTable selectionMode="single"
                            value="#{ClientsListAction.getAllClients()}" var="_client" 
                            sortMode="single"
                            selectionMode="single"
                            selection="#{ClientsListAction.selection}">
        <rich:column id="_id">
               <f:facet name="header">
                    <h:outputText styleClass="headerText" value="id" />
                </f:facet>
              <h:outputText value="#{_client.id}" />
        </rich:column>
        <rich:column id="clientName">
                <f:facet name="header">
                    <h:outputText styleClass="headerText" value="Name" />
                </f:facet>
                <h:outputText value="#{_client.clientName}" />
        </rich:column>
        <a4j:support reRender="table"
                             action="#{ClientsListAction.takeSelection}"
                             event="onselectionchange" ajaxSingle="true" />
</rich:extendedDataTable>


и бин вида:

Код

public class ClientsListAction implements ClientsListActionLocal{
    private SimpleSelection selection;
    ...
    public SimpleSelection getSelection() {
     return selection;
    }
    
    public void setSelection(SimpleSelection selection) {
     System.out.println("Setting Started");
        this.selection = selection;        
    }
    ...
    public void takeSelection() {
        System.out.println("selection size:" + selection.size());
    }
}


то по клику на любой из строчек таблицы в selection должен появится один объект SimpleRowKey (или больше одного если selectionMode="multi" ).

Проблема в том, что в моем случае число объектов в selection всегда равно 0. 
т.е. если посмотреть на консоль appServer'а в который деплоится приложение с вышеописанной таблицей и бином, то после выделения какой либо строчки из таблицы там будет:

Код

16:42:28,671 INFO  [STDOUT] Setting Started
16:42:28,676 INFO  [STDOUT] selection size: 0


Получается что обработчик события onselectionchange отрабатывает корректно, но сам объект SimpleSelection не содержит в себе ни одной выделенной строчки. 

я перепробовал перекопипастил все примеры которые смог найти в интернетах, во всех одна и та же ошибка. Но как-то  http://livedemo.exadel.com/richfaces-demo/...edDataTable.jsf он же работает на демосцене richfaces. Я подозреваю что у меня где-то что-то не так настроено. Cам проект представляет из себя ear app на базе seam. 
версии используемых фреймворков:
seam 2.2.0.GA
richfaces 3.3.3.CR1
jsf-api 1.2_12
servlet-api 2.5.0.GA
jsf-facelets 1.1.15.B1

буду благодарен любой помощи или любому намеку, относительно того что стоит ковырять/перенастроить/изучить.


Это сообщение отредактировал(а) beolnix - 2.3.2010, 17:46
PM MAIL Skype GTalk   Вверх
beolnix
Дата 3.3.2010, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



проблема решена. На всякий случай, если кто-то пойдет по тем же граблям что и я:
в rich:extendedDataModel нужно подсовывать особую коллекцию. в примере с демосцены richfaces она создается след. образом:
Код

public ExtendedTableDataModel<Capital> getCapitalsDataModel() {
        if (dataModel == null) {
            dataModel = new ExtendedTableDataModel<Capital>(new DataProvider<Capital>(){

                private static final long serialVersionUID = 5054087821033164847L;

                public Capital getItemByKey(Object key) {
                    for(Capital c : capitals){
                        if (key.equals(getKey(c))){
                            return c;
                        }
                    }
                    return null;
                }

                public List<Capital> getItemsByRange(int firstRow, int endRow) {
                    return capitals.subList(firstRow, endRow);
                }

                public Object getKey(Capital item) {
                    return item.getName();
                }

                public int getRowCount() {
                    return capitals.size();
                }
                
            });
        }
        return dataModel;
    }


от себя добавлю только пару фактов:
1) вышеприведенный код не заработал пока я е добавил перед инструкцией return dataModel; инструкцию dataModel.setRowIndex(-1);
2) следует быть аккуратным при выборе scope для session бина. В книге seam in action(легко гуглится англоязычный вариант 2009 года) есть пара ценных рекомендаций на этот счет.

на всякий случай еще оставлю ссылку на код бина который используется на демосцене richfaces: http://anonsvn.jboss.org/repos/richfaces/b...dTableBean.java
PM MAIL Skype GTalk   Вверх
dzhagr
Дата 17.8.2010, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Beolnix, здаствуйте.

У меня схожая проблема: всегда пустой selection в методе takeSelection(), однако, я использую scrollableDataTable. Единственный вариант, при котором этот объект наполняется - использовать в качестве скоупа для бина - session вместо request. Подскажите, плиз, какой скоуп жизни для своего бина задавали Вы.

Я недавно работаю с richfaces и не могу пока разобраться - является ли сабмит аякс формы тем реквестом, по которому пересоздается бин, скоуп которого задан как request. Можете ответить на этот вопрос?

Спасибо
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.0976 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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