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

Développement Web en Java Discussion :

Portée des variables dans le cas particulier de création PDF


Sujet :

Développement Web en Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut Portée des variables dans le cas particulier de création PDF
    Bonjour !

    je souhaite utiliser l'exellent outil "iText" pour éditer des pdf dans mon application javaEE.

    grâce au livre "iText in action" et ses tutoriels, je m'initie petit à petit à cet outil.

    MAIS :

    Je n'arrive pas à récupérer le contenu de variables pour les intégrer dans mon pdf.
    Encore une fois, un exemple vaut mieux qu'un long discours pour comprendre mon soucis.

    Pour bien comprendre ma démarche :
    1) dans mon fichier "web.xml" j'ai installé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <servlet>
        <description/>
        <display-name>Billet</display-name>
        <servlet-name>Billet</servlet-name>
        <servlet-class>logic.IVenteCatalogManager</servlet-class>
        </servlet><servlet-mapping>
        <servlet-name>Billet</servlet-name>
        <url-pattern>/ivente/e-billet.pdf</url-pattern>
    </servlet-mapping>
    2) déclaration de mes variables et code de mon application (partiel) :

    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
     
    @ManagedBean
    @SessionScoped
     
    public class IVenteCatalogManager extends HttpServlet implements Serializable {
     
     
        // pour le bouton demo
     
        private String demoText;
        String demoDisplay;
        Boolean demo;
     
    public String vendeur;
     
    public String InBox(String entree) {
           vendeur=entree;
           return "";
       }
     
    public String OutBox() {       
           String render = vendeur;
           return render;
       }
    .......
            demoDisplay=" - Démonstration";
            InBox(demoDisplay);
    .......
     
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
     
            response.setContentType("application/pdf");
     
            try {
                // step 1
                Document document = new Document();
                // step 2
                PdfWriter.getInstance(document, response.getOutputStream());
                // step 3
                document.open();
                // stap 4
                //String essai=routines.OutBox();
                String essai=this.OutBox();
                document.add(new Paragraph("rezaBus"));
                document.add(new Paragraph(displayNomExploit));
                document.add(new Paragraph(displayLibExploit));
                document.add(new Paragraph(essai+" - "+demoDisplay));
                document.add(new Paragraph(new Date().toString()));
                // step 5
                document.close();
            } catch (DocumentException de) {
                throw new IOException(de.getMessage());
            }
        }
    il s'avère que le résultat dans l'affichage de mon pdf est soit "" soit null pour les variables "essai" et "demoDisplay"
    La seule manière d'arriver à un affichage du contenu des variables est de rajouter "static" en argument de déclaration de variable. Mais dans ce cas là avec "static", les différentes sessions des utilisateurs de mon applications se confondent, car les variables deviennent globales au niveau de l'application.
    J'ai essayé d'autres arguments en suivant les multiples explications trouvé sur ce forum, mais cela ne change rien à cette situation.
    Ce que je trouve curieux aussi, c'est que NetBeans ne signale pas d'erreur en écrivant le code, ce qui signifie que les variables sont bien reconnues, et pourtant, le contenu ne passe pas

    Quelqu'un a-t-il une idée ?

    Merci par avance !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    pour compléter : Ne serais-ce pas une erreur de ma part dans le fichier web.xml ?

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
        <distributable/>
        <context-param>
            <param-name>javax.faces.PROJECT_STAGE</param-name>
            <param-value>Development</param-value>
        </context-param>
        <servlet>
            <servlet-name>Faces Servlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>*.xhtml</url-pattern>
        </servlet-mapping>
     
     
    <servlet>
        <description/>
        <display-name>Billet</display-name>
        <servlet-name>Billet</servlet-name>
        <servlet-class>logic.IVenteCatalogManager</servlet-class>
        </servlet><servlet-mapping>
        <servlet-name>Billet</servlet-name>
        <url-pattern>/ivente/e-billet.pdf</url-pattern>
    </servlet-mapping>
     
     
        <session-config>
            <session-timeout>
                30
            </session-timeout>
        </session-config>
        <welcome-file-list>
            <welcome-file>index.xhtml</welcome-file>
        </welcome-file-list>
        <security-constraint>
            <display-name>AdminRezaConstraint</display-name>
            <web-resource-collection>
                <web-resource-name>AdminReza</web-resource-name>
                <description/>
                <url-pattern>/bridge/*</url-pattern>
                <url-pattern>/bilan/*</url-pattern>
                <url-pattern>/cat/*</url-pattern>
                <url-pattern>/gcpte/*</url-pattern>
                <url-pattern>/ptvte/*</url-pattern>
                <url-pattern>/sections/*</url-pattern>
                <url-pattern>/tarifs/*</url-pattern>
                <url-pattern>/trains/*</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <description/>
                <role-name>AdminRezaRole</role-name>
            </auth-constraint>
        </security-constraint>
        <security-constraint>
            <display-name>BilletRezaConstraint</display-name>
            <web-resource-collection>
                <web-resource-name>BilletReza</web-resource-name>
                <description/>
                <url-pattern>/vente/*</url-pattern>
                <url-pattern>/ivente/*</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <description/>
                <role-name>BilletRezaRole</role-name>
            </auth-constraint>
        </security-constraint>
        <security-constraint>
            <display-name>RtRezaConstraint</display-name>
            <web-resource-collection>
                <web-resource-name>RtReza</web-resource-name>
                <description/>
                <url-pattern>/rt/*</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <description/>
                <role-name>RtRezaRole</role-name>
            </auth-constraint>
        </security-constraint>
        <security-constraint>
            <display-name>PadRezaRole</display-name>
            <web-resource-collection>
                <web-resource-name>PadReza</web-resource-name>
                <description/>
                <url-pattern>/pad/*</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <description/>
                <role-name>PadRezaRole</role-name>
            </auth-constraint>
        </security-constraint>
        <security-constraint>
            <display-name>StatRezaRole</display-name>
            <web-resource-collection>
                <web-resource-name>StatReza</web-resource-name>
                <description/>
                <url-pattern>/stat/*</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <description/>
                <role-name>StatRezaRole</role-name>
            </auth-constraint>
        </security-constraint>
        <security-constraint>
            <display-name>VipRezaRole</display-name>
            <web-resource-collection>
                <web-resource-name>VipReza</web-resource-name>
                <description/>
                <url-pattern>/vip/*</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <description/>
                <role-name>VipRezaRole</role-name>
            </auth-constraint>
        </security-constraint>
        <security-constraint>
            <display-name>JmLogRole</display-name>
            <web-resource-collection>
                <web-resource-name>SadMintRole</web-resource-name>
                <description/>
                <url-pattern>/sadmint/*</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <description/>
                <role-name>SadMintRole</role-name>
            </auth-constraint>
        </security-constraint>
        <login-config>
            <auth-method>BASIC</auth-method>
            <realm-name>file</realm-name>
        </login-config>
        <security-role>
            <description/>
            <role-name>AdminRezaRole</role-name>
        </security-role>
        <security-role>
            <description/>
            <role-name>BilletRezaRole</role-name>
        </security-role>
        <security-role>
            <description/>
            <role-name>RtRezaRole</role-name>
        </security-role>
        <security-role>
            <description/>
            <role-name>PadRezaRole</role-name>
        </security-role>
        <security-role>
            <description/>
            <role-name>StatRezaRole</role-name>
        </security-role>
        <security-role>
            <description/>
            <role-name>VipRezaRole</role-name>
        </security-role>
        <security-role>
            <description/>
            <role-name>SadMintRole</role-name>
        </security-role>
    </web-app>
    Merci de m'aider pour cet ultime "coup de pouce !" j'ai vraiment besoin d'aide...

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    J'ai du mal à comprendre la logique, c'est une servlet, pas un ManagedBean

    du coup, il faut passer par des request.getParameter("nomParam") pour récupérer la valeur passée dans l'URL.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Ca ne marche pas.

    C'est vrai que mon code peut paraître bizarre. Ce n'est bien évidemment qu'une petite partie, et c'est un test, avec plusieurs tentatives.

    Mon test consiste simplement à arriver à afficher le contenu d'une variable (demoDisplay) pour cet exemple dans ma page pdf quand elle s'affiche.

    Je pense, mais je peux me tromper, que le soucis est dans la portée de ma variable.
    Et j'ai l'impression que si mon pdf est hors de portée, c'est à cause d'un mauvais positionnement de sa déclaration dans le fichier web.xml.

    Ou alors, j'essaie peut-être de regrouper dans le même code deux choses différentes : managedbean et servlet.

    cer qui est sûr, ce que, si je déclare demoDisplay comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static String demoDisplay;
    ça marche, mais si je déclare demoDisplay comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public String demoDisplay;
    ça ne marche plus.
    Mais static fait que "demoDisplay" deviens une variable unique pour tous les utilisateurs connectés au logiciel, et les données de l'un vont se retrouver dans la page pdf de l'autre...
    Je suis vraiment coincé dans cette chausse trappe !
    Il faut avouer qu'il y a encore peu de temps je ne connaissait pas JavaEE, et que j'ai dû transposer une appli en pascal (lazarus) en application web... Pas simple !

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    .......
            demoDisplay=" - Démonstration";
            InBox(demoDisplay);
    .......
    Et ces petits points, ça correspond à quoi? Un servlet ce n'est pas un managed bean, et ne va pas imaginer que c'est spring qui instancie ta servlet. En plus, une servlet ne dois pas avoir d'état, elle peut servir de nombreux clients simultanément.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jmdel5327 Voir le message
    Ca ne marche pas.
    ...
    Ben ça devrait, mais comme on n'a pas assez d'informations, difficile d'aider...

    Les paramètres sont passés par l'URL de la servlet, ça ressemblera à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /urlServlet?essai=ma valeur pour essai&demoDisplay=ma valeur pour l'autre
    et dans ta servlet, tu auras juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String essai = request.getParameter("essai");
    String demo = request.getParameter("demoDisplay");
    ...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Je ne comprends pas vraiment...

    Mais je suis parti sur une autre solution

    En fait, je crée en "static" un tableau de données un peu dans l'idée de ressembler à une file d'attente d'impression. Chaque ligne du tableau contient un identifiant correspondant à l'utilisateur de la demande de pdf.
    Ensuite, au moment de la création de pdf, je n'ai plus accès qu'au tableau sus-visé, mais j'ai pris le soin par avance d'installer un cookie sur chaque ordi utilisateur. Je récupère le contenu de ce cookie, qui me permet donc d'identifier l'utilisateur, et par là, dans le tableau les lignes qui lui correspondent. Il ne reste plus qu'à générer le pdf en fonction.

    Ouf ! C'est un peu compliqué, mais ça marche

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Static, application web, tu oublie tout de suite.

    Quel besoin tu as que ce tableau soit commun à tous les utilisateurs? Visiblement , tu récupère la ligne du tableau pour générer le PDF à partir du cookie de l'utilisateur. Donc du coup la question que je me pose: quelle est l'utilité de mettre un tableau général alors que tu aurais pus stocker ça dans la session utilisateur?

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    Ben justement, le tableau commun à tous les utilisateurs me permet de contourner le problème initial de portée de mes variables.

    En effet, dans la routine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    Je n'arrive pas à accéder à mes variables "locales", quelles soient public, private, ou autre.

    La seule manière que j'ai trouvé de passer des données d'une partie à l'autre de mon code est d'utiliser "static", et là, c'est commun à tous le monde !
    (c'est le sujet de cette discussion)

    Aussi, j'ai imaginé cette solution à base de cookies

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si tu dois maintenir des données d'une requête à une autre pour l'utilisateur, le plus simple est de faire request.getSession().setAttribute(....) et request.getSession.getAttribute(.....) qui te permettent de stocker des données dans la session de l'utilisateur. Tu n'a pas à utiliser de variable statique et encore moins de créer des champs dans ta servlet. Quand à jouer avec de cookies, c'est finalement bidouiller pour faire quelque chose que le conteneur faire déjà: gérer une session.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2012
    Messages : 56
    Points : 35
    Points
    35
    Par défaut
    J'ai encore beaucoup de fondamentaux à apprendre sur JavaEE et les serveurs...
    Je ne sais pas utiliser request.getSession().setAttribute(....) dans les différentes parties de mon application.

    On va y aller petit à petit !

    Un long chemin connu est toujours mieux qu'un chemin plus court mais inconnu dans lequel je m'empêtre comme dans des sables mouvants...

    Merci encore

Discussions similaires

  1. [Débutant] Portée des variables dans une classe
    Par Jah73 dans le forum VB.NET
    Réponses: 24
    Dernier message: 10/10/2013, 14h55
  2. Portée des variables: Include dans une fonction
    Par BlindeKinder dans le forum Langage
    Réponses: 9
    Dernier message: 08/02/2011, 18h45
  3. [MySQL] Portée des variables dans un même script
    Par paintbox dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/07/2010, 20h11
  4. Portée des variables et pointeurs dans une procédure
    Par gicquairea dans le forum WinDev
    Réponses: 6
    Dernier message: 02/10/2007, 11h52
  5. portée des variables globales dans un fichier js
    Par crakazoid dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 14/04/2006, 16h49

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