Taglib: Paging (Seiten umblättern)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Taglib: Paging (Seiten umblättern)

    ich versuche das Ergebnis einer Datenbank-Abfrage auf eine Seite anzuzeigen und zwar mit paging Funktionalität und MySql LIMIT/OFFSET. D.h. es dürfen pro Seite nur 4 Datensätze, sage ich Mal, dargestellt werden, aber mit Textlinks für die nächsten Seiten bzw. Datensätze bis zu letzten 4 Datensätze.

    Das Ganze funktioniert aber leider nicht und ich kann den Fehler nicht lokalisieren.
    Das einzige, was ich noch dazu sagen kann, ist dass der letzte Teil des Code

    Quellcode

    1. <pg:index>.....</pg:index>
    nicht ausgegeben wird, also keine Links bzw keine Umblättern-Möglichkeit.
    Für jede Hilfe bin ich sehr Dankbar.

    Gruß
    Messmar

    Quellcode

    1. <pg:pager id="p" maxPageItems="4" maxIndexPages="3" export="number,offset" scope="request">
    2. <sql:query var="query1" dataSource="${MyTestDrive}" sql="SELECT dddddd
    3. FROM xxxx, xxxx
    4. WHERE yyyyyyy etc...
    5. ORDER BY zzzzz etc.
    6. LIMIT 4, 4" />
    7. <table cellpadding="0" cellspacing="0" border="1">
    8. <c:forEach var="linha" items="${query1.rows}">
    9. <pg:item>
    10. Anzeigen der Daten....
    11. </pg:item>
    12. </c:forEach>
    13. </table>
    14. <pg:index>
    15. <pg:first><a href='<c:out value="${pageUrl}" />'>[Primeira]</a></pg:first>
    16. <pg:prev><a href='<c:out value="${pageUrl}" />'>[Anterior]</a></pg:prev> <pg:pages><a href='<c:out value="${pageNumber}" />'></a></pg:pages>
    17. <pg:pages><a href='<c:out value="${pageUrl}" />'><c:out value="${pageNumber}"/></a></pg:pages>
    18. <pg:next><a href='<c:out value="${pageUrl}" />'>[Proxima(<c:out value="${pageNumber}"/>)]</a></pg:next>
    19. <pg:last><a href='<c:out value="${pageUrl}" />'>[Ultima]</a></pg:last> <a href="javascript:window.close();"><strong>Fechar</strong></a>
    20. </pg:index>
    21. </pg:pager>
    Alles anzeigen
  • Konkret funktioniert also alles, bis auf die Ausgabe der Blätterlinks?
    Hast du mal das maxIndexPages Attribut entfernt? Der Wert ist schon kleiner als die Anzahl der harten Links im Index.
    Bin mir nicht sicher, ob eben die Gesamtanzahl gemeint ist, oder nur die dynamischen <pg:pages>

    Ansonsten würd ich mal alles spektakuläre entfernen und das Beispiel aus der Doku probieren.
    Auch wenns nicht viel ist.
  • Hallo Leute,

    vielen Dank für eure Hilfe und Tipps... Es funktioniert jetzt.
    Ich hatte einen Denkfehler bei der MySql Query und zwar genau bei: LIMIT, OFFSET.

    Man muss eigentlich, soweit ich es jetzt herausgefunden habe, die genaue/richtige Zahl aller im Ergebnis vorhandenen Datensätze eingeben:
    <sql:query var="..." SELECT ..... LIMIT, HierDieGenaueZahlAllerVorhandenenDatensätzeEingeben />

    Für LIMIT, kommt dann die: "0" für die erste Seite.

    <sql:query var="..." SELECT.... 0, 30" />

    jetzt funktioniert und zwar sogar mit Parameter-Weitergabe:

    Quellcode

    1. <pg:pager id="p" url="" maxPageItems="4" maxIndexPages="10" export="number,offset" scope="request">
    2. <pg:param name="carKategorie" value="${param.carKategorie}" />
    3. <pg:param name="preisKategorie" value="${param.preisKategorie}" />
    4. <pg:param name="email" value="${param.email}" />
    5. <pg:param name="privacy" value="${param.privacy}" />
    6. .....
    7. .....


    Aber eine kleine Hürde muss ich noch überwinden und zwar: wie kann dynamisch die Anzahl der vorhandenen Datensätze nach einer Query übermitteln?
    die muss ich nämlich in einer Variable speichern und dann an der Query nach dem LIMIT eingeben.

    Vielen Dank und Gruß
  • Wenn die Sprache, die du verwendest Velocity ist, dann könntest du z.B. sowas probieren:
    LIMIT ${pageNumber} * 4, 4
    (Vielleicht auch (${pageNumber}-1)*4, je nachdem wie du es implementiert hast. )
    Das ist aber nur so eine Idee. Keine Garantie, dass das auch funktioniert.

    Vielleicht kann man dir da im XML-Forum besser weiterhelfen. Mit Java hatte deine Frage eh wenig bzw. garnichts zu tun. :)
  • Der pager, so wie du ihn im Moment verwendest will den gesamten Datensatz als Eingabe, stellt aber nur einen Bruchteil dar. Hier macht es also keinen Sinn mit LIMIT und OFFSET zu arbeiten.
    Was mehr Sinn macht ist das Attribut items
    pg:pager > items
    Specifies the number of items available in the data set. This is useful when the data set size is known and can be retrieved in page sized chunks. When this attribute is set, the index can be displayed before and after the items.

    Dann kannst du wieder mit LIMIT arbeiten. Aber wenn du deine SQL Abfrage mit LIMIT beschränkt hast, kannst du gleichzeitig nicht mehr das Maximum erfahren.

    Aber mal grundlegend... nur weil die JSTL ein sql Element mitbringt, würde ichs nicht verwenden ;) Datenbankcode im Template... bin ich total dagegen :P
    Musst du es verwenden? Oder gibts vielleicht doch ein Servlet, wo du die beiden Abfragen platzieren könntest?
    Dann könntest du dir auch die Gesamtzahl im ApplicationContext merken und wüsstest zudem wann du die Zahl aktualisieren musst.
  • Friday schrieb:

    irgendwie wie count oder sowas?
    Es gäbe noch obj.rowCount, aber das ist eigentlich nicht das was du willst. Der COUNT(*) in SQL geht deutlich schneller (besonders bei MyISAM, falls du MySQL verwendest).
    Ich denke so könntest du ihn an eine Variable binden. Bin mir aber auch nicht sicher, ob der Index-Zugriff erlaubt ist.

    Quellcode

    1. <c:set var="foo" value="${query1.rows[0].value}" />
  • Hmmm,

    es funktioniert tatsächlich und zwar folgendermaßen:

    Quellcode

    1. <pg:pager id="p" items="${query1.rows[0].value}" url="" maxPageItems="4" maxIndexPages="10" export="number,offset" scope="request">
    2. ......
    3. ......
    4. .....
    5. <pg:index>
    6. <pg:first><a href='<c:out value="${pageUrl}" />' style='margin-left:100px;'>[Erste]</a></pg:first>
    7. <pg:prev><a href='<c:out value="${pageUrl}" />'>[Vorherige]</a></pg:prev>
    8. <pg:pages><a href='<c:out value="${pageNumber}" />'></a></pg:pages>
    9. <pg:pages><a href='<c:out value="${pageUrl}" />'><c:out value="${pageNumber}"/></a>&nbsp;&nbsp;</pg:pages>
    10. <pg:next><a href='<c:out value="${pageUrl}" />'>[Nächste(<c:out value="${pageNumber}"/>)]</a></pg:next>
    11. <pg:last><a href='<c:out value="${pageUrl}" />'>[Letzte]</a></pg:last>
    12. </pg:index>
    13. </pg:pager>
    Alles anzeigen


    Hast du es auch so gemeint?

    Danke und Gruß
    Friday

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Friday ()

  • so ist ein Teil meiner SQL Abfrage aus:

    Brainfuck-Quellcode

    1. <sql:query var="query3" dataSource="${testRead}" sql="SELECT c.carname, c.pricefrom,
    2. FROM car c,
    3. ........
    4. WHERE t.name = '${choosen}'
    5. and ((c.pricefrom > '${firstEntry}' and c.pricefrom < '${secondEntry}')
    6. or .........
    7. and
    8. ORDER BY c.priceto" />



    also keine param innerhalb der sql:query Bereich.

    Vielen Dank noch für die unermüdliche Unterstütznug

    Gruß
    Friday
  • Mir ist heute eine neue Erkenntnis gekommen, wie man mit nur einem Select einen durch LIMIT und OFFSET gesliceten Bereich selektieren kann und dennoch die Maximalanzahl erhält, die man ohne LIMIT bekommen hätte.

    SQL_CALC_FOUND_ROWS

    Eine SELECT-Anweisung kann eine LIMIT-Klausel enthalten, die die Anzahl der Datensätze beschränkt, die der Server an den Client zurückgibt. In manchen Fällen kann es wünschenswert sein, zu wissen, wie viele Datensätze die Anweisung ohne LIMIT-Klausel zurückgegeben hätte, ohne dass man die Anweisung hierzu erneut ausführen müsste. Um diese Anzahl zu ermitteln, fügen Sie die Option SQL_CALC_FOUND_ROWS in die SELECT-Anweisung ein und rufen danach FOUND_ROWS() auf:

    Quellcode

    1. SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
    2. SELECT FOUND_ROWS();

    dev.mysql.com/doc/refman/5.1/de/information-functions.html