欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  资讯频道

推荐Steve Yegge:Rhino on Rails在服务器端JVM中运行JavaScript

程序员文章站 2022-03-03 11:56:36
...
Steve Yegge在google I/O大会上发表了演讲:Rhino on Rails -- Server-side JavaScript on the Java Virtual Machine。

使用Rhino能够用JavaScript完成Java在server端完成的所有工作!

推荐Steve Yegge:Rhino on Rails在服务器端JVM中运行JavaScript

什么是Rhino?

1。用JavaScript实现Java JavaScript implemented in Java!

2。替代Java的解决方案 Drop-in alternative to Java

3。不需要web浏览器环境,没有DOM,没有CSS Not a web-browser environment: no DOM, no CSS

4。只有一种言语的开发,没有浏览器的不一致 Just one language: no browser inconsistencies!

Rhino和Java关系一览 Rhino and Java: a high-level overview

推荐Steve Yegge:Rhino on Rails在服务器端JVM中运行JavaScript

1。Java源代码编译为Java字节码

2。Rhino JavaScript源代码也能编译为Java字节码

3。网络效果:Rhino能够做到所有Java能做到的


谁在开发Rhino? 谁在使用它?


很多人在使用Rhino,值得注意的是

1.Googler Norris Boyd,是Rhino的原始作者,现在的维护者

2.BEA加入了E4X(支持XML的JavaScript)实现.

3.Rhino捆绑进入了Java 6!

4.官方的Java开发工具

5.JavaScript终于变成了写Java的Script推荐Steve Yegge:Rhino on Rails在服务器端JVM中运行JavaScript

为什么要在服务器端使用JavaScript呢?

1。快速原型,并迅速开发:不需要编译,写出代码,马上看到效果,不需要重启;描述功能,然后用Java重写关键地方。

2。功能:
1)支持JavaScript 1.5, 1.6, 1.7 and soon 1.8
2)E4X: Embedded XML
3)函数式编程:通过抽象和组件实现安全性
4)方便:运行派遣,申明式编程

3。Unit Testing
1)最简单的方式创建mock对象
2)不再需要对测试重构

4。代码大小:同样的系统,只需要五分之一至十分之一的代码

工具

调试:内置的命令行调试,提供API
console控制:强大的shell命令
Profiler:通过ContextFactory提供支持
Editors/IDEs支持:
1)IntelliJ:强大的插件支持
2)Aptana: another strong IDE
3)Emacs: js2-mode.el
编译:能够被编译成.class文件
目前Java-JavaScript-Ajax调试暂时还不支持

什么时候你需要使用Rhino?

1。当速度和性能比其他东西更加重要:Rhino提供强大的计算能力,没有I/O限制,比如没有数据库

2。为其他java使用者提供一个库:能够更简单使用java,Rhino适应Scripting和应用逻辑

3。你希望使用其他JVM语言


调用Java代码:

1。能够导入任何java class到JavaScript namespace
2。Java静态函数象JavaScript函数一样使用
3。能调用任何java class,通过new操作
js> new java.util.Date();
Tue May 13 16:13:43 PDT 2008


importClass(Packages.junit.framework.Assert);
var assertTrue = Assert.assertTrue;
var assertFalse = Assert.assertFalse;
var assertEquals = Assert.assertEquals;
function assertIntEquals(msg, x, y) {
  assertEquals(msg, new java.lang.Integer(x), new java.lang.Integer(y));
}

var MyTests = {
   testBasic: function() {
     assertEquals(“foobar”, “foo” + “bar”, “concatenation broken!”);
     assertIntEquals(4, 2 + 2, “addition broken!”);
   },
};


使用Java classes和Interfaces

js> var t = new Thread(new Runnable() {
      run: function() { print('hello!') }});
js> t.start()hello!

js> obj = {run: function() { print('hi') }}
[object Object]
js> new Thread(new Runnable(obj)).start()hi


JavaAdapter 能够创建 “subclass” of a Java class


js> var obj = {speak: function() { print("Rhino rocks!") }}
js> obj.run = function() { this.speak(); }
js> var foo = new JavaAdapter(java.lang.Thread, obj);
js> foo.start()Rhino rocks!


Calling Rhino/JavaScript from Java

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;

public class RhinoDemo {
   public static void main(String[] args) {
    Context cx = Context.enter();
    Scriptable scope = cx.initStandardObjects();
    // var foo = {a: "hello"}
    Scriptable foo = cx.newObject(scope);
    foo.put("a", foo, "hello");
    scope.put("foo", scope, foo);
    // fetch and print foo: prints ({a:"hello"})
    Object result = cx.evaluateString( scope, // our global scope 
      "foo.toSource()",  // js code to evaluate
             "", 1, null);      // script name, lineno, security
    System.out.println(cx.jsToJava(result, String.class));
    Context.exit();
  }
}

使用Rhino的Java层来扩展JavaScript

function defineBuiltin(target, name, value) {
  var ScriptableObject =
     Packages.org.mozilla.javascript.ScriptableObject;
  ScriptableObject.defineProperty(target, name, value,
     ScriptableObject.DONTENUM);
}

defineBuiltin(Function.prototype, 'bind', function(obj) {
  var _method = this, _args = slice(arguments, 1); // curry args
    return function() {
    // this 'arguments' is different from the one above
    return _method.apply(obj, _args.concat(Array.from(arguments)));
  };
});


推荐Steve Yegge:Rhino on Rails在服务器端JVM中运行JavaScript

Rhino有两个代码路径,interpreter and compiler

Script 运行实现JavaScript方式:
    * Built-in objects
    * Ecma algorithms
    * Java/JavaScript bridge
    * E4X engine
    * RegExp engine
    * Security engine
    * Debugger interface
    * Programmer APIs

去Rhino官网看看:http://www.mozilla.org/rhino/

Rhino看起来是一个很简单实用的框架,它有没有前途?请发表你的看法。推荐Steve Yegge:Rhino on Rails在服务器端JVM中运行JavaScript

下面是Steve Yegge在google I/O大会上的演讲视频: