Mssmar: Paging (Seiten umblättern)

Hallo zusammen,

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.
Für jede Hilfe bin ich sehr Dankbar.

Gruß
Messmar

Code:

  
<pg:pager id="p" maxPageItems="4" maxIndexPages="3" export="number,offset" scope="request">  
  <sql:query var="query1" dataSource="${MyTestDrive}" sql="SELECT dddddd  
   FROM xxxx, xxxx  
   WHERE yyyyyyy etc...  
   ORDER BY zzzzz etc.  
   LIMIT 4, 4" />  
  
  <table cellpadding="0" cellspacing="0" border="1">  
  <c:forEach var="linha" items="${query1.rows}">  
      <pg:item>  
       Anzeigen der Daten....  
      </pg:item>  
  </c:forEach>  
   </table>  
  
   <pg:index>  
    <pg:first><a href='<c:out value="${pageUrl}" />'>[Primeira]</a></pg:first>  
    <pg:prev><a href='<c:out value="${pageUrl}" />'>[Anterior]</a></pg:prev> <pg:pages><a href='<c:out value="${pageNumber}" />'></a></pg:pages>  
    <pg:pages><a href='<c:out value="${pageUrl}" />'><c:out value="${pageNumber}"/></a></pg:pages>  
    <pg:next><a href='<c:out value="${pageUrl}" />'>[Proxima(<c:out value="${pageNumber}"/>)]</a></pg:next>  
    <pg:last><a href='<c:out value="${pageUrl}" />'>[Ultima]</a></pg:last> <a href="javascript:window.close();"><strong>Fechar</strong></a>  
   </pg:index>  
  </pg:pager>  

  1. Hello,

    Das Ganze funktioniert aber leider nicht und ich kann den Fehler nicht lokalisieren.

    konntest du denn die Fehlerbeschreibung zwischenzeitlich finden?

    Für jede Hilfe bin ich sehr Dankbar.

    ja gerne, ist aber im Moment etwas dürftig...

    <sql:query var="query1" dataSource="${MyTestDrive}" sql="SELECT dddddd
       FROM xxxx, xxxx
       WHERE yyyyyyy etc...
       ORDER BY zzzzz etc.
       LIMIT 4, 4" />

    steht das da echt? LIMIT 4,4 ist ein ziemlich fester Auswahlbereich...

      
    MfG  
    Rouven  
    
    -- 
    \-------------------  
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& ([SelfCode](http://selfspezial.atomic-eggs.com/scode/selfcode.php?encodieren))  
      
    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
    
    1. Hallo,

      danke schon Mal für die Antwort.

      konntest du denn die Fehlerbeschreibung zwischenzeitlich finden?

      Ich bekomme leider keine Fehlermeldung...scheint keinen Syntax Fehler zu sein.
      ich könnte höchstens in dem Logfile suchen.

      steht das da echt? LIMIT 4,4 ist ein ziemlich fester Auswahlbereich...

      LIMIT 4,4 ist halt für:

      Es werden auf einer Seite immer nur 4 Datensätze angezeigt und Offset wäre dann auch 4 (+ 4).

      Danke und Gruß
      Messmar

      1. Hallo!

        LIMIT 4,4 ist halt für:

        Es werden auf einer Seite immer nur 4 Datensätze angezeigt und Offset wäre dann auch 4 (+ 4).

        LIMIT 4*$AktuelleSeite, 4

        Wobei Seite 1 einem Variablenwert von 0 entspricht.

        --
        LG,
        Snafu
        1. danke.

          LIMIT 4*$AktuelleSeite, 4

          dann musste in der Variable ${AktuelleSeite} einen dynamischen Wert gespeichert werden oder irre ich mich?

          Wobei Seite 1 einem Variablenwert von 0 entsprcht.

          sollte es folgendermaßen sein:

          <c:set var="AktuelleSeite" value=" es muss hier was dynamisch rein oder? " />

          Gruß
          Messmar

          1. Hallo!

            LIMIT 4*$AktuelleSeite, 4
            dann musste in der Variable ${AktuelleSeite} einen dynamischen Wert gespeichert werden oder irre ich mich?

            Der Wert ist der "Seitenindex". Sagen wir mal du hast 13 Einträge. Du brauchst daher ceil(13/5) = 4 Seiten.
            Limit 0,4 holt dir die ersten 4 Einträge (0,1,2,3).
            Limit 4,4 holt dir die nächsten 4 (4,5,6,7).
            ...
            Limit 12,4 holt dir die letzten beiden (12,13).

            In ${AktuelleSeite} muss also entweder die Aktuelle Seitennummer im Bezug auf die Blätterfunktion stehen und im Script verwendest du ${AktuelleSeite}-1 oder du nummerierst deine Seiten gleich "informatisch" und fängst bei 0 zu zählen an.

            sollte es folgendermaßen sein:

            <c:set var="AktuelleSeite" value=" es muss hier was dynamisch rein oder? " />

            Kenn mich leider mit JSP nicht aus.

            --
            LG,
            Snafu
            1. Hallo!

              Der Wert ist der "Seitenindex". Sagen wir mal du hast 13 Einträge. Du brauchst daher ceil(13/5) = 4 Seiten.
              Limit 0,4 holt dir die ersten 4 Einträge (0,1,2,3).

              [...]

              ok, verstanden

              In ${AktuelleSeite} muss also entweder die Aktuelle Seitennummer im Bezug auf die Blätterfunktion stehen und im Script verwendest du ${AktuelleSeite}-1 oder du nummerierst deine Seiten gleich "informatisch" und fängst bei 0 zu zählen an.

              Das ist aber die eine und selbe Seite...die wird bei jeder Query dann mit neuem Inhalt neu geladen.

              Also der Link sollte irgendwie so sein:
              http://localhost:8080/test.jsp&maxPageItems=10&maxIndexPages=10&pager.offset=10

              Gruß
              Messmar

              1. Hallo!

                Das ist aber die eine und selbe Seite...die wird bei jeder Query dann mit neuem Inhalt neu geladen.

                Ja, schon. Die jeweilige *fiktive* Seite von der Blätterfunktion.

                Also der Link sollte irgendwie so sein:
                http://localhost:8080/test.jsp&maxPageItems=10&maxIndexPages=10&pager.offset=10

                Und kann man mit JSP nicht einfach eine weitere Variable in der URI übergeben die für die fiktive Seite von der Blätterfunktion steht.
                Also so etwa

                  
                http://localhost:8080/test.jsp&maxPageItems=10&maxIndexPages=10&pager.offset=10&page=0  
                ________________________________________________________________________________^^^^^^  
                
                

                --
                LG,
                Snafu

                1. Hallo,

                  http://localhost:8080/test.jsp&maxPageItems=10&maxIndexPages=10&pager.offset=10

                  Und kann man mit JSP nicht einfach eine weitere Variable in der URI übergeben die für die fiktive Seite von der Blätterfunktion steht.
                  Also so etwa

                  Diese Sache mit dem Parameter, habe ich auch gelöst indem ich die url="" entfernt habe und die anderen notwendigen Parameter in dem pg:pager Bereich
                  eingefügt.

                  etwa so:
                  <pg:param name="carKategorie" value="${param.carKategorie}" />
                  <pg:param name="preisKategorie" value="param.preisKategorie" />
                  <pg:param name="email" value="${param.email}" />
                  <pg:param name="privacy" value="${param.privacy}" />
                  ....

                  Das Script funktioniert jetzt prima... ich bräuchte nur die Lösung dafür, wie ich den Parameter: maxPageItems dynamisch vorbelegen kann. Der muss die Anzahl der gesamten vorhandenen Datensätze nach einer Query enthalten und davon 1 substrahiert.

                  Danke und Gruß
                  Messmar

      2. Hi,

        konntest du denn die Fehlerbeschreibung zwischenzeitlich finden?
        Ich bekomme leider keine Fehlermeldung...

        Du verstehst den Wink mit dem Zaunpfahl wieder mal nicht, hm?

        scheint keinen Syntax Fehler zu sein.

        Wer deine Postings aus der Vergangenheit kennt weiss, dass bei dir die Logikfehler auch immer einen betraechtlichen Teil des Problems ausmachen.

        MfG ChrisB

    2. Hallo,

      die SQL Query funktioniert ohner weiteres... Es werden auch zunächst nur 4  Datensätze angezeigt. Das Problem legt genau bei pg:index....</pg:index>

      von dem folgenden Code schnipsel wird auf die Seite nichts ausgegeben, also ich bekomme keine Navigation bzw. Link zu sehen.

      Gruß
      Messmar

      Das Teil hier:

        
      <pg:index>  
          <pg:first><a href='<c:out value="${pageUrl}" />'>[Primeira]</a></pg:first>  
          <pg:prev><a href='<c:out value="${pageUrl}" />'>[Anterior]</a></pg:prev> <pg:pages><a href='<c:out value="${pageNumber}" />'></a></pg:pages>  
          <pg:pages><a href='<c:out value="${pageUrl}" />'><c:out value="${pageNumber}"/></a></pg:pages>  
          <pg:next><a href='<c:out value="${pageUrl}" />'>[Proxima(<c:out value="${pageNumber}"/>)]</a></pg:next>  
          <pg:last><a href='<c:out value="${pageUrl}" />'>[Ultima]</a></pg:last> <a href="javascript:window.close();"><strong>Fechar</strong></a>  
         </pg:index>  
      
      
  2. Hallo,

      
    
    > <pg:pager id="p" maxPageItems="4" maxIndexPages="3" export="number,offset" scope="request">  
    
    

    Welche Paging-Taglib verwendest du hier? Ich habe über Google zwei verschiedene
    Taglibs mit leicht unterschiedlicher Syntax gefunden.

    Bitte schreib nächstes mal dazu, welche Taglibs du verwendest, denn das ist
    nicht selbstverständlich.

    <table cellpadding="0" cellspacing="0" border="1">
      <c:forEach var="linha" items="${query1.rows}">
          pg:item
           Anzeigen der Daten....
          </pg:item>
      </c:forEach>
       </table>

    Was passiert, wenn du hier mal festkodiert ein paar Items zum Paging hinzufügst?
    Werden sie dann im pg:index-Bereich angezeigt? Kannst du im forEach mal ein
    paar Testausgaben machen, um zu sehen, dass überhaupt richtig iteriert wird?

    pg:index
        pg:first<a href='<c:out value="${pageUrl}" />'>[Primeira]</a></pg:first>
        pg:prev<a href='<c:out value="${pageUrl}" />'>[Anterior]</a></pg:prev> pg:pages<a href='<c:out value="${pageNumber}" />'></a></pg:pages>
        pg:pages<a href='<c:out value="${pageUrl}" />'><c:out value="${pageNumber}"/></a></pg:pages>
        pg:next<a href='<c:out value="${pageUrl}" />'>[Proxima(<c:out value="${pageNumber}"/>)]</a></pg:next>
        pg:last<a href='<c:out value="${pageUrl}" />'>[Ultima]</a></pg:last> <a href="javascript:window.close();"><strong>Fechar</strong></a>
       </pg:index>
      </pg:pager>

    Taucht das hier auch nicht im Quelltext des zurückgelieferten HTML-Dokuments
    auf? Hast du mal in den HTML-Sourcecode geschaut?

    Gruß
    Slyh

    1. Hallo,

      Welche Paging-Taglib verwendest du hier? Ich habe über Google zwei verschiedene
      Taglibs mit leicht unterschiedlicher Syntax gefunden.

      die hier:
      pager-taglib.tld in dem Verzeichnis: /WEb-INF/tld
      und dazu die zwei JAR-Dateien in dem Verzeichnis: /WEB-INF/lib

      Import in der JSP Datei:
      <%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg" %>

      Tomcat: 6.x
      Alles läuft sauber ;-)

      [...]

      Was passiert, wenn du hier mal festkodiert ein paar Items zum Paging hinzufügst?

      habe ich schon:

      <c:forEach var="linha" items="${query.rows}">
          pg:item
       <tr>
             <td ><c:out value="${linha.brandname}"/>: </td>
             <td ><c:out value="${linha.priceto}"/></td>
             <td ><c:out value="${linha.pricefrom}"/></td>
       </tr>
          </pg:item>
      </c:forEach>

      Werden sie dann im pg:index-Bereich angezeigt?

      im pg:index-Bereich wird leider nichts angezeigt.
      Kannst du im forEach mal ein

      paar Testausgaben machen, um zu sehen, dass überhaupt richtig iteriert wird?

      pg:index
          pg:first<a href='<c:out value="${pageUrl}" />'>[Primeira]</a></pg:first>

      [...]

      Taucht das hier auch nicht im Quelltext des zurückgelieferten HTML-Dokuments
      auf? Hast du mal in den HTML-Sourcecode geschaut?

      Gute Frage ;-) der dazugehörige HTML CODE (<a href=""></a>) wird leider nicht angezeigt...als würden die pg:first und pg:prev Bereiche etc. gar nicht interpretiert.

      Gruß
      Messmar

      1. Hallo,

        Was passiert, wenn du hier mal festkodiert ein paar Items zum Paging hinzufügst?

        habe ich schon:

        <c:forEach var="linha" items="${query.rows}">
            pg:item
        <tr>
               <td ><c:out value="${linha.brandname}"/>: </td>
               <td ><c:out value="${linha.priceto}"/></td>
               <td ><c:out value="${linha.pricefrom}"/></td>
        </tr>
            </pg:item>
        </c:forEach>

        Ich meinte jetzt eigentlich außerhalb der forEach-Schleife. Angenommen die
        Schleife würde nicht ausgeführt werden, dann würde auch nie ein pg:item
        aufgerufen werden.

        Werden sie dann im pg:index-Bereich angezeigt?
        im pg:index-Bereich wird leider nichts angezeigt.

        S.o.

        paar Testausgaben machen, um zu sehen, dass überhaupt richtig iteriert wird?

        Hier meinte ich, dass du mal ins forEach eine einfache Ausgabe (anstelle der
        pg:item-Tags) einfügen könntest, um zu sehen, ob die Schleife überhaupt
        iteriert.

        Ansonsten sehe ich gerade keinen offensichtlichen Fehler. Allerdings habe ich
        dieses Paging auch noch nie verwendet. Ich würde versuchen, weniger Ausgaben
        in den pg:index-Bereich einzufügen und schauen ob es dann geht. Und wenn
        nicht, dann die Datenbankabfrage entfernen und durch festkodierte pg:item
        ersetzen usw.

        Kurz: Probier mal ein minimales Beispiel zu erstellen, das ohne Datenbankabfrage
        und ohne komplexe Ausgabe im pg:index-Bereich auskommt. (Vielleicht indem du
        auch irgendwo aus dem Netz ein Beispiel lädst.) Und das erweiterst du dann nach
        um nach mit deinem Code und probierst nach jedem Schritt, ob noch alles funktioniert.

        Gruß
        Slyh

        1. Hallo,

          Ich meinte jetzt eigentlich außerhalb der forEach-Schleife. Angenommen die
          Schleife würde nicht ausgeführt werden, dann würde auch nie ein pg:item
          aufgerufen werden.

          habe ich schon und alles ist I.O.

          Das komische Dabei ist, wenn den folgenden Link hier außerhalb von pg:items einbinde, dann wird es dargestellt und mit der URL, allerdings ohne weitere Parameter für die Navigation. ich meine maxPageItems=... etc.

            
          <a href='<c:out value="${pageUrl}" />'>[Primeira]</a>  
          
          

          Danke und Gruß
          Messmar

        2. Hallo,

          um nach mit deinem Code und probierst nach jedem Schritt, ob noch alles funktioniert.

          OK, jetzt funktioniert zum Teil...wenigsten die Navigation wird angezeigt, aber es fehlt mir den Trick, wie ich den richtigen Parameter in der URL anhänge.

          Es legt und lag daran, dass ich in der Sql Query den LIMIT und OFFSET nicht richtig eingegeben habe.

          jetzt habe ich dort: LIMIT 0, 12

          Also zum testen, aber ich kann zu den nächsten Datensätze nicht kommen.
          Ich habe jetzt bestimmt was falsch bei LIMIT und OFFSET.

          Vielen Dank und Gruß
          Messmar

        3. Hallo,

          Danke vielmals für deine Hilfe/Tipps...Jetzt funktioniert es komplett.

          Gruß
          Messmar