Interface et servlet

Fermé
Vincent B - 5 janv. 2004 à 13:23
puce31 Messages postés 8 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 13 janvier 2004 - 12 janv. 2004 à 10:24
Bonjour à tous,

j'importe un package regroupant des servlets. Comme le multihéritage en important plusieurs classes n'existe pas en JAVA, je suis obligé de créer une interface. Sachant que l'interface doit pouvoir être elle-même dans le package

J'ai créé mon interface, j'ai écrit dans ma servlet :

public class maclasse extends httpServlet implements moninterface {
... }
il n'accepte pas l'implementation. Que dois-je faire ?
Merci d'avance pour votre aide.


Vincent B

9 réponses

silfaxu Messages postés 102 Date d'inscription jeudi 18 décembre 2003 Statut Contributeur Dernière intervention 6 février 2008 11
5 janv. 2004 à 13:26
Salut,

Peux-tu donner l'erreur exacte que produit la compilation ?

sfx
0
Bonsoir sfx,

Meilleurs voeux pour 2004. J'ai réglé mon problème en utilisant l'interface founie dans le package standard de JAVA, mais je me retrouve avec le même problème qu'avant, c'est à dire une erreur interne du servlet qui ne trouve pas la classe de mon package. Voici donc le message d'erreur complet et le code source :

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import dev.test.*; // Mon package que j'importe


// si je ne met pas abstract dans la declaration, il me fait une erreur à la compile

public abstract class emprunt extends test implements Servlet {

public void handleError(Exception e, HttpServletResponse res) throws ServletException, IOException
{
res.setContentType("text/html");
PrintWriter out=res.getWriter();

// HTML est une classe créé séparément, elle fonctionne normalement

HTML h=new HTML("Calcul de l'emprunt : erreur");
h.add(HTML.HEADING, "Une erreur est survenue...", false);
h.add(HTML.LINE, "", false);
h.add(HTML.NORMAL, e.getMessage(), false);
out.println(h.getPage());
out.close();
}

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
{
// Extrait les valeurs des paramètres sous forme de chaînes.
String principalAsString=req.getParameter("capital");
String interestAsString=req.getParameter("interet");
String paymentAsString=req.getParameter("mensualite");

float principal, interest, payment;

// Initialise contenant la durée de remboursement
int months;

try
{
// Les fonctions qui provoquent l'erreur ne trouvant pas leur classe d'origine
principal=stringToFloat(principalAsString);
interest=stringToFloat(interestAsString);
payment=stringToFloat(paymentAsString);

// Utilise la classe emprunt pour obtenir sa durée
months=calculateLoanPeriod(principal, interest, payment);
}

catch (NumberFormatException e)
{
handleError(new NumberFormatException("Vérifier que vous avez rentré des valeurs numériques."), res);
return;
}

catch (Exception e)
{
handleError(e, res);
return;
}

res.setContentType("text/html");
PrintWriter out=res.getWriter();

HTML h=new HTML("Calcul de l'emprunt : résultats");
h.add(HTML.HEADING, "Résultats du calcul de l'emprunt", false);
h.add(HTML.LINE, "", false);
h.add(HTML.NORMAL, "Capital en € : ", false);
h.add(HTML.NORMAL, Float.toString(principal), true);
h.add(HTML.NORMAL, "Intérêt : ", false);
h.add(HTML.NORMAL, Float.toString(interest), true);
h.add(HTML.NORMAL, "Mensualité : ", false);
h.add(HTML.NORMAL, Float.toString(payment), true);
h.add(HTML.NORMAL, "Nombre de mensualités : ", false);
h.add(HTML.NORMAL, Integer.toString(months), true);
out.println(h.getPage());
out.close();
}
}



Error: 500
Internal Servlet Error:

// L'ordinateur cherche dans dev/test/test alors qu'il devrait chercher dans dev/test, j'ai cherché partout ou j'aurais pu faire cette erreur. le fichier JAR représentant le package a bien dev/test

