首页 | 博客群 | 公社 | 专栏 | 论坛 | 图片 | 资讯 | 注册 | 帮助 | 博客联播 | 随机访问
Java中Uuid的实现(转载)- -| 回首页 | 2005年索引 | - -ESS概观 (Easy Script & Service)

JSVM运行机制以及ESS对其的扩展

关键词jsvm    ess    javascript    js发布                                          

一、JSVM是什么?

什么是JSVM?我想由万常华自己来说比较准确,以下是在原贴里他的发言引用:

“一直以来,js 没有统一的编写规范,导致许多优秀的代码不能很好的复用(function的复用性很差的)。就拿 51js 来说, 一直在讨论零散的技术,而不能借助众人的力量积累出一系列相对完整的“产品”,这都是因为没有“规范”,不成“体系”造成的。我希望能通过 JSVM 改变这种状态,就如斑竹所言,这只是一套方法(规范),而并完整的产品。众人拾柴火焰高,依照一个统一的规范,每个人根据自己的所长开发自己的类包,就能很好的流传开,被其他人使用。”

(万常华的发言引用完)

很明显,JSVM要提供一个平台,或者是一个编码规范,通过类库可以减轻我们写脚本的工作量,同时我们也可以编写自己的类库,这一切在JSVM已经被实现了。


二、JSVM的架构

如果您真的决定继续把文章看下去,请先到JSVM无忧原贴下载最新的JSVM,在第一贴就能够找到,有两份代码,建议全部下载。

首先请解压缩第一份代码,也就是"jsvm & js 核心类库",可以看到有一个文件夹jsre,里边有两个文件夹classes、lib以及一个js文件jsvm.js。所有的类文件都应该放在classes下边,具体如何后边会讲。

这里的jsvm.js里边的代码就是JSVM的核心实现代码,我将会对里边做尽可能详尽的讲解与分析,如果不懂的话可以回贴提问,我会尽可能回复,如果有一些问题比较模糊,最好是直接到原贴里回贴发问,毕竟谁也没JSVM的作者更理解这份代码。

lib文件夹里有两个文件:JsLibTools.hta以及lib-inf.xml。前者是万常华自己提供的一个小工具,使用了HTA技术写的,主要用来把分散的js代码组织成一个xml文件,称它为lib。后者是lib的更新信息。

进入classes文件夹可以看到js文件夹以及class-inf.xml。js文件夹里存放的代码主要是优化JSVM以及为JSVM提供基础类的代码文件,按命名空间的形式存在,比如js.lang.Object这个类的代码就放在/jsre/classes/js/lang/Object.js里边。同时每个文件夹都有package.xml文件,这里边存放了该文件夹里的类信息。

另外万常华还提供了一个cn类库,即第二个代码下载,解压缩之后把cn文件夹放在classes里边。该类库与js类库不同的是它提供了许多实际应用中可以使用的代码,而前者提供了基础类。

JSVM系统变量:

$system_home: 系统目录,默认值为"/common/",这是以网站的绝对路径进行定义的,在使用JSVM之前必须进行修改。
$js_classpath: 类文件存放的根路径
$js_libpath: 类库文件存在放目录,这里的类库即前边所说的"lib"xml文件。
$js_runMode: 运行模式,有两个选项,一个是debug,一个是run。run模式是实际应用的运行模式,程序出了错不提醒访问者,另一个是debug模式,在写代码的时候有时候出了问题,设置为debug可以得到相关的出错信息。

PS: 从上边系统变量的定义可以看出一个特点:系统变量必须使用$开头。


三、JSVM的编码约定

编码约定万常万并没有给出一个比较详细的说法,不过我们可以从他在原贴的发言以及JSVM代码的组织中得出以下规范:

1. 系统变量必须使用$开头
2. 系统函数必须以_开头
3. 继承必须使用类的_extends方法而不允许直接使用prototype = new ClassName的方式
4. 所有的类都必须直接或者间接继承js.lang.Object
5. 包(package)的命名开头字母必须小写
6. 类(class)的命名开头字母必须大写
7. 在类的定义之中使用的临时变量必须以下划线_开头
8. 所有的类都必须严格遵守命名空间的约定(关于命名空间的组织可以查阅Java或者.NET)
9. 例外处理不要使用throw而是使用JSVM自定义的_throw

