Внешняя пейджинг/сортировка displaytag и получение истинного номера строки
-
12-09-2019 - |
Вопрос
Я использую внешнюю разбивку по страницам/сортировку с помощью специального TableDecorator и следующей таблицы DisplayTag в JSP:
<display:table id="ixnlist" name="pageScope.itemList" sort="external"
decorator="org.mdibl.ctd.pwa.displaytag.decorator.IxnTableWrapper">
<display:column title="Row" property="rowNum" />
...more columns...
</display:table>
В декораторе таблицы getListIndex() возвращает номер строки только относительно текущей страницы, а не всего списка (т. е., если мы отображаем 100 объектов на странице, то getListIndex() возвращает «0» вверху страницы). 2, а не «100»).
/**
* Returns the row number data for the current row.
*
* @return String containing row number heading.
*/
public String getRowNum() {
final StringBuilder out = new StringBuilder(8);
out.append(nf.format(getListIndex() + 1))
.append('.');
return out.toString();
}
Можно ли в декораторе таблицы каким-то образом получить номер строки, отражающий правильное смещение?Дисплейтег является знает о смещении где-то, поскольку использует его для форматирования ссылок на страницы.
Документация displaytag не отвечает на этот вопрос, а неявный объект ${row_rowNum} работает идентично getListIndex() в декораторе.
Да, это можно сделать, добавив столбец с номером строки в разбитый на страницы SQL и заставив TableDecorator использовать его, если он доступен, но я бы предпочел не полагаться на DAO для такого рода метаданных.Следующий метод TableDecorator использует столбец rownum, если он существует, в противном случае он использует getListIndex():
/**
* Returns the row number data for the current row.
*
* @return String containing row number heading.
*/
public String getRowNum() {
final StringBuilder out = new StringBuilder(8);
final Map row = (Map) getCurrentRowObject();
// Use 'rnum' column for external pagination if it exists.
// Kludgy way of doing this.
if (row.get("rnum") != null) {
out.append(nf.format(row.get("rnum")));
} else {
out.append(nf.format(getListIndex() + 1));
}
out.append('.');
return out.toString();
}
Спасибо.
/мкр
Решение
Вы сможете рассчитать правильное общее значение индекса, обратившись к номеру страницы, указанному в запросе.
Закодируйте что-то вроде этого TableDecorator
класс должен работать:
public String getIndex() {
int numItemsPerPage = 100;
int page = Integer.parseInt(getPageContext().getRequest().getParameter("page"));
int index = getListIndex();
return ((page - 1) * numItemsPerPage) + index + 1;
}