推荐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端完成的所有工作!
什么是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
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
为什么要在服务器端使用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操作
使用Java classes和Interfaces
JavaAdapter 能够创建 “subclass” of a Java class
Calling Rhino/JavaScript from Java
使用Rhino的Java层来扩展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在google I/O大会上的演讲视频:
使用Rhino能够用JavaScript完成Java在server端完成的所有工作!
什么是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
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
为什么要在服务器端使用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))); }; });
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在google I/O大会上的演讲视频: