Эффективная пагинация JSF - PullRequest
11 голосов
/ 12 сентября 2011

Какой самый эффективный способ разбивки на страницы в приложении JSF 2.0?Я использую Primefaces с возможностью обработки данных, и он достаточно умен, чтобы выполнять нумерацию страниц без какого-либо кодирования.

<p:dataTable var="car" value="#{carBean.cars}" paginator="true" rows="10">
    <!-- Multiple columns here-->
</p:dataTable>

То, что я вижу, - это то, что мне нужно поместить боб в область действия сессии или выше.

@ManagedBean
@SessionScoped
public class CarBean{
    public List<Car> getCars(){
        //return data from DB
    }
}

Я хотел бы знать, есть ли другой эффективный способ, как это сделать?

Кстати, я использовал EJB / JPA в бэкэнде.Хотелось бы узнать какие-либо ссылки или учебники, чтобы узнать больше об этом.

Спасибо.

Ответы [ 4 ]

19 голосов
/ 12 сентября 2011

Вам нужно использовать LazyDataModel, чтобы только строк в памяти, которые клиент фактически должен видеть. См. Также пример в витрине PrimeFaces . Это делает разбиение на страницы на уровне БД, чего вы в конечном итоге хотите.

RichFaces поддерживает, кстати, то же самое в разновидности ArrangableDataModel, , вот пример демонстрации RichFaces .

2 голосов
/ 13 сентября 2011

В производственном приложении мы использовали ленивую модель данных для обработки 700000 записей в дБ. Я бы предложил использовать M3, в котором исправлены ленивые случаи с данными.

1 голос
/ 12 сентября 2011

Я обнаружил, что встроенная функция разбивки на страницы таблицы данных Primefaces является одной из лучших функций и провела на ней большое количество нагрузочного тестирования, принеся наборы записей с более чем 30 000 объектов Hibernate и посчитав, что производительность невелика. Это, конечно, означает, что у вас будет 30 000 сущностей в сеансе, поэтому в моем web.xml есть следующее, чтобы помочь сохранить сеанс на стороне сервера.

<context-param>
  <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>server</param-value>
</context-param>

Это уменьшит размер ViewState, что позволит значительно уменьшить размер запроса / ответа, однако при этом может сильно пострадать память на стороне сервера.

Еще одна потенциальная возможность в некоторых реализациях JSF, чтобы помочь уменьшить размер ViewStat или использование памяти сеанса, - это сжатие. Следующая ссылка описывает ряд параметров конфигурации SUN RI и MyFaces JSF, которые можно установить, некоторые из которых предоставляют возможность сжатия состояния сеанса. http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frweb_jsfengine.html

Что касается более подробной информации о том, как работает функция разбивки на страницы Primefaces DataTable, почему бы не перейти прямо к источнику? Primefaces - это, в конце концов, проект с открытым исходным кодом, так что просто посмотрите на код и посмотрите, что вы можете узнать: http://code.google.com/p/primefaces/source/browse/#svn%2Fprimefaces

0 голосов
/ 13 сентября 2011

Важное замечание в зависимости от того, какую версию Primefaces вы используете.Начиная с версии 3.0.M2 (я думаю), если вы хотите использовать функцию выбора строк, вы должны реализовать SelectableDataModel .Это ломает много унаследованного кода, и об этом было много сучек.

Самое простое, что можно сделать, это создать внутренний класс, подобный этому:

private MyDataModel dataModel = null;

public MyDataModel getDataModel() {
   if (dataModel != null) return dataModel;
   dataModel = new MyDataModel(some list);
   return dataModel;
}

public static class MyDataModel extends ListDataModel<SomeRecord>
        implements SelectableDataModel<SomeRecord> {

    MyDataModel(List<SomeRecord> source) {
        super(source);
    }
 etc.

Тогда значение атрибут p: dataTable становится # {bean.dataModel} .

Удачи.

...