Эффективная разбивка на 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}.
Удачи.