JSVM FAQ

1.关于org.w3c.dom.*
jsvm dom2是按照 w3c dom level 2 的标准结合javascirpt本身的特点,设计的一个javascirpt 的文档对象模型,可应用于js的组件开发领域。

org.w3c.dom.* 中的类不仅仅只是定义了模型中的接口,而且给出了缺省的实现。

以其中的事件模型 org.w3c.dom.events.* 为例:

3个核心成员: 

org.w3c.dom.events.Event;
org.w3c.dom.events.EventTarget;
org.w3c.dom.events.EventListener;

比如我们要实现一个事件的侦听,分派,处理,只需简单的按下面方式即可实现:

import org.w3c.dom.events.EventTarget;
import org.w3c.dom.events.Event;

class Window (name)
{
   EventTarget.call(this);

   // todo
   this.name = name;
   // ...
}

Window.prototype.open = function ()
{
   window.open("about:blank");
   // 分派一个“open事件”
   var event = new Event("open");
   event.name = "Window open";
   this.dispatchEvent(event);
}


客户侦听代码:

var win = new Window("test window");

// 创建一个事件侦听器对象
var listener1 = new EventListener(function (evt){

   alert("this name is : " + this.name);
   alert("event's name is: " + evt.name);
   alert("event target's name is: " + evt.target.name);

   },  {name:'listener1'});

// 注册侦听器,侦听 “open事件”
win.addEventListener("open", listener1, false);


// 再注册一个侦听器(可注册多个侦听器)
var listener2 = new EventListener(function (evt){

   alert("this name is : " + this.name);
   alert("event's name is: " + evt.name);
   alert("event target's name is: " + evt.target.name);

   },  {name:'listener2'});
win.addEventListener("open", listener2, false);
win.open();


可以发现,当执行 win.open 的时候,分派的open事件先后被 listener1,listener2 侦听到,并执行了相应的处理。

如果基于dom2来开发js组件,事情会变得更简单一些。


2.如何定义符合jsvm的类
jsvm2 提供了对额外语法的支持,但这不是必须的,可以先不用去看jsvm2的语法。按照javascript本身的方式来设计js class,但是必须遵循下面这些规范就可以了

(1). 类的保存方式采用  包名+类名.jsc 的方式

   例如: com.test.HelloWorld  的保存路径是   com/test/HelloWorld.jsc

(2). “类”必须被定义为一个 Function 类型

   例如: HelloWorld 必须是一个 funtion 的类型

  window.com.test.HelloWorld = function ()
 {
 }

3.关于jsvm的规范
jsvm的规范其实很简单:
   (1). 每个 public class 用单独的jsc文件存储,存放路径与java类似:<包名0>/<包名1>/<类名>.jsc
   (2). 每个 public class 必须定义为 function 类型,并且通过 window.包名<n>.类名 能访问到该 class 的句柄。

4.核心部件的加载时序
一般来说:

standlone模式,时序是这样的:kernel,<navigator对应的模块>,runtime,runtime.module
application模式,时序是这样的:kernel,<navigator对应的模块>,runtime,runtime.module,application
module模式,时序是这样的:kernel,runtime.module,module
如果 runtime.module 先加载,则会引起Class未定义的错误。

5.application + module 的模式
application + module 的模式本身很简单, 他们是出于下面的考虑而设计的。

SOA以及服务端线性扩展的需求,使得服务端逐渐被设计成一个无状态或者弱状态的模式。而此前用于保存会话状态的工组将由客户端来完成。因此一个RIA应用的客户端必将需要设计成为一个有状态的客户端。

而此前的web应用都是以相对独立的页面为单元设计的,页面的切换导致客户端无法保存大量的状态信息。

jsvm2 的 application 是一个与UI 无关并且同整个应用有着相同生命周期的框架页面。而那些同具体UI相关,承担人机会话逻辑的页面都以 module 的方式在这个框架页面(application)底下运行。而application 是整个web应用的统一入口和出口,所有的module页面都是通过application统一加载并统一缓存代码或数据。

