Bonjour à tous,
J'aimerai un petit éclaircissement de votre part:
Voici la méthode sur laquelle j'ai un soucis
private static void afficher( Connex connect ) {
ArrayList<Monnaie> result;
try {
result = connect.afficher();
for( Monnaie monnaie : result) {
System.out.println("Devise: "+monnaie.name+"\tValeur: "+monnaie.taux);
La classe monnaie associée :
import java.io.Serializable;
public class Monnaie implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5292042252928489543L;
String name;
float taux;
public Monnaie() {
this.name = "";
this.taux = (float)0.0;
}
public Monnaie( String nom, float t ) {
this.name = nom;
this.taux = t;
}
}
Mon intérrogation se pose sur la condition dans le for : for( Monnaie monnaie : result) quelqu'un pourrait me dire à quoi elle correspond?
Merci d'avance
mathyass
| Citation : quelqu'un pourrait me dire à quoi elle correspond? |
En java, a priori, rien.
ça compile ce machin?
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
oui sa compile et sa fonctionne très bien y a pas tout le systeme client serveur ici car je voulai juste savoir a quoi correspond cette condition dans le for si quelqu'un pouvai m 'aider
Bon, je suis allé vérifier tout ça, et effectivement, il existe ce for (que je ne connaissais pas pour le Java
).
http://java.sun.com/docs/books/tut [...] s/for.html
Dans les spécifications du langage c'est le "enhanced for" (au chapitre 14.14.2):
http://java.sun.com/docs/books/jls [...] ments.html
Donc, dans ton cas, ça boucle sur les éléments de la liste "result", et dans la boucle, l'élément courant est dans la variable "monnaie" de type "Monnaie".
Message édité par CRicky le 12-07-2008 à 14:18:30
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Merci j'ai compris mais en fait on peut utiliser cette boucle à sa place?
{
int p = 0;
Iterator<Monnaie> i = result.iterator();
while (i.hasNext())
{
System.out.println("Devise: "+monnaie.name+"\tValeur: "+monnaie.taux);
p++;
}
En tout cas merci j'ai compris cette boucle.
je vais ne profiter puisque tu as été capable de m'aider
Je fait une connexion client serveur base de donnée oracle avec rmi et jdbc
J'ai cette erreur quand je connecte le client (serveur rmiregistry)
Exception in thread "main" java.lang.NoSuchMethodError: stub class initialization failed
at Conneximp_Stub.<clinit>(Unknown Source)
at sun.misc.Unsafe.ensureClassInitialized(Native Method)
at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(Unknown Source)
at sun.reflect.ReflectionFactory.newFieldAccessor(Unknown Source)
at java.lang.reflect.Field.acquireFieldAccessor(Unknown Source)
at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
at java.lang.reflect.Field.getLong(Unknown Source)
at java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source)
at java.io.ObjectStreamClass.access$700(Unknown Source)
at java.io.ObjectStreamClass$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(Unknown Source)
at java.io.ObjectStreamClass.lookup(Unknown Source)
at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at Client.main(Client.java:48)
merci d'avance
(si besoin je met le code)
Qu'est-ce que tu as en ligne 48 de Client.java ? une instanciation d'objet de type Connex ?
est-ce que tu as bien défini le ou les constructeurs ?
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Je te met le code (c est le client)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.ArrayList;
public class Client {
private static void afficher(Connex terface) throws RemoteException {
ArrayList<Monnaie> result;
try{
result = terface.afficher();
for (Monnaie monnaie : result) {System.out.println("devise : "+monnaie.nom+" Valeur : "+monnaie.taux);}
}
catch (Exception e){e.printStackTrace();}
}
public static void main (String args[]){
String nom;
BufferedReader clavier = new BufferedReader(new InputStreamReader(System.in));
String nom_externe = "//m117/Connex";
System.out.println("bon on y va" );
Connex terface;
try{
terface = (Connex) Naming.lookup (nom_externe);
Integer Menu;
Boolean continuer = true;
while (continuer)
{
System.out.println("1 Afficher la table" );
System.out.println("2 Ajouter valeur" );
System.out.println("3 Modifier valeur" );
System.out.println("4 Supprimer valeur" );
System.out.println("5 Quitter" );
Menu = Integer.parseInt(clavier.readLine());
switch (Menu) {
case 1 :
afficher (terface);
break;
case 2 :
System.out.println("nom de la monnaie?" );
nom = clavier.readLine();
System.out.print("Entrez la valeur:" );
if(terface.ajoute(new Monnaie(nom,Float.parseFloat(clavier.readLine())))==0)
{ System.out.println("Monnaie ajoutée" );}
else {System.out.println("sa a merdé" );}
break;
case 3 :
System.out.println ("nom de la valuer à modifier" );
nom = clavier.readLine();
System.out.println("Entre le nouveau taux" );
if (terface.modifie(new Monnaie(nom,Float.parseFloat(clavier.readLine())))==0)
{System.out.println("Monnaie modifiée" );}
else {System.out.println("sa a merde" );}
break;
case 4 :
System.out.println ("nom de la valeur a supprimer" );
nom = clavier.readLine();
if (terface.supprime(new Monnaie(nom,0))==0)
{System.out.println("c fait" );}
else {System.out.println("relou" );}
break;
case 5:
System.out.println("ciao" );
continuer = false;
break;
default:
}
}
}
catch (Exception e) {e.printStackTrace();};
}
}
Et la classe Connex, elle sort d'où ? comment est-elle déclarée ?
Ton erreur est là:
Code :
|
la conversion du Remote en Connex
Message édité par CRicky le 12-07-2008 à 19:24:47
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
Connex est l'interface qui est implémentée par la classe du serveur du rmi quoi
import java.io.*;
import java.rmi.*;
import java.util.ArrayList;
public interface Connex extends Remote {
ArrayList<Monnaie> afficher() throws RemoteException;
int ajoute(Monnaie monnaie) throws RemoteException;
int modifie (Monnaie monnaie) throws RemoteException;
int supprime (Monnaie monnaie) throws RemoteException;
}
Il ne faut pas mettre un rmi:// devant le nom de l'objet ?
Comment as-tu fais le bind côté serveur ? et comment as-tu implémenté l'interface Connex côté serveur ?
As-tu mis en place le registre RMI ?
Message édité par CRicky le 13-07-2008 à 15:36:40
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
J'ai déjà fait des clients serveur sans mettre le rmi
SI je le met sa donne de nouvelles erreurs:
java.rmi.NotBoundException: rmi//m117/Connex
at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:106)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at Client.main(Client.java:49)
le serveur :
import java.io.*;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
import java.net.*;
import java.sql.*;
import java.util.ArrayList;
public class Conneximp extends UnicastRemoteObject implements Connex {
public Connection connexion;
public Statement stmt;
public Conneximp() throws RemoteException {
try{
Class.forName ("oracle.jdbc.driver.OracleDriver" );
connexion = DriverManager.getConnection("jdbc
racle:thin:@m117:1521:XE","system","oracle" );
this.stmt= connexion.createStatement();
System.out.println("Connecté à la base" );
}
catch (Exception e){ e.printStackTrace();}
}
public synchronized ArrayList<Monnaie> afficher() throws RemoteException {
ArrayList<Monnaie> monnaies = new ArrayList<Monnaie>();
try
{
System.out.println(InetAddress.getByName(getClientHost()).getHostName() + " afficher" );
String requete = "SELECT * FROM MONNAIE";
ResultSet result = stmt.executeQuery(requete);
while(result.next())
{monnaies.add(new Monnaie(result.getString(1),Float.parseFloat(result.getString(2))));
}
return monnaies;
}
catch (Exception e) {e.printStackTrace();
return null;}
}
public synchronized int ajoute (Monnaie monnaie) throws RemoteException {
try {
System.out.println(InetAddress.getByName(getClientHost()).getHostName() + "afficher" );
String requete = "INSERT INTO MONNAIE VALUES ('" + monnaie.nom + "','" + monnaie.taux.toString().replace(".","," ) + "')";
if (stmt.executeUpdate(requete)== 0) {
System.out.println("requete pas exécutée" );
return 1;}
}
catch (Exception e) {e.printStackTrace();
return 1;}
return 0;
}
public synchronized int modifier (Monnaie monnaie) throws RemoteException {
try
{
System.out.println(InetAddress.getByName(getClientHost()).getHostName() + "afficher" );
String requete = "UPDATE MONNAIE set VALEUR ('" + monnaie.taux.toString().replace(".","," )+ "' WHERE DEVISE = '" +monnaie.nom+ "')" ;
if (stmt.executeUpdate(requete)==0){
System.out.println("requete pas executée" );
return 1;}
}
catch (Exception e) {e.printStackTrace();
return 1;}
return 0;
}
public synchronized int supprimer (Monnaie monnaie) throws RemoteException {
try
{
System.out.println(InetAddress.getByName(getClientHost()).getHostName() + "afficher" );
String requete = "DELETE FROM MONNAIE WHERE DEVISE = '"+monnaie.nom+"' ";
if(stmt.executeUpdate(requete)==0){
System.out.println("requete pas executee" );
return 1;}
}
catch(Exception e)
{e.printStackTrace();
return 1;
}
return 0;
}
public static void main (String args[]){
try{
String nom_externe = "//m117/Connex";
Connex terface = new Conneximp();
Naming.rebind(nom_externe, terface);
System.out.println("c est parti" );
}
catch(Exception e){
e.printStackTrace();
System.out.println("arf" );
}
}
}
le rmi registry fonctionne le serveur compile c est a la compilation du client que les erreurs apparaissent
il manque le ":" quand tu mets rmi:// non ?
mais tu as raison c'est à la compilation le problème.
As-tu utilisé rmic pour générer le stub ?
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky
J'ai plutôt l'impression qu'il ne trouve pas la ressource en question.
Je n'ai pas épluché ton code qui vue de loin me semble dégueulasse ( désolé mais il me pique aux yeux ). Du pur jdbc ( => JPA ) , des sysout ( => log4j ) , naming convention pour les méthodes incompréhensibles ( afficher() qui retourne une liste ).
D'un point de vue jdbc , les prepareStatement rendrait un temps soit peu le code plus clair !
String requete = "UPDATE MONNAIE set VALEUR ('" + monnaie.taux.toString().replace(".","," )+ "' WHERE DEVISE = '" +monnaie.nom+ "')" ;
Heureusement qu'il n'y a pas du swing qui affiche tout cela, sinon on aurait des lignes de 400 caractères.
For(Monnaie monnaie : result){}
Ca fait légèrement du copier coller tout bête et méchant. Ne pas connaître la différence entre cette écriture et l'utilisation d'un Iterator prouve une très mauvaise connaissance du java.
Les objects de type Collection(List , ArrayList , etc ) implémente Iterator depuis java 1.5. Cette ajout permet notamment d'utiliser la boucle forEach et d'éviter d'écrire ce long code remplit de casting que Iterator impose.
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne et personne ne sais pourquoi...
Répondre à RiiMii
Bon alors RiiMii pour commencer sur ton post tu ne réponds pas à la question mais tu critiques tout simplement.
Mais je peux comprendre et je vais donc te répondre pour que tu comprennes ma démarche.
La boucle c'est effectivement du copier coller sinon j'aurai pas demandé ce qu'elle signifie...(salut j'ai fait un truc qui marche tu peux me l'expliquer?) et je ne connaissai les iterators mais pas cette écriture de for c est tout.
Au niveau du code j'ai pas très bien compris ta critique envers les requetes c'est tout simplement la méthode que j'ai trouvé partout pour utiliser jdbc(et même au niveau des Naming )
Maintenant peux-tu m'expliquer le problème avec la ressourse?
Je n'ai effectivement pas un niveau exellent en java mais j'essaye d'appronfondir certaines choses.J'en fait depuis peu et je m'y met sérieusement depuis très peu de temps. Croies tu que en faisant un post qui en clair dit :"ta boucle c est du copier coller, ton code c est de la merde tu y connais rien en java" c est constructif???
Salut mathyass ,
Une critique peut être négative comme positive.
Pour les prepareStatement , consulte cette faq : http://java.developpez.com/faq/jdb [...] dstatement.
Si tu veux aller plus loin dans ton apprentissage pour manipuler des données dans une base de donnée ( et même dans d'autre système structuré de donnée ) avec Hibernate => http://java.developpez.com/faq/hibernate/
Pour le naming convention, je trouve peu clair de voir une fonction nommée " Afficher() " qui retourne une liste de donnée. Il parrait plus clair et compréhensible pour celui qui lit le code de voir quelque chose du style " getMoney()" en insistant bien sur le fait que la présence du "get" devant le nom de la fonction dit que tu prends quelque chose.
D'ailleurs pour te citer d'autres bonnes habitudes ( qui sont bénéfiques pour la suite ) , je te conseillerai de déclarer première une interface pour chaque table ( on ne parle pas encore de notion de mapping vu que tu n'utilises pas hibernate ) dans laquelle on retrouvera 4 méthodes CRUD ( Create - Read - Update - Delete ) et ensuite une classe qui implémente ce crud ( que l'on peut généralisé avec l'utilisation des generics , mais n'allons pas trop vite ) .
L'interface :
Code :
|
L'implementation :
Code :
|
Tant qu'il y a moyen d'éviter les Iterators , il faut le faire. La nouvelle syntaxe du for permet de coder moins de ligne mais surtout d'utiliser un typage très fort , ce que tu as d'ailleurs déjà bien commencé vu que je vois que tu n'oublies pas de typer tes List.
Quand je dis qu'il ne semble pas trouver la ressource, c'est parce que ton erreur vient d'ici :
java.rmi.NotBoundException: rmi//m117/Connex
at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:106)
Ce qui me fait penser tout simplement que lorsque tu fais le lookup avec le " Name " que tu lui donnes , ce service n'existe pas du côté serveur.
Message édité par RiiMii le 15-07-2008 à 12:53:52
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne et personne ne sais pourquoi...
Répondre à RiiMii
Il y a 273 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
