2009-06-08 8 views
3

J'utilise la pagination externe/tri avec un TableDecorator personnalisé et la table displaytag suivante dans une page JSP:pagination externe displaytag/tri et obtenir vrai numéro de ligne

<display:table id="ixnlist" name="pageScope.itemList" sort="external" 
    decorator="org.mdibl.ctd.pwa.displaytag.decorator.IxnTableWrapper"> 

    <display:column title="Row" property="rowNum" /> 

    ...more columns... 
</display:table> 

Dans le décorateur de table, les retours getListIndex() le numéro de ligne par rapport à la page en cours, pas à la liste globale (par exemple, si nous affichons 100 objets par page, alors getListIndex() renvoie "0" en haut de la page 2, pas "100"). Est-il possible dans le décorateur de table d'obtenir en quelque sorte le numéro de ligne reflétant le décalage correct? Displaytag est conscient du décalage quelque part, car il l'utilise pour mettre en forme les liens de pagination. Les documents displaytag ne répondent pas à cette question et l'objet implicite $ {row_rowNum} fonctionne de la même manière que getListIndex() dans le décorateur.

Oui, il est possible de le faire en ajoutant une colonne de numéro de ligne au SQL paginé et en utilisant le TableDecorator si disponible, mais je préfère ne pas compter sur le DAO pour ce type de métadonnées. La méthode de TableDecorator suivante profite d'une colonne de rownum si elle existe, sinon il utilise getListIndex():

/** 
* Returns the row number data for the current row. 
* 
* @return String containing row number heading. 
*/ 
public String getRowNum() { 
    final StringBuilder out = new StringBuilder(8); 
    final Map row = (Map) getCurrentRowObject(); 

    // Use 'rnum' column for external pagination if it exists. 
    // Kludgy way of doing this. 
    if (row.get("rnum") != null) { 
     out.append(nf.format(row.get("rnum"))); 
    } else { 
     out.append(nf.format(getListIndex() + 1)); 
    } 
    out.append('.'); 
    return out.toString(); 
} 

Merci.

/mcr

Répondre

1

Vous devriez être en mesure de calculer la valeur de l'indice global correct en faisant référence au numéro de page qui est à la demande.

code quelque chose comme votre classe TableDecorator devrait fonctionner:

public String getIndex() { 
    int numItemsPerPage = 100; 
    int page = Integer.parseInt(getPageContext().getRequest().getParameter("page")); 
    int index = getListIndex(); 

    return ((page - 1) * numItemsPerPage) + index + 1; 
} 
+0

Merci, Marcus. C'est une excellente approche, mais y a-t-il un moyen de trouver dynamiquement numItemsPerPage? Je cherchais un moyen d'accéder à l'original PaginatedList passé dans la balise de table, mais en vain (sauf si vous codez en dur le nom de la demande param - mais pas pratique pour nous b/c le nom de l'objet PaginatedList varie). Merci encore. –

+0

La seule façon dont je pourrais penser à faire ceci est d'accéder à la PaginedList à partir de la requête. Peut-être créer un autre paramètre de requête qui stocke le nom de votre objet PaginatedList ?? Le nouveau paramètre peut être défini dynamiquement dans votre classe de servlets. –

+0

Merci encore. BTW, je pense que la formule devrait être: "return ((page - 1) * numItemsPerPage) + index + 1;" –

Questions connexes