最近在看js的书,书上有介绍两个服务端js,以前只听说过node.js,第一次听说Rhino.js,并且已经集成到了jdk1.6;看来还是见的少啊!

Rhino是一种用Java编写的javaScript解释器,能自动完成JavaScript原生类型到Java原生类型之间的相互转换,有了它,可以通过JavaScript脚本设置。查询Java属性,并调用java方法;

先上学习的代码:

package com.my.rhino;

import java.io.FileReader;
import java.util.List;

import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class RhinoDemo {

    public static void main(String[] args) {
        // create ScriptEngineManager
        ScriptEngineManager manager = new ScriptEngineManager();

        ScriptEngine engine = manager.getEngineByName("js");
        String script = "print ('hello nm')";
        try {
            engine.eval(script);
            System.out.println();
        } catch (ScriptException e) {
            e.printStackTrace();
        }

        try {
            Double hour = (Double) engine.eval("var date = new Date(); date.getHours();");
            String msg;
            if (hour < 10) {
                msg = "Good morning";
            } else if (hour < 16) {
                msg = "Good afternoon";
            } else if (hour < 20) {
                msg = "Good evening";
            } else {
                msg = "Good night";
            }
            System.out.println(hour);
            System.out.println(msg);
        } catch (ScriptException e) {
            System.err.println(e);
        }

        try {
            FileReader reader = new FileReader("src/com/my/rhino/file.js");
            Double num = (Double) engine.eval(reader);
            System.out.println(num);
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            engine.put("a", 1);
            engine.put("b", 5);

            Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
            Object a = bindings.get("a");
            Object b = bindings.get("b");
            System.out.println("a = " + a);
            System.out.println("b = " + b);

            FileReader reader = new FileReader("src/com/my/rhino/vars.js");
            Double num = (Double) engine.eval(reader);
            System.out.println(num);
            reader.close();

            reader = new FileReader("src/com/my/rhino/fun.js");
            // engine.eval("function add (a, b) {c = a + b; return c; }");
            engine.eval(reader);
            Invocable jsInvoke = (Invocable) engine;

            Object result1 = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });
            System.out.println(result1);

            Adder adder = jsInvoke.getInterface(Adder.class);
            int result2 = adder.add(10, 5);
            System.out.println(result2);

            Compilable jsCompile = (Compilable) engine;
            CompiledScript vscript = jsCompile.compile("function hi () {print ('ddddd !'); }; hi ();");

            for (int i = 0; i < 5; i++) {
                vscript.eval();
            }

        } catch (Exception e) {
            // TODO: handle exception
        }

        try {
            FileReader reader = new FileReader("src/com/my/rhino/java.js");
            @SuppressWarnings("unchecked")
            List<String> num = (List<String>) engine.eval(reader);
            System.out.println();
            for (String word : num) {
                System.out.print(word);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        List<ScriptEngineFactory> factoryList = manager.getEngineFactories();
        for (ScriptEngineFactory factory : factoryList) {
            System.out.println("=====");
            System.out.println(factory.getEngineName());
            System.out.println(factory.getEngineVersion());
            System.out.println(factory.getLanguageName());
            System.out.println(factory.getLanguageVersion());
            System.out.println(factory.getExtensions());
            System.out.println(factory.getMimeTypes());
            System.out.println(factory.getNames());
        }
    }
}
Rhino.java

相关文章: