IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Taglibs Java Discussion :

Entete Tableau avec Displaytag


Sujet :

Taglibs Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut Entete Tableau avec Displaytag
    Bonjour à tous,

    je souhaite afficher un tableau en utilisant DisplayTag et j'ai besoin que mes entetes de colonnes soient de cette forme :

    ________________________________________________________________
    .............Entete 1........................... |......Entete 2............................|
    -------------------------------------------------------------------------
    ss- entete11....|...ss-entete 12..........|....ss-entete 21.|.ss-entete22....|
    --------------------------------------------------------------------------
    .....................|..............................|.............................................|
    .....................|..............................|.............................................|

    En fait j'ai besoin de rajouter des entetes de colonnes par dessus celles générées par displaytag...
    Est-ce possible ?

    Merci pour votre aide.

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Bonsoir,

    J'ai déjà eu à le faire, mais je n'ai pas trouvé de moyen d'étendre proprement le display tag car le finishRow ne s'applique pas à l'entête (on a donc recodé en sous-classant au maximum - une classe redéfinie complètement - pour appliquer le même pattern pour l'entête).

    Si personne n'a de solution clé en main, je peux voir à te trouver des bouts de code.

    Eric

  3. #3
    Membre confirmé

    Inscrit en
    Avril 2005
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 317
    Points : 553
    Points
    553
    Par défaut
    Y a t il quelquechose qui t'impose que ta ligne "Entete1...Entete2..." fasse partie de displaytag ?
    Ne peux-tu pas simplement mettre un tableau des lignes d'entêtes avant celui généré par displaytag ? Il faudra alors peut être juste que la largeur des colonnes concordent....

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut
    Merci pour vos reponses...
    Ricky81 : je veux bien que tu m'expliques comment tu as fait et pourquoi pas me donner des bouts de code...

    ericw78 : non rien n'impose que cela fasse partie du displayTag ...il faudrait alors supprimer ou deplacer la partie pagination du displaytag (quelqu'un sait-il comment on fait) et arriver a coller un tableau html avant celui du displaytag...
    Je vais essayer...

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut
    Je viens d'essayer de coller un tableau html avant le displayTag mais c'est assez compliqué d'aligner les colonnes vu que DisplayTag gere les largeurs de colonnes en fonctions des valeurs présentes dans le tableau.

  6. #6
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Voila en résumé ce qui avait été fait (attention, comme je l'ai dit, c'est loin d'être propre et c'est risqué en cas de nouvelle version du display-tag) :

    1) Création d'une classe abstraite héritant de TableDecorator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public abstract class StartHeaderTableDecorator extends TableDecorator {
     
        /**
         * Renvoyer le startheader, c'est a dire les elements qui seront inseré entre apres le debut de la table et 
         * avant la premiere ligne du header 
         * 
         * <table>
         *  <thead>
         *  
         *  Ici le startheader
         *  
         *   <tr>...</tr>
         *  </thead> 
         * </table>
         * 
         * 
         * @return le preHeader
         */
        public String getStartHeader() {
            return null;
        }
    }
    2) Redéfinir son propre HtmlTableWriter en étendant la classe du display tag tout en surchargeant les attributs non accessibles par héritage (elle ne se laissait pas étendre convenablement) et notamment redéfinissant la méthode writeTableHeader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        public MonHtmlTableWriter(TableModel tableModel, TableProperties tableProperties, Href baseHref, boolean export,
                JspWriter out, CaptionTag captionTag, PaginatedList paginatedList, SmartListHelper listHelper, int pagesize,
                HtmlAttributeMap attributeMap, String uid) {
            super(tableModel, tableProperties, baseHref, export, out, captionTag, paginatedList, listHelper, pagesize, attributeMap,
                    uid);
            this.tableModel = tableModel;
            this.properties = tableProperties;
            this.baseHref = baseHref;
            this.export = export;
            this.out = out;
            this.captionTag = captionTag;
            this.paginatedList = paginatedList;
            this.listHelper = listHelper;
            this.pagesize = pagesize;
            this.attributeMap = attributeMap;
            this.uid = uid;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
        protected void writeTableHeader(TableModel model) {
     
            if (log.isDebugEnabled()) {
                log.debug("[" + tableModel.getId() + "] getTableHeader called");
            }
     
            // open thead
            write(TagConstants.TAG_THEAD_OPEN);
     
            // on rajoute un startHeader ? 
            if (tableModel.getTableDecorator() instanceof StartHeaderTableDecorator) {
                if (((StartHeaderTableDecorator) tableModel.getTableDecorator()).getStartHeader() != null) {
                    write(((StartHeaderTableDecorator) tableModel.getTableDecorator()).getStartHeader());
                }
            }
     
            // open tr
            write(TagConstants.TAG_TR_OPEN);
     
            // no columns?
            if (this.tableModel.isEmpty()) {
                write(TagConstants.TAG_TH_OPEN);
                write(TagConstants.TAG_TH_CLOSE);
            }
     
            // iterator on columns for header
            Iterator iterator = this.tableModel.getHeaderCellList().iterator();
     
            while (iterator.hasNext()) {
                // get the header cell
                HeaderCell headerCell = (HeaderCell) iterator.next();
     
                if (headerCell.getSortable()) {
                    String cssSortable = this.properties.getCssSortable();
                    headerCell.addHeaderClass(cssSortable);
                }
     
                // if sorted add styles
                if (headerCell.isAlreadySorted()) {
                    // sorted css class
                    headerCell.addHeaderClass(this.properties.getCssSorted());
     
                    // sort order css class
                    headerCell.addHeaderClass(this.properties.getCssOrder(this.tableModel.isSortOrderAscending()));
                }
     
                // append th with html attributes
                write(headerCell.getHeaderOpenTag());
     
                // title
                String header = headerCell.getTitle();
     
                // column is sortable, create link
                if (headerCell.getSortable()) {
                    // creates the link for sorting
                    Anchor anchor = new Anchor(getSortingHref(headerCell), header);
     
                    // append to buffer
                    header = anchor.toString();
                }
     
                write(header);
                write(headerCell.getHeaderCloseTag());
            }
     
            // close tr
            write(TagConstants.TAG_TR_CLOSE);
     
            // close thead
            write(TagConstants.TAG_THEAD_CLOSE);
     
            if (log.isDebugEnabled()) {
                log.debug("[" + tableModel.getId() + "] getTableHeader end");
            }
        }
    3) Reprendre le TableTag du display tag et définir la méthode writeHTMLData ainsi en utilisant "MonHtmlTableWriter" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        private void writeHTMLData() throws JspException {
            JspWriter out = this.pageContext.getOut();
     
            String css = this.properties.getCssTable();
            if (StringUtils.isNotBlank(css)) {
                this.addClass(css);
            }
            // use HtmlTableWriter to write table
            new MonHtmlTableWriter(this.tableModel, this.properties, this.baseHref, this.export, out, getCaptionTag(),
                    this.paginatedList, this.listHelper, this.pagesize, getAttributeMap(), this.uid).writeTable(this.tableModel, this
                    .getUid());
     
            if (this.varTotals != null) {
                pageContext.setAttribute(this.varTotals, getTotals());
            }
        }
    Enfin, tu dupliques la TLD displaytag.tld pour en faire ta version en changeant notamment le <short-name> et le <tag-class> pour le tag "name".

    Et bien sur tu utilises cette tld pour ton cas précis.

    Ca vaut ce que ca vaut. J'avais sollicité les auteurs du display tag pour voir s'il n'était pas possible d'intégrer le getStartHeader, mais je n'ai pas eu de retour.

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut
    Merci pour ton aide.
    Je vais essayer ca et je te dis si ca marche...

  8. #8
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut
    Je n'arrive pas a faire fonctionner cette solution...Je comprend bien le principe mais j'ai une exception (NullPointer) lorsque je suis dans le code de la classe MonTableTag (avec le code recopié de tableTag en changeant juste la methode writeHTMLData() ).

    J'instancie mon objet new MonHtmlTableWriter mais la methode write me lance une NullPointer.
    Par contre j'ai redeclaré tous les attributs de TableTag (comme pour ceux de HtmlTableWriter) vus qu'ils ne sont pas visibles, je ne sais pas si il faut le faire.

  9. #9
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    L'exception se situe sur quoi en particulier ?
    Vérifies que tu as bien redéfinis les getter / setter pour le TableTag.

  10. #10
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 43
    Points
    43
    Par défaut
    Oui j'avais bien redefini les getters et setters...je vais creusé pour voir d'ou viens l'erreur ou sinon reflechir pour voir comment faire autrement parce que la solution est bonne mais il faut quand meme recoder son propre displayTag pour afficher une petite entete...
    Je marque résolu dès que je suis arrivé à le faire marcher...

    Merci...

Discussions similaires

  1. Affichage tableau avec DisplayTag
    Par sky88 dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 02/06/2011, 11h28
  2. [WD-2003] Saut de page dans un tableau avec répétition des entetes
    Par shawn12 dans le forum VBA Word
    Réponses: 3
    Dernier message: 27/08/2010, 01h00
  3. displaytag entete tableau
    Par phpaide dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 16/02/2010, 10h46
  4. generer un tableau avec displaytag
    Par kt_marilyne dans le forum Collection et Stream
    Réponses: 0
    Dernier message: 02/03/2009, 16h47
  5. tracer un tableau avec displaytag
    Par ismas dans le forum Struts 1
    Réponses: 1
    Dernier message: 23/05/2008, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo