2011-01-09 12 views

Respuesta

17

No estoy seguro de lo que quiere decir con las API son diferentes. Java 6 tiene un motor de secuencias de comandos en el que uno de los motores disponibles es Rhino denotado por "js". Por lo tanto, la única diferencia entre el Mozilla Rhino ECMAScript incluido y el que puede obtener de su sitio web serán las diferencias entre las versiones. Creo que la versión incluida de Mozilla Rhino ECMAScript es 1.6 rev2.

Esto es similar a la forma en que funcionan las bibliotecas XML. Hay un "motor" que tiene una implementación predeterminada.

de uso Ejemplo de cliente

     ========== 
         | Client | 
         ========== 
          | 
      =============================== 
      |        | 
=========================   ============= 
| Java Scripting Engine |   | Rhino API | 
=========================   ============= 
      | 
     ================== 
     |    | 
============= =============  
| Rhino API | | Other API | 
============= ============= 

actualización

Sólo para responder a su pregunta un poco más, sí, el Java 6 secuencias de comandos del motor se encarga de contextos y otras operaciones de configuración que tiene que hacerlo manualmente si se usa Rhino directamente. Aquí hay un ejemplo del uso de los dos. Tenga en cuenta que cuando utiliza Java6 Scripting Engine, ocurren cosas similares debajo del capó. ScriptingEngine usado aquí NO TIENE que ser respaldado por Rhino. Podría tener una implementación de scriping personalizada.

public class Main { 

    static class Shell extends ScriptableObject { 

     @Override 
     public String getClassName() { 
      return "global"; 
     } 

     public static void print(Context cx, Scriptable thisObj, Object[] args, Function funObj) { 
      for (int i = 0; i < args.length; i++) { 
       String s = Context.toString(args[i]); 
       System.out.print(s); 
      } 
     } 
    } 

    public static void useJava6ScriptingEngine() throws Exception { 
     ScriptEngineManager mgr = new ScriptEngineManager(); 
     ScriptEngine jsEngine = mgr.getEngineByName("JavaScript"); 
     jsEngine.eval("print('Hello, world!')"); 
    } 

    public static void useRhinoDirectly() throws Exception { 
     Context context = Context.enter(); 
     try { 
      Shell shell = new Shell(); 
      String[] names = {"print"}; 
      shell.defineFunctionProperties(names, Shell.class, ScriptableObject.DONTENUM); 
      Scriptable scope = context.initStandardObjects(shell); 
      context.evaluateString(scope, "print('Hello, world!')", null, 0, null); 
     } finally { 
      Context.exit(); 
     } 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws Exception { 
     useJava6ScriptingEngine(); 
     useRhinoDirectly(); 
    } 
} 
+2

La diferencia en las API que los que me refiero es que el paquete de Mozilla Rhino utiliza una gran cantidad de manipulación explícita de contextos y ámbitos, sino de todos los ejemplos que he visto de la incorporada en implementación en Java 6, parece como si esos detalles fueran barridos en segundo plano para que no tenga que preocuparse por ellos. –

+0

@Jeremy Por lo que puedo decir, no los consideraría barridos bajo la alfombra. Tendrá que aprender cómo funciona ScriptEngine en Java 6. Como si dijera que Java 6 presenta un marco de Scripting Engine. El Mozilla Rhino ECMAScript tiene una implementación de ese motor de secuencias de comandos. Esto significa que Mozilla Rhino ECMAScript se reproduce dentro del contexto del marco de scripting de Java 6. Tiene dos opciones, usar la API de Rhino directamente, o aprender la nueva API del motor de Java 6 Scripting. –

Cuestiones relacionadas