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

Servlets/JSP Java Discussion :

Lancement d'action Java depuis une JSP


Sujet :

Servlets/JSP Java

  1. #1
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut Lancement d'action Java depuis une JSP
    Bonjour,

    Je me permet de venir vous demander conseil, car je débute en Java JEE, du coup, je pense avoir loupé une info ou un cours qui m'aiderai pour la suite de mon projet.

    Je fait actuellement un petit outil qui récupère des informations dans une base de donnée, et qui en sort un graphique au format png.
    Ce png est ensuite incorporé dans une page JSP, pour y être affiché.

    J'ai fait cette application en java, et tout fonctionne,
    mais aujourd'hui, j'aimerai bien lancer la génération du graphique depuis une JSP.

    Depuis mes JSP/Servlet, je récupère les informations, et j'aimerai pouvoir les envoyer à une classe qui générerai un graphique.

    Prenons l'exemple de la création d'un graphique en camembert.

    Je peut créer un camembert de cette manière :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public static void main(String[] args) {
    		Camembert cam = new Camembert();
    	}

    Le soucis, est que lorsque j'appel ce même camembert depuis un servlet ou une JSP de la manière suivante :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		Camembert cam = new Camembert();
    	}

    J'obtiens l'erreur suivante
    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
     
    cause mère 
     
    java.lang.NoClassDefFoundError: org/jfree/data/general/PieDataset
    	Rapport.doPost(Rapport.java:48)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
     
     
    cause mère 
     
    java.lang.ClassNotFoundException: org.jfree.data.general.PieDataset
    	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    	Rapport.doPost(Rapport.java:48)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    Pourtant, je ne fait qu'un appel de la classe Camembert.

    Est-ce que le fait que j'utilise un doPost ne rechercherai pas les librairies associées au projet ?

    J'utilise Eclipse comme IDE, et Tomcat comme serveur.

    Merci d'avance pour votre éventuel aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Vérifie bien que le fichier jar contenant la classe org.jfree.data.general.PieDataset est bien déployé avec l'application.

    A+.

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 196
    Points : 242
    Points
    242
    Par défaut
    Est-ce que tu as bien placé ton jar dans le dossier WEB-INF/lib de ton projet ?

  4. #4
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut
    Alors tout d'abord, merci..Et pardon.

    Pardon car j'avais intentionnellement retiré les fichiers .jar.... Pour faire des test.

    Donc c'est complétement ma faute si j'avais cette erreur.
    Mais maintenant que j'ai remis les fichiers .jar dans le fichier lib, la navigation se déroule normalement.

    C'est-à-dire, lorsque j’appelle mon Camembert(), il n'y a plus d'erreur, et je passe bien à la page suivante (comme demandée dans mon servlet)

    Sauf l'image n'est pas créer, et j'ai un petit
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Image enregistrée");
    dans la classe Camembert qui ne s'affiche pas.
    Donc au final, il ne me prend pas en compte ma création de Camembert().

    Mon Camembert est une classe créer, et par contre, elle est dans un pacquage nommé "Chart", qui lui est dans "src". Et le Camembert en question n'est qu'une classe .java à l'heure actuelle.
    (Je signal ça, peut-être au cas où je devrait la compiler à-part pour ensuite l'intégrer au projet ?)

    Donc là, plus d'erreur, alors qu'il ne semble pas prendre en compte la création de mon Camembert().

    En tout cas merci pour votre aide.

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2011
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 196
    Points : 242
    Points
    242
    Par défaut
    Lance ton serveur en mode debug et avec un point d'arrêt regarde où est-ce qu'il passe lors de la création de ton camembert.

  6. #6
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut
    Merci pour ton aide.

    Alors j'ai mis un point d'arrêt sur la création du Camembert(), et j'ai une étrange erreur lorsque je fait un step-into.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Class File Editor
    
    Source not found
    The JAR File C:\apache-tomcat-7.0.41\lib\catalina.jar has no source attachement.
    You can attach the source by clickin Attach Sopurce Below :
    
    <Boutton : Attach Source...>
    Et juste en dessous, il y a un gros message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Compiled from WebappClassLoader.java (version 1.6 : 50.0, super bit)
    public class org.apache.catalina.loader.WebappClassLoader extends java.net.URLClassLoader implements org.apache.catalina.Lifecycle {
     
      // Field descriptor #534 Lorg/apache/juli/logging/Log;
      private static final org.apache.juli.logging.Log log;
     
      // Field descriptor #536 Ljava/nio/charset/Charset;
      private static final java.nio.charset.Charset CHARSET_UTF8;
      ...
    J'ai cette erreur au lieu d'aller dans ma classe Camembert, mais lors de la navigation avec un navigateur, il ne me montre pas l'erreur, il passe directement à la suite.
    Je me demande si le fait de faire un appel à une classe (qui à l'air d'être purement en Java) ne serai pas un problème depuis le JSP.

  7. #7
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut
    Un petit up, peut-être que je n'ai pas donné assez d'informations ?
    N'hésitez pas à me demander si besoin.

  8. #8
    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
    Tu appelles ta servlet par un formulaire ou une url ?
    Par une url (ou un formulaire avec method="GET") c'est la méthode doGet qui est appelée, pas doPost.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut
    J'appel ma méthode par un formulaire.

    Dans mon formulaire, une checkbox me permet de dire si l'on veut que le graphique "Camembert" soit créer ou non.

    Donc dès que le bouton de validation est utilisé, la génération du graphique est demandée (dans le servlet), en fonction de l'état de la checkbox.

    Je vais mettre un peu plus de code pour de meilleurs explications. (J'ai simplifié les codes pour n'avoir que l'essentiel)

    Code JSP : 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
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    	<head>
    <!--  		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> -->
    		<link rel="stylesheet" href="./scripts/style.css" type="text/css">
    		<title>Génération du camembert</title>
    	</head>
    	<body>
    		<h1>Génération du camembert</h1>
    		<form method="post" action="Rapport" >
    			<p>
    			<table class="marge">
    				<thead> <!-- En-tête du tableau -->
    					<tr>
    						<th></th>
    						<th>Graphique</th>
    					</tr>
    				</thead>
    				<tbody> <!-- Corps du tableau -->
    					<tr>
    						<td>Affichage d'informations</td>
    						<td><input type="checkbox" name="GraphInfo"></td>
    					</tr>
    				</tbody>
    			</table>
    			<div id="action">
    				<input type="submit" value="Valider">
    			</div>
    		</form>
    	</body>
    </html>

    Ensuite, une fois qu'on appuis sur le bouton Valider, je récupère l'info si le checkbox "GraphInfo" (information par graphique) est cochée, et si oui, je demande la création du graphique.

    Code Java : 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
    import java.io.IOException;
     
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import Chart.Camembert;
     
     
    public class Rapport extends HttpServlet {
     
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    		if(request.getParameter("GraphInfo")!=null)
    		{
    	    		Camembert Cam = new Camembert();
    		}
     
    	    		System.out.println("Passage dans le servlet \"Rapport\""); //Petit indicateur
     
    		this.getServletContext().getRequestDispatcher( "/rapport.jsp" ).forward( request, response );
    	}
    }

    La classe Camembert me semble un peu grosse à mettre ici, et en plus elle fonctionne bien lorsque je l'appel depuis un fichier Java normal. (Donc elle a l'air bien fonctionnelle)

    Sauf que là encore, le Camembert n'est pas créer (pas de message de confirmation, pas de .png créer)
    C'est comme si il y avait une erreur lors de la création du camembert, et que Tomcat sautait l'étape de création du camembert pour continuer ensuite.

    Merci en tout cas de ton aide !

  10. #10
    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
    Il est possible que ta classe Camenbert pose problème dans ce contexte, tu n'as aucun message dans la log ?
    Tu n'as pas le message lié à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Passage dans le servlet \"Rapport\"");
    dans la console, c'est bien ça ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut
    Je précise :

    Le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Passage dans le servlet "Rapport"
    S'affiche bien (dans tout les cas)

    Mais à l'intérieur de ma classe Camembert, il y a un message qui devrait apparaitre :
    Et ce dernier n'apparait pas. Donc pas de passage dans la classe Camembert.

  12. #12
    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
    Il faudrait poster la classe Camenbert... c'est elle qui coince
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut
    Je ne voulais pas polluer, mais puisqu'il le faut..en avant !

    Alors, ceci est une classe Camembert avec des exemples bidons, que j'ai fait pour les tests.
    Elle réunis et condense tout-en-un (je fait le dataset dedans, je créer le graphique, et j'enregistre ensuite l'image, tout ça en un coup !)

    Code Java : 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
    package Chart;
     
    import java.io.File;
    import java.io.IOException;
     
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.plot.Plot;
    import org.jfree.data.general.DefaultPieDataset;
     
     
    public class Camembert {
     
    		JFreeChart jTest;
    		DefaultPieDataset dConteneur;
     
     
    	    public Camembert() 
    	    {
    	    dConteneur = CreateConteneur();
    	    jTest = CreateCamembert(dConteneur);
    	    ExportCamembert(jTest);
    	    }
     
    		private static DefaultPieDataset CreateConteneur()
    		{
    	        DefaultPieDataset union = new DefaultPieDataset();
    	        union.setValue("Sans diplôme",5862);
    	        union.setValue("CEP",4357);
    	        union.setValue("BEPC Brevet",2691);
    	        union.setValue("CAP BEP",9184);
    	        union.setValue("BAC",5850);
    	        union.setValue("BAC +2",5140);
    	        union.setValue("Au delà de BAC +2",4173);
    	        return union;
    		}
     
    	    private static JFreeChart CreateCamembert(DefaultPieDataset union)
    	    {
    	        JFreeChart repart = ChartFactory.createPieChart3D("Répartition par type d'études",union,true, true, false);
     
    		        Plot plot = repart.getPlot();
    		        plot.setBackgroundPaint(null);
    		        return repart;
    	    }
     
     
    	    private static void ExportCamembert(JFreeChart repart)
    	    {
    	        try {
    		          ChartUtilities.saveChartAsPNG(new File("WebContent/WEB-INF/images/Histograme.png"), repart, 900, 600);
    			        System.out.println("Image enregistrée");
    		          } catch (IOException e) {}
    	    }
    	}

    Je viens de faire un autre test :
    J'ai créer un fichier Java (dans "src") qui contient une méthode "Main", et j'ai appelé mon Camembert depuis cette méthode (avec un simple "new Camembert()"). Et ça fonctionne.

    J'espère que ça vous donne assez d'indices !

  14. #14
    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
    Je pense que ton problème vient de l'export png...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new File("WebContent/WEB-INF/images/Histograme.png")
    Dans un contexte web, si tu veux mettre l'image dans le répertoire "/WEB-INF/images", il faudrait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String path = request.getSession().getServletContext().getRealPath("/WEB-INF/images/");
    path += "/Histogramme.png";
    ...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut
    Bon alors, j'ai fait un autre test.

    J'ai déporté les actions que je fait dans ma classe Camembert directement dans le servlet.

    Après quelques essais, j'arrive à générer mon image (même si c'est dans le dossier de Eclipse, au moins, elle est générée !)

    Du coup, la question que je me pause, c'est : "Pourquoi il n'aime pas quand je passe par le biais d'une classe ?"

    Est-ce l'enchainement de toutes les méthodes de la classe dans le constructeur même qui le dérange ? Et si oui, pourquoi ça ne dérange pas le déroulement d'une application normale Java ?

    En tout cas, vous aviez raison, c'est surement ma classe Camembert qui est vilaine.

    Désolé de vous avoir fait perdre du temps, j'aurai du vous la montrer dès le début.

    Maintenant, il faut que j'arrive à faire une classe propre qui fonctionne (car je ne peut bien évidement pas laisser tout dans le servlet)

    Dans tout les cas, merci pour cette avancée !

    EDIT : Merci pour votre réponse, en effet, ça m'aide encore plus ! Mais du coup, je vais devoir externaliser le chemin (qui sera rentré en argument lors de l'appel de la méthode d'enregistrement de l'image)

    Enfin bref, vous m'avez ouvert les yeux, j'ai une (voir 2) solutions, et je vous en remercie grandement !

  16. #16
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonjour,

    dans un contexte de servlet, n'aurait-il pas été préférable de chercher à produire le camembert par le flux de sortie, plutôt que dans un java.io.File?

    En modifiant au préalable ta classe Camembert pour qu'elle exploite un paramètre de type java.io.OutputStream ( et alors utiliser la méthode ChartUtilities.writeChartAsPNG() ), et en associant une servlet de cette forme:
    Code java : 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
     
    package net.developpez
     
    /**
     * Servlet de production d'un histogramme/Camembert.
     */
    public class ChartServlet extends HttpServlet {
     
    /**
     * @{inheritdoc}
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    response.setContentType("image/png");
    OutputStream fluxSortie = response.getServletOutputStream();
    new Camembert(fluxSortie);
    fluxSortie.flush();
    }
    }

    avec un descripteur de déploiement Web.xml du style
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <servlet>
    <class>net.developpez.ChartServlet</class>
    <servlet-name>ChartServlet</servlet-name>
    </servlet>
    <servlet-mapping>
    <servlet-name>ChartServlet</servlet-name>
    <url-mapping>/histogramme.png</url-mapping>
    </servlet-mapping>

    tu aurais pu potentiellement produire le résultat attendu, sans chercher à modifier le contenu de ton WAR.

    Sébastien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel des objet Java depuis une JSP
    Par Titeuf82 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 07/03/2008, 11h07
  2. Appeler une application Java depuis une JSP ?
    Par bekara_k dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 19/04/2007, 13h08
  3. acceder à un fichier xml depuis une jsp
    Par rvfranck dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 04/10/2006, 18h12
  4. Focus sur JFileChooser lancer depuis une jsp
    Par Meunier dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 13/09/2006, 22h23
  5. Erreur appel fonction java d'une jsp
    Par itachi38 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 29/04/2006, 16h51

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