Проблема с отображением тега - PullRequest
6 голосов
/ 08 октября 2010

В отображаемом теге я использовал функцию разбиения на страницы, когда я хочу увидеть список из 15 строк, но отображать тег, чтобы выбрать все строки из базы данных.каждый раз, когда я нажимаю на номер нумерации страниц, он выводит все строки из db.bcoz, что замедляет работу приложения.

Я хочу, чтобы в теге display, когда я хочу увидеть 15 строк, тег display также извлекал 15 строк из базы данных db, а не из всех строк базы данных.Пожалуйста, помогите мне, если кто-то знает.

Ответы [ 3 ]

10 голосов
/ 10 октября 2010

Вы должны использовать функцию внешнего разбиения на страницы.Сначала укажите в HTML-теге, что вы используете внешнюю нумерацию страниц.И создать объект реализует org.displaytag.pagination.PaginatedList .Наконец, вы должны реализовать DAO, который на самом деле делает запрос только для 15 строк и возвращает PaginatedList.

1) Ваш jsp будет выглядеть следующим образом

<display:table name="command" sort="external" partialList="true" size="${command.fullListSize}" pagesize="${command.objectsPerPage}">
  <display:column property="name" title="name"/>
  ...
</display:table>

Обратите внимание, что он определил сортировкуexternal.

2) Реализация org.displaytag.pagination.PaginatedList.

public class PaginatedListImpl<T> implements PaginatedList{
  private int fullListSize;
  private int objectsPerPage;
  private int pageNumber;
  private String searchId;
  private String sortCriterion;
  private SortOrderEnum sortDirection;
  private List<T> list;

//getters and setters
...
}

3) Пример реализации DAO с использованием hibernate.Вы можете сделать это с помощью JDBC или чего угодно, но убедитесь, что вы делаете правильный запрос, чтобы получить 15 строк в правильном порядке и вернуть объект PaginatedListImpl.

@SuppressWarnings("unchecked")
public PaginatedListImpl<T> getPaginatedList(PaginatedListImpl paginatedList) {
  int pageNum = paginatedList.getPageNumber();

  final int objectsPerPage = paginatedList.getObjectsPerPage();
  final int firstResult = objectsPerPage * pageNum;
  String sortOrderCriterion = pagiantedList.getSortOrderCriterion();
  String sortOrder = paginatedList.getSortOrder

  String className = type.getName().substring(type.getName().lastIndexOf(".") + 1);
  final StringBuilder fromClause = new StringBuilder("from " + className + " " + alias);
  String orderByClause = new StringBuilder(" order by ").append(sortCriterion).append(" ").append(sortDirection);

  final String hql = new StringBuilder().append(fromClause).append(orderClause).toString();
  List<T> resultList = getHibernateTemplate().executeFind(new HibernateCallback() {
  public Object doInHibernate(Session session) throws HibernateException, SQLException {
    return session.createQuery(hql)
      .setFirstResult(firstResult)
      .setMaxResults(objectsPerPage)
      .list();
    }
  });
  Long count = (Long)getHibernateTemplate().execute(new HibernateCallback() {           
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
      return session.createQuery("select count(*) " +  fromClause).uniqueResult();
    }
  });
  paginatedList.setFullListSize(count.intValue());
  paginatedList.setList(resultList);
  paginatedList.setPageNumber(pageNum+1);
  paginatedList.setObjectsPerPage(objectsPerPage);
  return paginatedList;
}
2 голосов
/ 31 марта 2011

Displaytag отправляет данные для разбивки на страницы и сортировки, используя параметры, начинающиеся с «d-». Таким быстрым решением может быть проверка, содержит ли запрос что-то, начинающееся с "d -", если да, то не выполняйте ваш запрос снова.

0 голосов
/ 19 сентября 2012

По какой-то причине использование PaginatedList не работает. Я попытался с последней версией, и кажется, что есть какая-то ошибка, и она выдает ошибку attribute size must be specified, даже если я жестко кодирую значение размера. Я просмотрел другие ссылки / блоги, и многие люди указали на это.

Опция, которую я в конечном итоге использовал, заключается в сохранении данных в сеансе. Когда пользователь нажимает кнопку «Далее», он проверяет данные в сеансе. Если он присутствует, он не затронет уровень служб. Пока все работает нормально.

...