四、JSVM的例外处理

JavaScript本身就自带有一套例外处理,可以利用try-catch结构处理代码中可能出现的出错,但JSVM觉得这样还不够,因为这里的JavaScript是使用在Web页面中,如果没有使用try-catch的话还是同样会提供各种错误,JSVM是重写window.onerror把这种错误也拉进来一起处理,同时还定义了一个系统函数_throw,实现原理很简单,不需多讲。

具体的原型为window.onerror = function(msg, url, line)

msg为出错信息的描述,即Error对象的description属性
url为出错页面的url
line为出错的行数

在JSVM中,例外处理到处都会用到,这本来是很正常的事情,因为每一个程序员都应该处理所有可能会出现的错误。但因为种种原因,极少人在Web客户端的JavaScript中进行例外处理,大家都觉得没什么必要,从这一点也可以看出万常华编码的严谨。

五、JSVM的继承

在JavaScript中,继承是基于原型的,比如B类要继承A类可以这样子:

A.prototype = new B;

但是在JSVM中并没有如此简单,请看jsvm.js中的这段代码:

// * 定义实现 OOP 的相关方法
Function.prototype._extends = function(jsclass) {
try {
var _cn = (new RegExp("function[\\s]*([\\w|\\.]*)[\\s]*\\(")).exec(this.toString())[1]; // 得到完整类名
if (typeof(jsclass) == "string")
eval("jsclass = " + jsclass + ";");
if (typeof(jsclass) != "function")
_throw(0x000D, "JSVM/_extends:" + _cn + " 继承类错误{" + jsclass + "不是合法类}");
var _p = this.prototype = new jsclass();    // 原型继承
this._base = jsclass;
this._super = jsclass.prototype;
_p.className = _cn;
return _p; // 返回原型
} catch(ex) {
_throw(0x000E, "JSVM/_extends:" + _cn + " 继承类错误{" + ex.description + "}");
}
};

JSVM是直接给所有Function对象增加一个共用的方法_extends来实现继承,所有的类都可以通过 类名._extends("js.lang.Object")的形式来把某个类继承下来。
在继承函数里不仅使用原型继承,还同时做了许多工作,给做继承操作的子类增加了_base(父类对象)、_super(基类对象)、className(本类的类名),如果出现了任何错误还进行相关的例外处理。

PS:
       
1. JSVM原创作者:万常华,有兴趣的同志可以搜一下相关资料;就我个人而言,JSVM确实是一个很好的JS开发框架。
        2. 另外本人已在JSVM的基础上做了封装,让JAVA开发人员对JS的开发更为亲切,那就是编写后的JS代码可以完全与JAVA的JAR方式来进行发布,使得JSVM不仅是在语法语义上与JAVA相似,就连发布方式也可以完全一样。 (此项目正在进行中,名称:ESS,届时敬请关注)。
        3. ESS项目不仅支持JS的JAR发布方式,还将其上集成Burlap协议的新型Ajax模型,让使用者以最轻松和简单的代码实现与后台JAVA服务代码的调用,而且还将提供轻便快捷的发布基于Burlap协议的WebService。 目前ESS还在进行中,希望大家能给予支持。

【作者: swingchen】【访问统计:】【2005年09月1日 星期四 16:05】【注册】【打印

搜索

Google

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=2780064

来自逐鹿工业品逐鹿工业品的引用:

逐鹿工业品

来自逐鹿流行榜逐鹿流行榜的引用:

逐鹿流行榜

来自租房网租房网的引用:

租房网

博客手拉手

javascript
javascript特效
JavaScript正则表达式
网页常用小技巧(javascript)
博客网个人博客无限制使用JAVASCRIPT语言的方法

回复

- 评论人:Hunter Li   2008-03-14 11:28:29   

good , but where to down JSVM

验证码:   
评论内容: