阅读更多
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操作
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大会上的演讲视频:

16
0
评论 共 13 条 请登录后发表评论
13 楼 mewleo 2009-05-08 20:59
helma.org
12 楼 jackchen_2008 2008-10-08 10:02
比较实用,正在学习中。。。
11 楼 jjx 2008-06-18 17:02
Rhino看起来是一个很简单实用的框架 ? 语言实现吧,怎么能说是框架
10 楼 KKFC 2008-06-18 14:14
看过Steve的代码,冗余还比较多,估计还可以减小代码行数
不要小看js, 高度抽象起来~人都颠!
9 楼 inshua 2008-06-18 13:51
哇哈哈哈,等了好久终于等到今天
8 楼 ray_linn 2008-06-18 13:12
有什么意义吗??  .net还支持一堆的script呢?大家不还是用C#和VB
7 楼 QQbyte 2008-06-18 10:08
6 楼 aninfeel 2008-06-18 10:08
看起来不错
5 楼 Wallian_hua 2008-06-18 09:46
不是吧.. 这样都行???
4 楼 jjx 2008-06-18 09:39
rhino on rails 说了这么久,到底有没有发布
3 楼 xpf7622 2008-06-18 08:10
不感兴趣。
2 楼 sp42 2008-06-17 11:51
终于有人关注ssjs了
过去一年多,我一直在用Ext+WSC(as a Container)+Active record(SQL free)做实验...
引用
Server Side JavaScript?(SSJS) is not new, it has been right here since early Web Development by Netscape Server or Active Server Page. By the time of Ajax fast growing, why not just coding in single language?

1 楼 QQbyte 2008-06-17 11:41
搜索了一下Rhino on Rails 来历:

引用
为了提升google的开发效率,Steve努力尝试说服公司采纳Rails(包括Ruyb)作为开发工具,但是google不予采纳 (google不想再增加支持的语言的数量)。Steve决定把Rails移植到JavaScript上去。这意味着一个google有可能在未来开源一个新的项目Rhino on Rails。

限制语言的数量将使得开发人员对代码的贡献度更大,他们无需担心成为不熟悉的语法的牺牲。

