Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > RichFaces: rich:extendedDataTable и selection


Автор: beolnix 2.3.2010, 17:32
у 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/richfaces/extendedDataTable.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 3.3.2010, 01:29
проблема решена. На всякий случай, если кто-то пойдет по тем же граблям что и я:
в 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/branches/community/3.3.X/samples/richfaces-demo/src/main/java/org/richfaces/demo/extendedDataTable/ExtendedTableBean.java

Автор: dzhagr 17.8.2010, 22:27
Beolnix, здаствуйте.

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

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

Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)