java.lang.NoClassDefFoundError: dev/test/test
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.findSystemClass(ClassLoader.java:666)
at com.sun.web.core.ServletLoader.loadClass(ServletLoader.java:73)
at com.sun.web.core.ServletLoader.loadServlet(ServletLoader.java:31)
at com.sun.web.core.ServletWrapper.loadServlet(ServletWrapper.java:91)
at com.sun.web.core.ServletWrapper.handleRequest(ServletWrapper.java:119)
at com.sun.web.core.InvokerServlet.service(InvokerServlet.java:168)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:840)
at com.sun.web.core.ServletWrapper.handleRequest(ServletWrapper.java:155)
at com.sun.web.core.Context.handleRequest(Context.java:414)
at com.sun.web.server.ConnectionHandler.run(ConnectionHandler.java:139)
0
puce > Vincent B
5 janv. 2004 à 17:49
Salut,
le pb dans tes import :
import dev.test;
et non pas dev.test.*;
by
0
RE,

j'ai fait la correction mais j'ai toujours la même erreur ???!!! Tu comprends pourquoi je fais appel au forum, je veux garder un maximum de cheveux lol.

Merci de ton aide,


Vincent B
0
Salut Vincent,
si ton conteneur de servlet ne trouve pas cette classe, tu as peut-être un pb de classpath.
Peux-tu nous en dire un peu plus sur ton environnement.
puce
0
Salut Puce,

ma classe est dans c:\dev\perso.
monfichier JAR est ajouté dans le classpath sous JCreator
dans le fichier JAR le chemin est bien indiqué (c:\dev\perso)
j'utilise JSWDK comme moteur de servlet
je n'ai pas essayé avec Tomcat qui est aussi installé sur mon PC portable.
Mon OS est Windows 98SE.

Voilà pour mon environnement de travail, s'il te manque des infos. Si tu as un exemple simple et complet à me proposer pour la création du package et son utilisation je suis preneur , en l'étudiant j'aurais peut-être le déclic qui me manque.

En attendant j'ai intégré directement les méthodes dans la servlet et ca marche, mais le problème n'est toujours pas réglé et j'ai vraiment besoin de créer des packages pour la suite.


Merci de ton aide,

amicalement,


Vincent B
0
Re,
alors, si ta classe est dans dev/perso, c'est que ton package doit s'appeler dev.perso
Donc dans tes import :
import dev.perso.test;

et la première ligne de ta classe doit être :
package dev.perso;

Je ne suis pas familière de JSWK, j'utilise exclusivement Tomcat (sous linux).
Sous tomcat, il faut mettre les servlets de l'appli dans le WEB-INF/classes et les packages dans le WEB-INF/lib, mais tu sais surement déjà ça.

puce
0
Re re,

J'ai tout passé dans Tomcat, mais j'ai dû me mélanger dans tous les répertoires existants.



A la base, j'ai un fichier HTML ( en attendant une page JSP) dont l'adresse est : http://localhost:8080/examples/monfichier.html

dans ce fichier j'ai un formulaire qui appel ma servlet, l'adresse est : http://localhost:8080/examples/WEB-INF/classes/maservlet

Pour l'ordinateur, il ne connait pas la ressource à cette adresse.

mon fichier JAR contenant le package est à l'adresse suivante :
http://localhost:8080/examples/WEB-INF/lib/monpackage. Est-ce que je risque le même type d'erreur par la suite.

En résumé, il faut que je connaisse vraiment l'organisation dans Tomcat, si tu pouvais me donner un coup de main, à défaut un coup de pouce ( lol ).

Merci pour tout,

Vincent B
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Alors, c'est parti pour le cour de Tomcat.
Tout d'abord, tu as quoi comme version, catalina ou tomcat3, parce que c'est pas le même comportement?