于是,设计人员就可以在客户端就通过application来保存会话,共享数据等等...

example 中有 application + module 的例子,application 的页面比较简单,只需加载 jsvm 的环境 并且设置为application模式就行,如:

<html>
<head>
<script
 src="/jsvm2/jsre.js"
 debug="false"
 mode="application"
 #main="class(example.TestApp)"
 main="url(/welcome.htm)"
 ></script>
</head>
</Html>

另外,我们需要指定一个 application 的入口参数,目前支持两种方式:

1. url(URL路径)  如: url(/index.htm)
2. class(类名)如: class(org.jsvm.App)

第一方式,application 启动后会自动在当前主窗口中加载指定的url
第二方式,application 启动后会自动在加载指定的class,并运行 class 的静态方法 main

 

module 页面就像普通页面一样,只是将 mode 声明为 module 即可,

<html>
<head>
<script
 src="/jsvm2/jsre.js"
 mode="module"
 ></script>
</head>


另外,在 module 页面中可以通过 application 来访问 application 对象,如:
<script>
function exit() {
   application.exit();
}
</script>

如果mode的值设为 auto 的话,即: mode="auto" ,jsvm会自动识别当前是standlone模式还是module模式。这在单元测试的时候是非常有用的,我们不用非要启动application的方式来对某些页面进行测试。
6.JSVM 中的核心API类并不核心
和 java 不同,jsvm 的核心 api 类 在 jsvm中的位置并不核心!

我们知道java开发都是基于那些核心api类进行的。但jsvm中并不是这样,即便完全不关心 js.* 下的那些类,照样可以进行js  class的开发工作。 jsvm 核心api类只是可以更好的帮助你,规范你的开发。

我们抛开jsvm 核心api类,用最基本的javascript来写一个js class:

<jsvm_home>/classes/com/sample/SimpleClass01.jsc

_$package("com.sample");
com.sample.SimpleClass01 = function ()
{
   this.test = function ()
   {
      alert("SimpleClass test()");
   }
}

 

客户代码:

_import("com.sample.SimpleClass01");
var obj = new SimpleClass01();
obj.test();

 


如果你想最快地了解并使用jsvm进行js开发,其实不需要学习太多东西!
只需记住jsvm的两条最基本的规范:

(1)类似于java的代码组织方式:包名+类名,存放位置:<jsvm_home>/classes/<包名>/<类名>.jsc
(2)将类的句柄指向你定义的那个 function 对象。

 7.关于BObject

目前可能不能期望 一个 js object 的表征完全等同于一个 HTML Element object。

但借助 js object 来封装一个HTML Element 或者一组相关的 HTML Element 则是可以的。

而且如果要将 HTML Element 的属性或者方法直接通过js object的属性或者方法的形式暴露给外部,则可以考虑用代理的方式。

package my;

class my.View (htmlElementObj)
{
   this.__htmlElement = htmlElementObj;
}

View.prototype.getInnerHTML = function ()
{
   return this.__htmlElement.innerHTML;
}

View.prototype.setInnerHTML = function (sHTML)
{
   this.__htmlElement.innerHTML = sHTML;
}

上面,我们通过方法 getInnerHTML() 、 setInnerHTML() 来代理访问 innerHTML 属性,形式上有所变化,若想追求原有innerHTML 的属性形式,在遇到类似可写属性的时候会有一些麻烦。

 

js.lang.BObject 是 browser object 的意思,它要求被实例化的环境必须是已知且被支持的浏览器。(因为理论上,javascript的运行环境不一定非要是浏览器,比如js.lang.JObject ,只要jsvm能正常运行,它就可以正常工作,所以在 jsvm4s 环境下,js.lang.JObject 可以在iis中正常工作,非浏览器的环境我们很少关注,所以这里我们不过多阐述了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值