Эффективная разбивка на JSF

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

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

Я вижу, что мне нужно разместить мой bean в сеансе или больше.

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

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

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

Спасибо.

Ответ 1

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

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

Ответ 2

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

Ответ 3

Я обнаружил, что встроенная функция разбиения на страницы таблицы данных 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

Ответ 4

Важное примечание в зависимости от того, какую версию 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}.

Удачи.