1

salut

je dois developper des servlets/JSP

A priori tout devrait fonctionner (enfin en théorie hehe) mais ce ]~#^@~de tomcat 5.5 ne trouve pas une de mes classes JAVA si je l'instancie à partir d'une page JSP (problème de classpath je suppose)

vlà la page :
<%@ page language="Java" import="java.util.*" %>
<%
	// on récupère les paramètres
	//Collection<PersonsList.PersonInfo> col_pi_personsList= (Collection<PersonsList.PersonInfo>)request.getAttribute("col_pi_personsList");
	Collection col_pi_personsList= (Collection)request.getAttribute("col_pi_personsList");
%><html>
<head><title>Test de fichier HTML</title>
  <style>
    * { font-family:verdana ; font-size:xx-small; }
    body { padding:15px; width:300px; }
  </style>
</head>
<body>
  <h2>Résultat :</h2>
  <ul>
  <%
  	/*for ( PersonsList.PersonInfo pi : col_pi_personsList )
		out.println("<li>"+pi.getFirstName()+" "+pi.getLastName()+"</li>") ;*/
	for ( Iterator i= col_pi_personsList.iterator() ; i.hasNext() ; ) {
		PersonsList.PersonInfo pi= (PersonsList.PersonInfo)i.next() ;
		out.println("<li>"+pi.getFirstName()+" "+pi.getLastName()+"</li>") ;
	}
  %>
  </ul>
</body>
</html>




déjà on remarque que les nouvelles features du J2SE 5 ne semblent pas supportées (bon ça encore c'est pas un drame)
mais surtout il ne trouve pas la classe PersonsList :

org.apache.jasper.JasperException: Impossible de compiler la classe pour la JSP

Une erreur s'est produite à la ligne: 17 dans le fichier jsp: /personsList.jsp
Erreur de servlet générée:
PersonsList cannot be resolved or is not a type

Une erreur s'est produite à la ligne: 17 dans le fichier jsp: /personsList.jsp
Erreur de servlet générée:
PersonsList cannot be resolved


	org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
	org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
	org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:397)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:288)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:267)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:255)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:556)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:293)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	PersonsList.doGet(PersonsList.java:71)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de Apache Tomcat/5.5.9.










j'ai alors affiché le clasPath :

<%@ page language="Java" import="java.util.*" %>
<html>
<head><title>Test de fichier HTML</title>
  <style>
    * { font-family:verdana ; font-size:xx-small; }
    body { padding:15px; width:300px; }
  </style>
</head>
<body>
  <%=System.getProperties().getProperty("java.class.path")%>
</body>
</html>



ce qui renvoit ceci :


<html>
<head><title>Test de fichier HTML</title>
  <style>
    * { font-family:verdana ; font-size:xx-small; }
    body { padding:15px; width:300px; }
  </style>
</head>
<body>
  C:\Program Files\Apache Software Foundation\Tomcat 5.5\bin\bootstrap.jar
</body>
</html>




=> J'ai alors ajouté
%CATALINA_HOME%\webapps\jmonvill\WEB-INF\classes
c'est à dire
C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\jmonvill\WEB-INF\classes
dans mon CLASSPATH


Mes classes *.class :
/cygdrive/c/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/jmonvill/WEB-INF/classes
$ ls -1
ConnMySQL$CantConnect2MySQLServException.class
ConnMySQL.class
PersonsList$PersonInfo.class
PersonsList.class






mais le JSP d'affichage de classpath retourne exactement la même chose qu'avant... roll



bref, je ne comprend pas, je ne sais pas comment faire, sniff, sniff mourn

2

ah tiens y'a le forum JSP... m'suis trompé, dsl cheeky (enfin c'est quand même un problème de java embarrassed)

3

eek des scriplets
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

4

erf, j'ai pas le choix :/

5

c'est incroyable ce que c'est lourd à mettre en place.. faut des fichiers XML, respecter une arborescence, etc.. sick (enfin peut etre que quand on a l'habitude c'est bien mais bon..)

6

1.) as tu / peux tu essayer sans inner class, c'est à dire en séparant PersonInfo de PersonList ?
2.) la présence d'espace dans le chemin de tes classes ne peut-il pas poser pb à Tomcat ?
3.) à quel moment et avec quelle isntruction ajoutes-tu ton répertoire au classpath ? Peux tu essayer en le faisans dans une scriplet au début de ta page (avec la classe System)


Enfin, moi et les pb de classpath en général ça fait 3 ou plus (surtout avec ce %$£*^ù de Tomcat).
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

7

./5 > c'et l'ide qui fait tout.
Mais bon, une fois mis en place, tu vas plus vite.
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

8

