2010-10-08 10 views
6

W tagu wyświetlającym użyłem funkcji stronicowania, gdy chcę wyświetlić listę 15 wierszy, ale znacznik wyświetlania powoduje zmianę wszystkich wierszy z bazy danych. za każdym razem, gdy klikam numer stronicowania, powoduje to, że wszystkie wiersze z pliku db.bcoz spowalniają działanie aplikacji.Wyświetlany problem z paginacją tagów

Chcę, aby w tagu wyświetlania, gdy chcę zobaczyć 15 wierszy, a następnie wyświetlić tag również pobrać 15 wierszy z db nie całe wiersze db. Plz mi pomóż, jeśli ktoś wie.

Odpowiedz

10

Należy użyć funkcji paginacji zewnętrznej. Najpierw określ w tagu HTML, czy używasz stronicowania zewnętrznego. I stwórz obiekt implementujący org.displaytag.pagination.PaginatedList. Na koniec musisz zaimplementować DAO, które faktycznie tworzy zapytanie tylko dla 15 wierszy i zwraca PaginatedList.

1) Twój JSP będzie wyglądać następująco

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

pamiętać, że określony rodzaj jest zewnętrzny.

2) org.displaytag.pagination.PopinatedList implementation.

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) Próbka wdrożenia DAO za pomocą hibernacji. Możesz to zrobić za pomocą JDBC lub cokolwiek innego, ale upewnij się, że tworzysz właściwe zapytanie, aby uzyskać 15 wierszy we właściwej kolejności i zwróć obiekt 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 wysyła dane o paginacji i sortowaniu danych za pomocą parametrów zaczynających się od "d-". Takim szybkim rozwiązaniem może być sprawdzenie, czy żądanie zawiera coś zaczynającego się od "d -", jeśli tak, to nie wykonuj ponownie zapytania.

+0

gdzie to sprawdzić? – Sayan

0

Z jakiegoś powodu używanie modelu PaginatedList nie działa. Próbowałem z najnowszą wersją i wygląda na to, że jest jakiś błąd i daje on błąd attribute size must be specified, nawet jeśli mocno zakodowałem wartość rozmiaru. Przeszedłem przez inne linki/blogi i wiele osób wskazało na to.

Opcja, którą ostatecznie wykorzystałem, służy do przechowywania danych w sesji. Gdy użytkownik kliknie obok, sprawdza dane w sesji. Jeśli jest obecny, nie trafi w warstwę usług. Jak na razie wszystko działa dobrze.

+0

To brzmi jak oryginalny plakat - być może zarejestrowałeś się teraz. Jeśli tak, czy mógłbyś to wyjaśnić? Jeśli nie, edytuj, aby powiedzieć "nie wydaje się działać" zamiast "nie wydawało się działać". – AndrewC

+0

Może to oznaczać, że lista wyników ma wartość zerową. – Alex

Powiązane problemy