l'organisation générale d'une appli sous tomcat est la suivante : (disont qu'elle est dans le répertoire examples)
les fichiers HTML et JSP dans examples/
la partie servlet dans examples/WEB-INF, avec les packages dans examples/WEB-INF/lib, les servlets dans examples/WEB-INF/classes
Ensuite tu doit avoir dans ce répertoire WEB-INF un fichier web.xml dans le quel tu décrit comment le conteneur (tomcat) va trouver ton servlet. Voici un exemple simple qui devrait marcher dans ton cas:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>leNomDuServlet</servlet-name>
<servlet-class>leNomDeLaClasse</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>leNomDuServlet</servlet-name>
<url-pattern>/servlet/leNomDuServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>EscompteServlet</servlet-name>
<url-pattern>/servlet/leNomDuServlet/*</url-pattern>
</servlet-mapping>
</web-app>
C'est très important de suivre cela.
Si tu écrit ton web.xml de cette façon, ta JSP doit appeler le servlet vi l'url suvante :
http://localhost:8080/examples/servlet/leNomDuServlet

Tu ne met jamais le chemin exact (WEB-INF/classes/blablabla).

Ensuite, il faut déployer ton appli dans tomcat. Pour catalina (tomcat4 et+), tu va dans le tomcat manager (http://localhost:8080/manager/html), dans "Install directory or war file located on server" tu peux installer directement ton appli.
Pour tomcat3 c'est plus compliquer, elors je referai une bafouille si c'est le conteneur que tu as.

reste plus qu'à tester.

Chose importante : les logs sont dans chemin_to_tomcat/logs
autre chose importante : dans le manager, tu peux stopper, relancer, supprimer un appli. ATTENTION si tu supprime une appli, toutes l'arborescence disparait!!!! Mieux vaut avoir une copie de tout dans un répertoire à part consacré au développement et déployer tes appli via un fichier war directement avec le tomcat manager, il cré alors automatiquement le répertoire racine et tout ce qui va avec.

Voilà, j'espère que c'est pas trop d'un seul coup à avaler.
N'hésite pas à poser d'autres questions, vu que mon blabla doit pas être d'une grande clareté.

puce
0
Bonjour puce,

j'ai fait bingo hier soir avec ton cours sur Tomcat, merci beaucoup de ton aide. J'ai encore quelques petites questions : dans le manager quand rempli-t-on path et url , pour war il suffit de mettre le fichier, pour installer l'application. Je n'ai rien fait à ce niveau et ca marche quand même. J'ai dû modifier quelque peu le fichier web.xml, car il n'acceptait pas le code suivant :

<servlet-mapping>
<servlet-name>EscompteServlet</servlet-name>
<url-pattern>/servlet/leNomDuServlet/*</url-pattern>
</servlet-mapping>


Par ailleurs, j'utilise EasyPHP et j'aimerai récupérer MySQL sur Tomcat. Je sais qu'il existe un module pour faire la liaison entre les deux serveurs mais quand je tape l'adresse je n'arrive pas à trouver le fichier exacte à télécharger.


Amicalement,

Vincent B
0
Salut Vincent,
je suis bien contente que tu ai finalement pu t'en sortir.
Pour tes autres questions, je suis moins à l'aise.
Pour le tomcat manager, j'avoue que je n'ai jamais vraiment utilisé path et url, je déploie toujours mes applis sous fichiers war. En fait, je crois que si ton appli est dans le répertoire reconnu comme le "webapps" par tomcat, il suffit qu'elles aient un web.xml et tomcat les reconnait. URL et Path, ça doit être lorsqu'elles sont dans un autre repertoire que le "webapps"?????
Ensuite, je connais pas grand chose de MySQL. Moi j'utilise postgresql sous linux. Pour faire communiquer mes servlets ou jsp avec le SGBD, j'utilse le driver JDBC livré avec postgreSQL. Le driver (posgresql.jar), je le met dans le WEB-INF/lib de mes applis.
Je pense que ça doit marcher pareil pour MySQL. Il te suffit de récupérer le driver (google : "jdbc driver mysql" doit t'y ammener tout droit), et de le mettre dans le path de tes applis. Après, c'est du code jdbc, je peux te filer des exemples de code si tu veux. A peu près tout ce que tu as besoin de connaitre, c'est le port sur lequel écoute ton sgbd.
Voilà, tu va bientôt en savoir autant que moi sur le sujet.
bon java,
puce
0
Salut puce,

je vais tester ce soir pour MySQL, j'ai déjà le driver, je vais le copier comme tu me la dis, je vais déplacer toute l'arborescence sur Tomcat en même temps de manière à y acéder par ..repappli\mysql\ et je te tiendrai au courant.

Pour des exemples de code jdbc je suis preneur. Je suis stagiaire AFPA en developpement informatique ( correspond au BTS Informatique de gestion option developpement ), et on nous incite à aller la pêche soi-même. De plus on ne voit pas les liaison ODBC and Co. On est passé trop rapidement sur JAVA, alors je fais mes propres expériences. D'autant que je trouve la programmation JAVA, et d'une manière générale la programmation objet, beaucoup plus intéressante.


Bonne après-midi,

Vincent B

en informatique ce n'est pas les grands sauts qui font avancer c'est l'accumulation de sauts de puce qui font les joies de l'informatique. ( lol) N'est-ce pas puce ?
0
Salut Vincent,
voici un exemple que je crois simple pour te donner un aperçu de jdbc (attention, je n'ai pas testé, et ce n'est pas nom plus parole d'évangile)
D'abord une classe générique pour se connecter :

import java.sql.*;

public class AccessToDB
{
Connection dbConnection;
PreparedStatement stmt;
static String dbDriver="org.mysql.Driver"; //le nom du driver jdbc, a verifier
static String dbURL="jdbc:mysql://localhost:3306/mabase";
static String userID="nomUser";
static String passwd="passUser";

//connection to db
public boolean connect()
{
try
{
Class.forName(dbDriver);
dbConnection = DriverManager.getConnection(dbURL,userID,passwd);
}
catch(Exception e)
{
log(e);
}
if (dbConnection==null) return false;
return true;
}

//pour un INSERT ou un UPDATE ou un DELETE
public synchronized boolean insertQuery (String dbQuery) throws SQLException
{
boolean status = false;
stmt = dbConnection.prepareStatement(query);

int nbInsert = stmt.executeUpdate(dbQuery);
if (nbInsert == 0)
{
log("Pb insertion");
status = false;
}
else
{
// all ok
status = true;
}

stmt.close();

return status;
}

//pour un SELECT
public synchronized ResultSet executeQuery(String query) throws SQLException
{
stmt = dbConnection.prepareStatement(query);
ResultSet rs=stmt.executeQuery();
return rs;
}

//deconnection
public static void cleanUp()
{
try
{
log("Closing database connection");
dbConnection.close();
}
catch (SQLException e)
{
log(e);
}
}


// Simple method for logging messages to console.
protected void log(Object msg) { System.out.println(msg); }
}

Une classe classe qui utilise la classe précédente :

/* un exemple simple d'utilisation de ta classe AccessDB */

import java.sql.ResultSet;

public class Utilisation
{
static String dbDriver="org.mysql.Driver"; //le nom du driver jdbc, à vérifier
static String dbURL="jdbc:mysql://localhost:3306/mabase";
static String userID="nomUser";
static String passwd="passUser";


public static void main (String [] args)
{
AccessBD access=new AccessBD();
String query="select nom, prenom, age, email from personne";
if (access.connect(dbDriver,dbURL,userID,passwd))
{
ResultSet rs=access.executeQuery(query);
while rs.next()
{
String nom=rs.getString("nom");//recupre la String contenue dans la colonne portant le nom "nom"
String prenom=rs.getString("prenom");
int age=rs.getInt("age");
String mel=rs.getString("email");
System.out.println(nom+"\t"+prenom+"\t"+age+"\t"+mel);
}
}
else System.out.println("pb de connection");
}
}

Ensuite, pour la doc java online (où il y a aussi les classes jdbc bien sure) :
http://java.sun.com/j2se/1.4.2/docs/api/

N'hesite pas à poser des questions quand tu aura fait quelques essais.
puce


>>l'accumulation de sauts de puce qui font les joies de l'informatique.
Les sauts de puce de certains on souvent l'air de pas de géant pour d'autres ;-)
0
Bonjour Puce,