1 / j'ai pas essayé directement mais j'ai essayé de faire un
ConnMySQL= null ;
et ça fait la meme erreur pour cette ligne (trouve pas ConnMySQL, qui est stockée dans le meme rep que les autres)
donc je ne pense pas que ça vienne de là

2 / je ne sais pas mais je n'ai pas trop le choix, je ne suis pas admin sur cette machine (je ne suis pas chez moi)
Ceci dit, je ne pense pas non plus que ça vienne de ça vu que PersonsList (qui est un servlet) semble appelée correctement


3 / je l'ajoute au niveau windows, ie variables d'env, ajouter var, etc..
je vais essayer avec System (je ne connais pas, je vais regarder)

9

4.) et si tu nommes complètement ta classe ? :
bidule.toto.machin.fr.projet.PersonsList.PersonInfo pi= (bidule.toto.machin.fr.projet.PersonsList.PersonInfo)i.next() ;

5.) et avec un import explicite ?
<%@ page import="bidule.toto.machin.fr.projet.PersonsList.PersonInfo, java.util.*" %>
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

10

./8> System.setProperty("java.class.path", System.getProperties().getProperty("java.class.path") + "bidule/toto/" );
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

11

4.0 : non ici y'a pas le plugin ... tout à la main #arg#
4.1 je vais regarder
5 j'avais plus ou moins essayé mais je me suis peut etre trompé (la racine du package c'est le debut de l'url ??)

12

7 ok merci

13

./6 > tu utilises quel ide ?
(décidément, les pbs de config, je couic vraiment)
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

14

eclipse 3.1

15

smeet :
./8> System.setProperty("java.class.path", System.getProperties().getProperty("java.class.path") + "bidule/toto/" );

ne semble pas fonctionner (j'ai ajouté le séparateur) :/

16

Bon ben désolé, je dois avouer mon incompétence dans ce domaine.
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

17

./15 > c'est à dire, si tu affiches le classpath juste après y avoir ajouté ton répertoire, il l'affiche correctement ?
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

18

faut dire que c'est pas très interessant non plus #tricouic#

Je demanderai à mon prof demain mais... si vous le connaissiez... laught

19

./17 > oui ça l'affiche correctement, mais il ne trouve pas la classe pour autant :

<html>
<head><title>Test de fichier HTML</title>
  <style>
    * { font-family:verdana ; font-size:xx-small; }
    body { padding:15px; width:300px; }
  </style>
</head>
<body>
  <h2>Résultat :</h2>
  C:\Program Files\Apache Software Foundation\Tomcat 5.5\bin\bootstrap.jar;C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\jmonvill\WEB-INF\classes\
  <ul>
  
  </ul>

  <a href='/jmonvill/index.jsp'>back</a>
</body>
</html>

20

marche toujours pas et
Pen^2 :
Je demanderai à mon prof demain mais... si vous le connaissiez... sygus.gif

dommage, j'aurais du parier tsss


Sinon j'ai trouvé un workaround un peu nul :
J'ai ajouté un toString() à PersonsList avec la concaténation du nom et du prénom, et dans la boucle de l'iterateur du jsp j'ai mis
out.println(it.next().toString())
Comme ça la classe PersonsList n'est pas nommée dans le JSP, et ça fonctionne... Mais à ce jeu là, on aurait eu aussi vite fait d'écrire les données HTML dans le Servlet via un PrintWriter...

pfff zzz #blasé#

21

A propos de fixer et lire le classpath, je ferais gaffe à ça. On est dans un serveur d'application, le chargement des classes est un peu particulier.

J'ai pas suivi, tu as bien testé le .8 ? Parce que à ./1, sans import, c'est normal que ça passe pas.

22

en fait finalement ça fonctionne (depuis samedi matin)

voici ce que j'ai modifié (pour autant que je me souvienne) :
j'ai fait un package "demo" dans mon projet eclipse (avant tout était dans le package par défaut (enfin y'avait pas de package en gros))
j'ai mis mes classes dans classes/demo

j'ai mis un ajouté "demo.*" dans mes imports

et bien entendu j'ai modifié le fichier web.xml en conséquence (classe=demo.PersonsList, et url-pattern=/demo/PersonsList)

