Jsf2 Paging / Pager for Repeater

Czy znasz to uczucie, gdy każdy kod, który piszesz działa od razu i podszywasz się pod swój harmonogram : - P to jest jak "oh yeah now I have time to make it perfect". Tam właśnie Jestem^^

Więc zaimplementowałem repeater z JSF (UI: repeat) i pomyślałem o pagingu dla wszystkich podmiotów. Jest na to jakiś łatwy sposób? Jakie są kwestie, o których muszę myśleć?

Byłoby miło, gdyby ktoś mi pomógł. Moje googleskills nie pomogły mi do tej pory :- P

Zdrówko...

Author: BalusC, 2010-08-19

2 answers

Oto prosty przykład, który powinien dać ci pomysł, jak to wdrożyć.

RepeatPaginator:

public class RepeatPaginator {

    private static final int DEFAULT_RECORDS_NUMBER = 2;
    private static final int DEFAULT_PAGE_INDEX = 1;

    private int records;
    private int recordsTotal;
    private int pageIndex;
    private int pages;
    private List<?> origModel;
    private List<?> model;

    public RepeatPaginator(List<?> model) {
        this.origModel = model;
        this.records = DEFAULT_RECORDS_NUMBER;
        this.pageIndex = DEFAULT_PAGE_INDEX;        
        this.recordsTotal = model.size();

        if (records > 0) {
            pages = records <= 0 ? 1 : recordsTotal / records;

            if (recordsTotal % records > 0) {
                pages++;
            }

            if (pages == 0) {
                pages = 1;
            }
        } else {
            records = 1;
            pages = 1;
        }

        updateModel();
    }

    public void updateModel() {
        int fromIndex = getFirst();
        int toIndex = getFirst() + records;

        if(toIndex > this.recordsTotal) {
            toIndex = this.recordsTotal;
        }

        this.model = origModel.subList(fromIndex, toIndex);
    }

    public void next() {
        if(this.pageIndex < pages) {
            this.pageIndex++;
        }

        updateModel();
    }

    public void prev() {
        if(this.pageIndex > 1) {
            this.pageIndex--;
        }

        updateModel();
    }   

    public int getRecords() {
        return records;
    }

    public int getRecordsTotal() {
        return recordsTotal;
    }

    public int getPageIndex() {
        return pageIndex;
    }

    public int getPages() {
        return pages;
    }

    public int getFirst() {
        return (pageIndex * records) - records;
    }

    public List<?> getModel() {
        return model;
    }

    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }

}

Bean:

public class TestBean {

    private List<String> list;
    private RepeatPaginator paginator;

    @PostConstruct
    public void init() {
        this.list = new ArrayList<String>();
        this.list.add("Item 1");
        this.list.add("Item 2");
        this.list.add("Item 3");
        this.list.add("Item 4");
        this.list.add("Item 5");
        this.list.add("Item 6");
        this.list.add("Item 7");
        this.list.add("Item 8");
        this.list.add("Item 9");
        this.list.add("Item 10");
        this.list.add("Item 11");
        paginator = new RepeatPaginator(this.list);
    }

    public RepeatPaginator getPaginator() {
        return paginator;
    }

}

XHTML:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    template="/WEB-INF/template/default.xhtml">

<ui:define name="content">
    <h:form>
        <ui:repeat value="#{testBean.paginator.model}" var="listItem">
            <div>
                <h:outputText value="#{listItem}"/>
            </div>
        </ui:repeat>
        <h:commandButton value="&lt; prev" action="#{testBean.paginator.prev}"/>
        <h:outputText value="#{testBean.paginator.pageIndex} / #{testBean.paginator.pages}"/>
        <h:commandButton value="next &gt;" action="#{testBean.paginator.next}"/>
        <h:inputHidden value="#{testBean.paginator.pageIndex}"/>
    </h:form>
</ui:define>
</ui:composition>
 21
Author: Maxim Manco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-19 09:18:20

Paginacja jest w rzeczywistości łatwa. Po prostu musisz ciągle przekazywać jeden lub dwa parametry: firstrow i opcjonalnie rowcount (które mogą być również przechowywane po stronie serwera). Gdy użytkownik kliknie Next , po prostu zwiększasz wartość {[0] } o wartość rowcount. Gdy użytkownik kliknie Wstecz, po prostu zmniejszasz wartość firstrow o wartość rowcount. Wystarczy tylko sprawdzić, czy nie przekracza granic 0 i totalrows i odpowiednio zmienić.

Wtedy, na podstawie żądanych firstrow i rowcount wiesz dokładnie, które dane wyświetlać. Jeśli wszystkie dane znajdują się już w jakiejś List w pamięci Javy, to wystarczy użyć List#subList() aby uzyskać z niego sublist do wyświetlenia. Nie jest jednak wydajne powielanie całej tabeli bazy danych do pamięci Java. Może to nie zaszkodzić, gdy jest to tylko 100 wierszy, ale gdy jest to znacznie więcej i / lub powielasz go dla każdego pojedynczego użytkownika, aplikacja wkrótce skończy się pamięć.

W takim przypadku wolisz paginować na poziomie DB. Na przykład w MySQL możesz użyć klauzuli LIMIT, aby uzyskać podzbiór wyników z DB. JPA / Hibernate udostępnia nawet sposoby używając setFirstResult() i setMaxResults() metod odpowiednio Query i Criteria. Przykłady można znaleźć w this and this answer.

W tym artykule znajdziesz podstawowy przykład paginacji (i sortowania) w JSF 1.2. Wykorzystuje komponenty Tomahawk, ale w JSF 2.0 można je po prostu zostawić, wykonując bean @ViewScoped (zastępuje t:saveState) i używając ui:repeat (zastępuje t:dataList).

Wreszcie, istnieje wiele bibliotek komponentów, które wykonują wszystkie prace w jednym komponencie. Na przykład RichFaces <rich:datascroller> i PrimeFaces <p:dataTable paginator="true"> (można również wykonać ajaxical ).

 9
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:03