Pour ma connexion à la base de données, je ne peux le faire qu'à travers la création d'un DNS, ce qui réduit à néant la portabilité alors même que c'est du Java.

Par ailleurs, comment intègres-tu PostgreSQL à Tomcat ? Si j'ai bien compris le fonctionnement de Tomcat, il faudrait :

1 installer la base de données ( MySQL dans mon cas )
2 créer un fichier war
3 déployer l'application à partir de l'administrateur Tomcat
4 modifier web.xml ou tout autre fichier de configuration.

Merci de continuer à éclairer ma lanterne (lol),

Amicalement,

Vincent B.
0
puce31 Messages postés 8 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 13 janvier 2004
9 janv. 2004 à 09:24
Salut Vincent,

Postgres n'est pas intégré à Tomcat, ni à Apache, ni à un autre serveur. C'est un serveur de BD indépendant, comme doivent l'être tous les SGBD (et donc mySQL).

En fait, toutes les applis doivent pouvoir attaquer les SGBD, pas seulement les servlets. On a aussi des sites en PHP, des appli locales en C et Java, des srcipts perl, et tout le tralala. Imagine ce que ça serait si on devait avoir une installation de Postgres, avec toutes nos bases de données, par type d'appli.
Retiens donc bien ceci : LE SGBD EST INDEPENDANT de tomcat et apache.
Bon, s'est vrai qu'avec EasyPHP, c'est tellement clickodrome à la windobe, qu'on voit pas bien comment ça fonctionne derrière. Quand tu demarre EasyPHP, tu démarre tout en même temps. Ca veut pas dire que tu ne peux pas attaqué ton SGBD autrement que via Apache et PHP.

