RHINO

Introduction

Rhino est une implémentation open-source (MPL 1.1/GPL 2.0) de JavaScript écrit entièrement en Java. Cette implémentation est généralement utilisée coté serveur. A début Rhino a été conçu pour compiler le code JavaScript en code bytecode Java. Un mécanisme qui présente des performances qui rivalisent celles de Spider Monkey. Cependant, ce processus consomme beaucoup de temps pour la compilation du code, en plus le bytecode généré peut être cause de fuites mémoires. Un autre problème est dû au fait que la JVM limite la taille des méthodes à 64 KB, ce qui peut générer des exceptions si jamais la compilation du code JavaScript génère des méthodes dont les tailles dépassent cette limite. Ainsi, un nouveau mode a été développé : le mode interprété (script compilé en objets JavaScript). Avec ce mode, l’interprétation est plus rapide, mais l’exécution est plus lente. Le choix d’un mode ou de l’autre dépend des fonctionnalités du code.

Un peu de pratique

Rhino fait partie de la JDK 1.6 et ses successeurs. Pour la JDK 1.5 il faut télécharger et ajouter js.jar. Pour la JDK 1.4 il faut utiliser js-14.jar.

Rhino peut être utilisé en mode shell ou intégré dans une application. Le mode shell sert essentiellement à faire les tests (avec un déboggeur et un compilateur). Dans ce qui suit je présenterai comment intégrer Rhino dans une application java. Je rappelle que cette partie est à titre indicatif, d’autres possibilités et fonctionnalités restent à étudier.

La communication entre un objet java et l’interpréteur défini par l’implémentation Rhino se fait à travers un contexte d’exécution.

Contex context= new ContextFactory().enterContext() ;

Chaque interprétation a une porté. Le développeur doit définir la portée (scope) de l’interprétation.

Scriptable scope = context.initStandardObjects();

Scriptable scope = context.initStandardObjects(this); // ajoute l'objet lui-même au scope, l'objet doit étendre ScriptableObject.

Le scope permet de stocker les variables d’inter-échange entre la classe java et le code JavaScript:

<blockquote>

Scriptable jsArgs1 = context.toObject(request, scope);

scope.put("httpRequest", scope, jsArgs1);

On peut également définir des propriétés et des fonctions accessibles depuis le code JavaScript:

String[] names = { "readFile","loadSystem" };

defineFunctionProperties(names,  MyClass.class,  ScriptableObject.PERMANENT);

defineFunctionProperties introspecte la classe MyClass pour chercher les méthodes dont le nom est dans le tableau names et les ajouter comme propriétés. Dans JavaScript, il suffit d'appeler directement la méthode avec la liste des paramètres.

On peut aussi accéder a des variables et fonctions définies dans le code JavaScript.

Object fObj = scope.get("f", scope);

if (!(fObj instanceof Function)) {

System.out.println("f is undefined or not a function.");

} else {

Object functionArgs[] = { "my arg" };

Function f = (Function)fObj;

Object result = f.call(context, scope, scope, functionArgs);

String report = "f('my args') = " + context.toString(result);

System.out.println(report);

}

A noter

  • Savoir utiliser le mode compilé et le mode interprété (paramétrage de l’optimiseur, par défaut le mode est interprété).
  • Pas de fonctionnalités de manipulation de DOM (quelques implémentation et tentatives env-js).
  • Supporte JSON, E4X.

Un exemple plus détaillé

Dans cet exemple, on met l'accent sur les principaux aspects et fonctionnalités de RHINO. Il résume les principales étapes pour créer un projet RHINO et le faire tourner dans une application web.

L'exemple est consultable ici.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.