JSF с возможностью разбивки на страницы с разбивкой по страницам, сортировкой и возвратом в браузер - PullRequest
2 голосов
/ 17 марта 2012

Мы используем компонент данных Primefaces с сортировкой, разбивкой на страницы и LazyDataModel для отображения результатов поиска. Основным компонентом страницы поиска является ViewScoped.

Из списка результатов поиска пользователь может выбрать элемент результата для просмотра подробностей. Это реализовано как запрос новой страницы, например, <h:link value="Show Details" outcome="showDetails?id=11234"/>. Нажав кнопку браузера назад, пользователь вернется к списку результатов поиска.

Проблема в том, что таблица данных снова будет в исходном состоянии, поэтому она не будет отображать последний выбранный порядок сортировки и страницу. Это имеет место в большинстве браузеров, только Firefox 11 хранит эти изменения DOM в кэше. Ни IE, ни Chrome.

У кого-нибудь есть хороший подход, как справиться с этим? Нам на самом деле не нужна «ajaxified» сортировка и разбиение по страницам. Мы бы предпочли обрабатывать все через ViewParams, но, похоже, это не поддерживается простыми лицами.

1 Ответ

1 голос
/ 18 марта 2012

Я тоже столкнулся с этим и разработал шаблон кодирования, который может помочь. Это на самом деле не вещь из PrimeFaces (которую я тоже использую) - это скорее техника для использования закладок с JSF 2.

В разметке я включаю все параметры для страницы следующим образом:

        <f:metadata>
            <f:viewParam name="orderID" value="#{bean.orderID}" />
            <f:viewParam name="sortMode" value="#{bean.sortMode}" />
            <f:viewParam name="firstRecord" value="#{bean.firstRecord}" />
            <f:viewParam name="pageSize" value="#{bean.pageSize}" />
        </f:metadata>

Каждое из этих значений поддерживается в компоненте поддержки, поэтому, если они не установлены, они выдают подходящее значение по умолчанию. Например:

public int getPageSize() {
    if (pageSize < MIN_PAGE_SIZE) pageSize = DEF_PAGE_SIZE;
    if (pageSize > MAX_PAGE_SIZE) pageSize = DEF_PAGE_SIZE;
    return pageSize;
}

Ссылка на это представление может быть сгенерирована следующим образом:

Теперь вы реализуете пользовательские элементы управления для изменения этих значений и регенерируете таблицу при каждом их изменении. Вы все равно должны использовать AJAX для этого - например:

<p:spinner value=#{bean.pageSize} >
    <p:ajax update="tableID" />
</p:spinner>

В методах установки вы должны инициировать повторное создание таблицы, но в этом суть. Надеюсь, это поможет.

UPDATE:

Чтобы справиться с нумерацией страниц, вам просто нужно добавить ссылки для первой страницы, предыдущей страницы, следующей страницы и т. Д. Ссылки будут выглядеть примерно так:

 <h:link  value="First Page" outcome="thisPage">
         <f:param name="orderID" value="#{bean.orderID}" />
         <f:param name="sortMode" value="#{bean.sortMode}" />
         <f:param name="firstRecord" value="0" />
         <f:param name="pageSize" value="#{bean.pageSize}" />
 </h:link>
 <h:link  value="Next Page" outcome="thisPage">
         <f:param name="orderID" value="#{bean.orderID}" />
         <f:param name="sortMode" value="#{bean.sortMode}" />
         <f:param name="firstRecord" value="#{bean.nextRecord}" />
         <f:param name="pageSize" value="#{bean.pageSize}" />
 </h:link>

и т.д.. Вам необходимо реализовать свойства в компоненте поддержки, чтобы вычислить, каким должен быть параметр firstRecord .

...