2010-10-08 3 views
6

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

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

ответ

10

Вы должны использовать функцию внешней разбивки на страницы. Сначала укажите в теге 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> 

Обратите внимание, что указанный вид является внешним.

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 с использованием спящего режима. Вы можете сделать это с помощью 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

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

+0

где проверить это? – Sayan

0

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

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

+0

Похоже, что вы оригинальный плакат, возможно, вы зарегистрированы сейчас. Если да, не могли бы вы уточнить. Если нет, пожалуйста, отредактируйте, чтобы сказать: «Кажется, не работает», а не «не работает». – AndrewC

+0

Возможно, ваш список результатов равен NULL. – Alex

Смежные вопросы