(tout ça de memoire, je n'ai pas le projet sous les yeux)

23

sinon, non je n'avais pas véritablement bien testé le ./9, parce que
Pen^2 :
5 j'avais plus ou moins essayé mais je me suis peut etre trompé (la racine du package c'est le debut de l'url ??)

24

Pen^2 :
et bien entendu j'ai modifié le fichier web.xml en conséquence (classe=demo.PersonsList, et url-pattern=/demo/PersonsList

Pour <servlet-mapping> ? Ca n'a normalement pas d'interêt si PersonsList n'est pas une servlet.

25

PersonsList est un servlet, mais PersonInfo est une classe Java *normale*
en fait je créé une Collection de PersonInfos (un conteneur avec une String pour le prenom et une autre String pour le nom) dans le le doGet de PersonsList (la servlet)


package demo ;

import java.io.IOException ;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;

import javax.servlet.ServletException ;
import javax.servlet.http.HttpServlet ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;



/**
 * @author Pen^2
 */
public class PersonsList
		extends HttpServlet
{
	/**
	 * exécuté au premier chargement de la classe
	 */
	public void init()
	{
		
	}

	
	
	
	/**
	 * 
	 * @param req
	 * @param paramName
	 * @return
	 */
	public static String getParameter( HttpServletRequest req, String paramName )
	{
		String paramValue= req.getParameter(paramName) ;
		return (paramValue!=null ? paramValue : "") ;
	}

	

	/**
	 * méthode appelée pour une requete GET
	 */
	protected void doGet( HttpServletRequest req, HttpServletResponse resp )
			throws ServletException, IOException
	{
		// recup les parametres
		String txtNom= PersonsList.getParameter(req, "txtNom") ;
		Collection personsList= new LinkedList() ;
		
		
		try {
			ConnMySQL c= new ConnMySQL() ;
			ResultSet rs= c.executeQuery(
					"SELECT * "
					+"FROM famille_tbl "
					+"WHERE nom LIKE \'%"+txtNom+"%\'") ;
			while ( rs.next() ) {
				personsList.add(new PersonInfo(rs.getString("prenom"),
														rs.getString("nom"))) ;
			}
			req.setAttribute("col_pi_personsList", personsList) ;
			getServletContext().getRequestDispatcher("/personsList.jsp")
									.forward(req,resp) ;
			return ;
		}
		catch ( SQLException e ) {
			req.setAttribute("txtErrMsg", e.toString()) ;
			getServletContext().getRequestDispatcher("/err.jsp")
									.forward(req,resp) ;
			return ;
		}
	}



	/**
	 * methode appelée pour une requête POST
	 */
	protected void doPost( HttpServletRequest req, HttpServletResponse resp )
			throws ServletException, IOException
	{
		doGet(req, resp) ;
	}
}







package demo;


/**
 * @author Pen^2
 */
public class PersonInfo
{
	public PersonInfo( String firstName, String lastName )
	{
		this.firstName= firstName ;
		this.lastName= lastName ;
	}
	
	public String getFirstName()
	{
		return firstName ;
	}
	
	public String getLastName()
	{
		return lastName ;
	}
	
	public String toString()
	{
		return firstName +" "+ lastName ;
	}
	
	
	private String firstName ;
	private String lastName ;
}

26

1) si tu n'utilises que prénom et nom, tu ne devrais pas faire un select *
2) tu devrais quand même utiliser un preparedstatement, ce serait plus joli, même si tu n'utilises ta requête que peu de fois.
3) quel est le but d'utliser une LinkedList ?
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

27

1/ c'est vrai mais c'est juste un test bidon (un exemple pour que les binomes implémentent la véritable requête)
2/ je ne connais pas, je vais me renseigner
3/ je ne sais pas, tu aurais utilisé quoi ? une ArrayList dont la taille est donnée après l'execution de la requête ? Disons que l'idée est de passer une liste de personnes au JSP, qui affichera cette liste (mais de toutes façons, se repporter au point 1/)

28

2./ Je te conseille vraiment de te renseigner oui, c'est une lacune de faire du JDBC sans connaitre PreparedStatement (même si je suppose que ce n'était pas ton but premier)
3./ Le choix d'une implémentation de Collection est toujours délicat. En général, on fait le choix en fonction de l'utilisation la plus sensible de la collection : accès direct, ajout ou suppression d'éléments, lecture séquentielle. L'impact dans une appli standard est assez minime, de toutes façons, mais on voit en général plus souvent des Ararylist, donc ton utilisation de LinkedList m'a interpellé.
Cinq font un et un font cinq : le tout est UNITE.
C'est dans l'incompréhension que je suscite que je trouve ma raison d'être.
Je suis moi, et je le suis parce que les autres ne le sont pas, et que ce sont eux qui forment ma personne.
Inconscience et déraison sont source d'imagination.
Au delà de ma conscience et de mon inconscient, mes rêves créent la réalité.

29

2/ je le ferai, mais plus tard (là je suis vraiment à l'arrache, et vu le niveau technique du prof, il ne ferait pas la difference (de toutes façons il ne regardera pas le code, ça ne fait à peu près aucun doute))
3/ dans ce cas, la collection est destinée à une lecture sequentielle uniquement (iteration dans le JSP). Du coup j'avais pris une LinkedList, vu que je fais les ajouts un à un. (et pour cette appli, qui retournera de toutes façons au néan dès vendredi en fin d'après midi, ça ne fait effectivement pas une grosse difference grin)