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

Langage Java Discussion :

Appeler une méthode Java depuis javascript


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Appeler une méthode Java depuis javascript
    Bonjour,

    je présente mon petit problème:
    je dois créer une classe java qui doit exécuter un script (que je dois créer aussi). J'utilise le moteur JavaScript Rhino. je précise que ça fait partie d'un gros projet déjà existant.
    La classe java récupère une liste de pilotes. Après je parcoure la liste et pour chaque pilote je dois exécuter le script qui doit calculer le temps de vol de chaque pilote.
    Voici le code java:
    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
     
    for (Pilote pilote : piloteList) {
     
                ScriptEngineManager manager = new ScriptEngineManager();
                ScriptEngine engine = manager.getEngineByName("JavaScript");
                try {
                    engine.put("pilote", pilote);
                    engine.eval(new FileReader("ScriptHcv.js"));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (ScriptException e) {
                    e.printStackTrace();
                }
     
                Invocable inv = (Invocable) engine;
                try {
                    inv.invokeFunction("calculHcv", pilote);
                } catch (ScriptException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
     
            }
    Le script doit récupérer pour chaque pilote la liste des vols qu'il a effectués, la date de début et la date de fin du vol. les méthodes getListFlights, getFlightBeginDate et getFlightEndDate se trouvent dans d'autres classes du projet que j'importe dans mon script :importClass(....);

    Le script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function calculHcv(pilote){
    var listFlights = pilote.getListFlights();
     
    for (var flight in listFlights) {
    	var beginDate = flight.getFlightBeginDate();
    J'arrive à récupérer la liste des vols grâce à pilote.getListFlights(); mais j'ai une erreur quand j'appelle la méthode getFlightBeginDate et j'obtiens ce message d'erreur : Cannot find function getFlightBeginDate.
    Donc j'ai conclu que je ne peux utiliser les méthodes java que pour les objets que j'exporte dans mon code JavaScript grâce à la méthode put, sauf que je sais plus comment m'y prendre dans ce cas pour effectuer le traitement demandé dans le script.

    Sinon je précise aussi que j'ai pas de contraintes pour le choix du langage de script, donc si vous connaissez d'autres langages mieux adaptés à ce genre de traitement ça sera pas de refus

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    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 482
    Points : 48 807
    Points
    48 807
    Par défaut
    in peux voir la classe Flight?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    in peux voir la classe Flight?
    Ça ne contient que des getters et des setters.
    En fait j'ai codé une classe Java qui fait tout le traitement (sans utiliser de scripts) et ça a bien marché, sauf qu'on me demande maintenant de le faire avec un langage de script.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Quelques remarques pour commencer :
    • engine.put("pilote", pilote); est en trop puisqu'il défini la variable en globale. C'est inutile puisque tu le passe ensuite via l'appel de fonction...
    • Tu dois fermer explicitement le FileReader !
    • Pourquoi utiliser deux try/catch ? Si le premier bloc de code échoue inutile d'appeler la fonction via Invocable...


    Perso je pense que ton code devrait plutôt ressembler à ceci :
    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
    	ScriptEngineManager manager = new ScriptEngineManager();
    	for (Pilote pilote : piloteList) {
    		try {
    			ScriptEngine engine = manager.getEngineByName("JavaScript");
    			Reader reader = new FileReader("ScriptHcv.js");
    			try {
    				engine.eval(reader);
    			} finally {
    				reader.close();
    			}
    			Invocable inv = (Invocable) engine;
    			inv.invokeFunction("calculHcv", pilote);
    		} catch (...) {
    			...
    		}
    	}
    Et encore je ne sais pas pourquoi tu crées un moteur javascript pour chaque pilote. Sans raison précise je ne le ferais qu'une seule fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	ScriptEngineManager manager = new ScriptEngineManager();
    	ScriptEngine engine = manager.getEngineByName("JavaScript");
    	Reader reader = new FileReader("ScriptHcv.js");
    	try {
    		engine.eval(reader);
    	} finally {
    		reader.close();
    	}
    	Invocable inv = (Invocable) engine;
     
    	for (Pilote pilote : piloteList) {
    		inv.invokeFunction("calculHcv", pilote);
    	}

    Sinon ton problème vient du code javascript, et en particulier de la boucle :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    for (var flight in listFlights)
    La boucle for-each du JavaScript doit être utilisé avec un tableau JavaScript... Or là tu as un objet !
    Et avec un objet cette boucle renvoi la liste des propriétés de l'objet...

    Tu dois utiliser l'Iterator :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	for (var iter=listFlights.iterator(); iter.hasNext(); ) {
    		var flight  = iter.next() ;
    		var beginDate = flight.getFlightBeginDate();
    	}



    Citation Envoyé par zied_21 Voir le message
    sauf qu'on me demande maintenant de le faire avec un langage de script.
    Heu... Pourquoi ????



    a++

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci adiGuba pour ta réponse. Effectivement l'erreur provenait de ma boucle for.
    j'ai pris en compte tes remarques.
    Heu... Pourquoi ????
    Le script contient des règles de calcul des heures crédités vols, ces règles peuvent évoluer au cours du temps donc ça sera plus simple de les modifier sur un script (Enfin c'est ce qu'on m'a dit)

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

Discussions similaires

  1. Appel méthode java depuis javascript
    Par Dragna_x dans le forum Wicket
    Réponses: 2
    Dernier message: 24/06/2011, 14h35
  2. [JNI] appel d'une méthode java depuis le code natif
    Par myryad dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 19/05/2009, 11h23
  3. Réponses: 9
    Dernier message: 10/05/2007, 17h57
  4. comment appeler une fonction JAVA en JAVASCRIPT ?
    Par heleneh dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 13/09/2005, 12h21
  5. comment appeler une fonction JAVA en JAVASCRIPT ?
    Par heleneh dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/09/2005, 12h04

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