Les servlets (et toutes les autres appli java) communiquent avec le SGBD via le driver JDBC, comme je te l'ai dit précedemment.
Il faut donc qu'ils sachent où trouver le driver (donc je le met dans le WEB-INF/lib), et où trouver le SGBD (URL, port, nom de la base, user, passwd).
Ca n'est pas plus compliqué que cela.
J'ai fait un petit google pour toi :
http://tecfa.unige.ch/guides/java/staf2x/ex/jdbc/coffee-break/
y'a des exemples de connection à une bd mySQL écrit en java.

Pour ton histoire de DNS, je vois pas le rapport ???? Ta machine, ou celle qui accueil le SGBD, n'est pas nommée? Je comprend pas ce que tu veux dire.

Si c'est toujours pas clair, n'hésite pas.

puce
0
Salut Puce,

T'es la meilleure, avec tes indications j'ai compris l'erreur que je faisais. En fait au lieu d'utiliser une connexion jdbc et mysql, je faisais une connexion odbc mysql, ce qui nécessitait le fameux DNS. Par conséquent, je faisais une erreur de programmation sans m'en rendre compte. Maintenant, j'ai le bon driver que j'ai mis dans le classpath, et la bonne syntaxe qui me permet d'utiliser n'importe quelle base de données.

Pour configurer un contexte de servlet avec Tomcat, il faut modifier le fichier web.xml, où il y a autrechose à faire. J'ai déjà le package où se trouve les classes, mais j'ai lu qu'il fallait une configuration spécifique pour le contexte de servlet.

Merci pour tout,

Vincent B

A Genève, il y a deux jets d'eau : celui que les gens voient, en passant devant les gens disent oh ! donc nous avons un nouveau jet d'oh !
0
puce31 Messages postés 8 Date d'inscription jeudi 8 janvier 2004 Statut Membre Dernière intervention 13 janvier 2004
12 janv. 2004 à 10:24
Salut Vincent,
contente de voir que mes explications ne sont pas aussi vaseuses qu'elles n'en ont l'air.
Pour ajouter un servlet context à tomcat, c'est bien de web.xml.
Il faut donc un fichier web.xml par appli.
Si tu as plusieurs servlet dans une même appli, tu ajoute, dans le même web.xml, autant de lignes <servlet><servlet-name>...</servlet-name><servlet-class>...</servlet-class></servlet>
que tu as de servlet (idem pour les servlet-mapping).
Pour les jars des classpath, tout dans WEB-INF/lib.
Rien de plus dont je sois au courant.
puce
0