每一个公司正式支持的语言都是有成本的:基础架构的支持,文档,培训,代码冗余还有其它因素。虽然编程语言的核心语法都是大同小异,但是剩下的各自独特的语法就难以辨认,尤其是没有明确标准的动态语言,例如Perl,Ptthon,Ruby。Google非常谨慎的保持使用语言的数量。这样就可以构建大量对所用语言非常熟悉的专家。goole目前只使用C++,Java,Python,javascript作为正式的产品开发语言。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • JDK1.8_64位

    JDK(TM)8 64位简而言之就是一款针对java编程的软件工具,是学习java编程的第一步。JDK作为Java语言的软件开发工具包。

  • Java OutOfMemory Error引发的JVM参数实测--线程堆栈参数篇

    最近在Tomcat的环境中调整了JVM的线程堆栈参数Xss,结果服务器运行一段时间后出现OutOfMemory的错误,导致Tomcat进程异常挂起。于是乎在网上找了大量的资料,并在环境中实际进行测试,终于搞清了这个问题。下面将详细的信息和过程罗列如下,供大家查看和参考。在这篇文章中会重点测试不同的Xss参数对生成的线程数量的影响。以后会再写一篇文章重点测试不同的Xms和Xmx参数对生成的线程数量的

  • macOS Sierra版本下Hadoop(2.7.3)为分布式环境的详细安装

    这学期选修的 j2ee 的课程在大作业的项目选择中有一个关于云盘项目的,需要搭建 hadoop 环境,完成一个简易的云盘网站,具备上传下载删除功能。搭建 hadoop 的环境也费了很长时间,网上虽然也有资料,但都是比较老的版本,参考了网上的一些资料,加上自己的实践,写一篇总结。1. 下载安装 jdk, 并设置 JAVA_HOME 环境变量 1)在 terminal 输入java -version

  • Java8安装步骤-win10-64位系统

    一、下载Java8的jdk安装包         下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html 二、打开安装包进行Java安装,默认安装地址:         安装地址:C:\Program Files\Java\jdk1.8.0_172\   ...

  • JAVA内存区域

       了解Java GC机制,必须先清楚在JVM中内存区域的划分。在Java运行时的数据区里,由JVM管理的内存区域分为下图几个模块: 1,程序计数器(Program Counter Register):程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。 每个程序计数器只用来记录一个线程的行号,所以它是线程私有(一个线程就有一个程序计数器)的。 如果程序执行的是一个Ja.

  • Struts2

    第一次(Struts2入门、基本配置) 一、Struts2入门。【 1、Struts2框架介绍《 (1)它是MVC的一个框架,它以前叫做WebWork框架。后面它被Apache(阿帕奇)和 Sun(丧)公司收购了,Apache公司是我们比较出名的一...

  • struts2核心

    相信熟悉 Struts1 的程序员,对 Struts2 会迷惑,凡事是是而非。我也曾经遇到了这种情况。Struts2 在设计的时候采用 webwork 的内核,尽量按照 Struts1 的编码习惯。 我不知道各位怎么学习 Struts1,当我阅读了...

  • Struts2 内核之我见

    Struts2 内核之我见 完整分析 Struts2 内核中文文档 本文首先探讨了 Struts2 核心控制器的源码,以帮助解读 Struts2 的工作流程。接着讲解相关外围类。最后对 Struts 的工作流程进行完整总结。 7评论: ...

  • struts2 基础

    http://struts.apache.org/ 一、struts2初体验 ppt2 ****************************************...第一个程序HelloWorld(导包,导配置文件struts.xml web.xml)从apps\struts2-blank工程下copy最少jar包:javassi...

  • Struts2总结

    1.全局的逻辑控制器为一个过滤器,负责过滤所有的请求。该过滤器引用的API类为 org.apache.struts2.disapatcher.FilterDispatcher 2.MVC:页面请求(jsp)——>逻辑控制器...3.struts2的配置文件放在classpath下。 4.

  • 64位java8,jdk8下载,解压版

    下面是java - version的信息,直接拿走。 java version "1.8.0_40" Java(TM) SE Runtime Environment (build 1.8.0_40-b25) Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode) 解压密码:123456 >>下载地址<&...

  • JVM --- MetaspaceSize理解

    MetaspaceSize含义   MetaspaceSize容量触发FGC的阈值。比如-XX:MetaspaceSize=256m,当MetaspaceSize容量超过256M时触发FGC,超过设定阈值后MetaspaceSize每扩容一次触发一次FGC; 默认值   查看命令如下,默认值大约20.8m; jinfo -flag MetaspaceSize pid 设置建议 Metaspac...

  • CHD 5.10 离线安装

    安装虚拟机,我用的是centos6.5的版本。选择回车重启机器设置虚拟机网络1.集群节点规划,安装三台机器,每台机器都执行以下操作,切记![root@hadoop-cdh1 ~]# vi /etc/sysconfig/networkNETWORKING=yesHOSTNAME=hadoop-01  # 机器名称GATEWAY=192.168.137.2  # 网关[root@hadoop-cdh1...

  • java通过url链接下载文件的辅助工具类(http/https)

    java通过url链接下载文件的辅助工具类(http/https) 这个工具类用于从url地址获取文件的文件流或字节数组。 直接贴代码: package com.gigi.utils; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException;...

  • java多线程编程3--对象及变量的并发访问

    1.数据类型String的常量池特性 在jvm中具有String常量池缓存的功能,例如: String str1 = "a"; String str2 = "a"; if(str1 == str2){ ... }//返回true 因此同步synchronized代码块都不要使用String作为锁对象,而改用其它,例如new object()实例化一个object对象,但它并不放入缓存

  • kindeditor 4.1.8 整合struts2 (Action版本)过程总结

    前些日子一个跑业务的朋友帮我接到一个小的项目,其中有好多模块用到了富文本编辑器,在网上找了好多,也看了好多,综合各方面的因素最后选择了kindeditor4.1.8,网上搜索了一下也没有看到一个帖子完完整整的介绍...

  • 深入浅出 Struts 2--开发技巧和整合策略

    转自:... 简介...................................................................... 1 WEB世界中,STRUTS2身处何方....................... 4 SERVLETS..............

  • struts面试常见问题2

    1.Struts的工作原理  在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet, ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,

  • [Java]用servlet实现文件上传功能

    由于我老婆这边需要用到文件上传,然后这任务不知道怎么就到了我头上。她的框架是比较老的struts2(说实话我一度连struts2都拼写不对。。。) 文章目录背景介绍代码引入依赖tomcat依赖配置jar包依赖代码编写...

  • 文件上传之路

    刚接到这个问题的时候,我就看了项目中之前的例子,看了会,没有看懂, 之后我就尝试自己写,想使用servlet去完成这个问题,是写在action中的 //1. 创建工厂类 DiskFileItemFactory factory = new ...

Global site tag (gtag.js) - Google Analytics