Rhino: Javascript for Java

rhino50

好几天没更新了,过去的一周里忙着补作业(一个学期根本没上课,自然作业也就……),半夜送室友去120(室友哮喘发作),下周则要开始考试,整个人也有点疲劳也没时间顾及这儿 orz

那么今次要介绍的东西是Mozilla旗下的一个名为Rhino的项目,纯Java实现的Javascript解释器,很适合希望在自己的Java程序中内嵌Scripting功能的同学。当然了,也可以用它在J2EE中实现用Javascript作为后台语言的功能。

官方网站为:http://www.mozilla.org/rhino/

PS: Mozilla旗下还有一个更知名的C写的Spider Monkey,被广泛应用于Mozilla的产品中,比如Firefox的Javascript引擎就是它,官方网站为:http://www.mozilla.org/js/spidermonkey/

下面是一个简单的执行js文件的示例代码。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
 
public class RhinoTest
{
    public static void main(String[] args)
    {
        /* 创建一个Javascript的上下文环境,用来存储Javascript的环境信息 */
        Context cx = Context.enter();
        try {
            /* 初始化Javascript标准对象(例如Object, Function, Array等) */
            Scriptable scope = cx.initStandardObjects();
 
            /* 读取一个.js文件 */
            String script = "";
            File file = null;
            if(args.length > 0)
            {
                file = new File(args[0]);  // 如果有参数,则读入第一个参数中指定的js文件
            }
            else
            {
                file = new File("script.js"); // 如果没有参数,则读入script.js
            }
            BufferedReader in = new BufferedReader(new FileReader(file));
            String s = "";
            while((s = in.readLine()) != null)
            {
                script += s + "\n";
            }
 
            /* 执行代码 */
            cx.evaluateString(scope, script, "[" + file.getName() + "]", 1, null);
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        finally
        {
            Context.exit();
        }
    }
}

测试用的script.js文件:

var lang = new JavaImporter();
lang.importPackage(java.lang);
lang.System.out.println("Hello, World!~");
 
var swing = new JavaImporter();
swing.importPackage(javax.swing);
with(swing)
{
	var frame = new JFrame("Swing Application");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	var button = new JButton("Hello, Rhino!");
	button.addActionListener(function() {
		lang.System.out.println("This is a text from swing button");
	});
 
	frame.add(button);
	frame.pack();
	frame.setResizable(false);
	frame.setVisible(true);
}

8 Responses

  • 清水の银月 says:

    世界上不会的东西太多了啊= =

  • lanslort says:

    终于不用在JSP里一行一行写out.println了么,泪目

  • Mac says:

    嘛,不想写out.println的方法很多啊,比如说~Jython, JRuby或者甚至用Quercus运行PHP~

  • 大头 says:

    用Java解释js么?那个js文件中看来是Java和js混合了- -?
    话说JSP中不推荐也不需要使用out.println,js代码直接嵌在head中吧…
    另外js某些时候貌似不能取代服务器端的验证,不如验证用户名是否已经存在…

  • Mac says:

    Javascript的功能取决于它是什么宿主,在浏览器中,Javascript确实只能做做一些界面特效,响应一下用户点击,调用一下AJAX,但那是因为浏览器本身的Javascript宿主只提供这些功能。如果在ASP中,Javascript也可以用来作为服务器端语言,在Windows Script Host里面,Javascript又可以干类似于bat或者Shell脚本类似的事情,而Rhino可以让开发者在JEE中干类似ASP那样用Javascript来写的事情,但个人认为它最主要的应用领域应该还只是单纯的给Java应用增加脚本功能(例如:游戏)

  • zwxclear says:

    最近完全忙在作业里的人来一句:长期欠作业最后是很痛苦的wwwww

    至于文章内容,最近有时间翻php的官方文档看,权当作消遣了

  • Mac says:

    话说我虽然拖欠作业不少但是结果还是蒙混过去大半就是了……影像这种东西造假起来果然很容易,嗯(拖……

    嘛,光看文档不让写代码的话是很痛苦的……(话说怎么变成提到PHP了?……

  • 猎兔搜索 says:

    我们正在找人做动态网页解析.联系email/msn:lgjut@sina.com

Leave a Comment

(Necessary)

(Necessary, will not be published)

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.