================================================================================
Qomolangma OpenProject v1.0
类别 :Rich Web Client
关键词 :JS OOP,JS Framwork, Rich Web Client,RIA,Web Component,
DOM,DTHML,CSS,JavaScript,JScript
项目发起:aimingoo (aim@263.net)
项目团队:..\..\Qomo_team.txt
有贡献者:JingYu(zjy@cnpack.org)
================================================================================
一、框架库:处理池与处理机
~~~~~~~~~~~~~~~~~~
严格地说,Pool被译成“池”即可,只是在Qomo的TPool类中,所有放在“池”中的对象都是
处理机(Machine),因此这个TPool被称为“处理池”类。
Pool的出现早在WEUI的时代,其目的是处理同步的、缓存的XmlHttp对象。因此,Machine也
就在事实上只实现了“THttpGetMachine”。这个HttpGetMachine也能处理POST类型的HTTP请
求,所以,严格地说,它应该名为“THttpMachine”。
Pool是一种机制,并不局限在使用 HttpGetMachine 上。HttpGetMachine只是Machine的一个
实现实例。我们先澄清这一点,以避免开发人员把它当成了Ajax技术的另一个名词。
HttpGetMachine已经处理了兼容问题。随便指出,Framework\Common下的公共类,都是可以
在mozilla兼容浏览器中使用的。
二、池化的架构
~~~~~~~~~~~~~~~~~~
Pool提供四种能力:
- 注册处理机类(Machine Class)
- 管理处理机实例(Machine Instance)
- 调度处理机(包括状态:resume, sleep, free)
- 管理数据(Data)对象
处理机类提供处理数据(Data)的能力,数据(Data)的结构对Pool来说是完全透明,Pool只在
调度过程中,将数据传给处理器,处理器如何识别、使用、修改这个数据,Pool完全不知。
处理机应当具体的能力有:
- 提供 OnStateChange 事件,响应来自Pool的调度状态(resume, free)
- 在必要的时候,激活OnStateChange事件,以通知Pool进入调度状态(sleep)
事实上,Pool和Machine都可以响应三种状态,架构中没有约定哪种状态由谁发出,或者是由
谁处理(并终结)。但在目前的设计中,
- Machine处理完一段事务后,(类似于线程一样,)应触发sleep状态.
- Pool在调用push()方法填入新的数据时,如果有空闲的Machine,则触发该Machine的result;
否则,(在Pool未满的情况下,将)尝试创建新的Machine,会触发它Machine的resume.
- Machine处理完自己的事务并进入sleep状态时,如果Pool有未处理数据,则为该Machine
触发一个新的resume.
Pool和Machine可以根据需要重新设定触发方式,但不能改变对各状态值的含义的约定。
Pool和Machine都可以添加新的状态。
Machine的启动时间,以及Data处理的结束时间,是没有时序和关联的。
三、使用处理池
~~~~~~~~~~~~~~~~~~
同一个处理池中,只能使用相同的处理机。这在处理池创建时就需要定义好。例如:
------------------
// 声明一个处理THttpGetMachine的池,池的大小(深度)为10
var pool = new Pool(THttpGetMachine, 10);
------------------
这里,池的大小为10表明池中容纳THttpGetMachine实例的上限为10个。当Machine在忙(Busy)时,
如果有新的数据请求处理,则会尝试创建新的Machine。当上限设定数的Machine都在忙时,数据
被缓存到队列中等待处理。
从原理上来说,无论是创建大小为1个还是100个的池,最终所有的数据都能得到处理。只是处理
的并发量不一样,因此速度和性能也就有差异。——池的大小通常是经验值。
池创建后立即开始工作。但它只响应一个方法:
------------------
pool.push( _your_data );
------------------
这里的_your_data是用户自已决定的一种结构,它对于Pool来说是透明的。当它被处理时,会被
传递到某个Machine实例,而这个实例确切地知道如何处理这种数据。
对于THttpGetMachine来说,它能处理一个对象,该对象有一个名为src的属性,即:
------------------
var data = { src: "http://www.doany.net/" };
pool.push( data );
------------------
这里并不限制必须是一个对象,也不限制必须是直接量声明。当然,直接量的好处,是你可以这
样写代码:
------------------
pool.push({ src: "http://www.doany.net/" });
------------------
四、使用处理机
~~~~~~~~~~~~~~~~~~
如何处理机被实现过,那么使用者只需要非常简单地调用,即可完成处理,而无需关注具体的处
理机与处理池的调度过程。在上面这个使用THttpGetMachine的例子中,我们的基本代码如下:
------------------
// 1. 处理数据时的动作
function doAction(state) {
// THttpGetMachine约定state值4表明下载完毕
if (state == 4) {
alert('Url: %s\nLength: %s'.format(this.data.src, this.get('XMLHTTP').responseText.length));
}
}
// 2. Pool的状态变更响应
function doOnStateChange(mac, state) {
doAction.call(mac, state);
}
// 3. 创建pool并添加事件响应
var pool = new Pool(THttpGetMachine, 10);
pool.OnStateChange.add(doOnStateChange);
// 4. 处理数据
pool.push({ src: "http://www.doany.net/" });
------------------
上面的步骤1、2可以有更灵活的处理方式,包括"this"的传递、数据(Data)的分析、状态(State)
的识别等等,这些都是用户代码中的技巧。但在THttpGetMachine中,基本的使用方法是如上的。
下面讲述处理机的实现方法。因为Qomo的框架允许用户自行扩充各种不同的处理机。
四、实现处理机(1):基本结构
~~~~~~~~~~~~~~~~~~
处理机需要具有两个属性:
- data: 当处理机被TPool调度时,data指向需要被处理的数据
- pool: 当处理机被TPool调度时,pool指向Pool自身
所以我们看到,THttpGetMachine实现中,为每个对象声明了这两个属性:
------------------
function HttpGetMachine () {
//...
this.Create = function() {
this.data = null;
this.pool = null;
// ...
}
}
------------------
我们说过,处理机明确地知道它将处理的数据的格式。因此,在THttpGetMachine的实现中,它
响应OnStateChange时的处理代码如下:
------------------
var doStateChange = function(state) {
if (state=='resume') {
// 获取或创建 XmlHttpRequest 对象、设置属性等
var xmlHttp = ...
var method = 'GET';
// this 指向 Machine 自身
var src = this.data.src;
// src 指向需要当前 Machine 处理的URL地址,因此应该通过类似如下代码来获取数据
xmlHttp.open(method, src, true);
xmlHttp.send(null);
}
else if (state=='free') {
// ...
}
}
------------------
五、实现处理机(2):自定义状态
~~~~~~~~~~~~~~~~~~
我们发现,这里的代码中,只处理了XmlHttpRequest开始下载的行为,那么这个对象下载完成
之后应该如何处理呢?
对于XmlHttpRequest来说,同步调用时,onreadystatechange事件会被对象触发。而这个状态其
实对Pool来说,是透明的。这时,Pool会把这个状态交回给Machine。这个过程在Pool和Machine
中传递,但只被Machine处理。
这些状态,被称为自定义状态——例如前面提到过的状态值“4”。它们是由Machine负责处理的。
THttpGetMachine使用如下的方法来实现自定义状态:
------------------
// 定义XMLHTTP.onreadystatechange事件的响应句柄
var onreadystatechange = function() {
var xmlHttp = this.get('XMLHTTP');
this.OnStateChange(xmlHttp.readyState);
if (xmlHttp.readyState==4) {
this.OnStateChange('sleep')
}
}
// HttpGetMachine的对象构造过程
this.Create = function() {
//..
var ajx = new Ajax();
var mac = this;
this.set('XMLHTTP', ajx);
// 将函数封装为方法,以使this在函数内有效
this.get('XMLHTTP').onreadystatechange = function() {
onreadystatechange.apply(mac, arguments);
}
}
------------------
我们看到,HttpGetMachine内部处理了XmlHttpRequest对象的状态变更,并通过调用
------------------
this.OnStateChange(xmlHttp.readyState);
------------------
来向处理器自身/子类/事件处理程序传递该状态,同时Pool也会感知到这个事件并响应它。
这样,xmlHttp.readyState这个自定义状态就成功地在架构的全局完成了传递——如果有事件
处理程序需要处理这个状态的话,就可以得到响应的机会。
onreadystatechange中有一段代码用于激活处理机的"sleep"状态。因为这个xmlHttp已经完成
了它的“处理任务”,也就是获取数据。而且,完成下载的状态值“4”也经在上一行代码中
向架构全局发布了通知,这意味着(如果有响应者的话)已经完成了处理过程。所以这里触发
了"sleep"状态。
上面的代码与Qomo代码包中稍有差距。代码包中的_changer()函数用于封装这个过程,而原因
只是因为在Mozilla引擎中,xmlHttp.onreadystatechange会在处理完成后被自动置null。
六、处理机的高级使用方法
~~~~~~~~~~~~~~~~~~
Qomo的类继承结构允许你进一步的实现THttpGetMachine的子类,或者创建新的Machine类,以
处理其它的数据。一般来讲,你不必要重写Pool。
在前面的基本用法中,数据的处理程序是挂在Pool.OnStateChange事件上的。但这并不是理想
的用法,事实上,处理的最终处理应当由Machine负责。因此,下面的代码更符合逻辑:
------------------
function MyMachine() {
var doStateChange = function(mac, state) {
// if (state == 4) ...
// ...
}
this.Create = function() {
this.OnStateChange.add(doStateChange);
}
}
TMyMachine = Class(THttpGetMahine, 'MyMachine');
var pool = new Pool(TMyMachine, 10);
//...
------------------
也许你还不明白这种结构的价值,那么下面的例子,讲述如何处理不同的网页。——事实上,
这已经实现了一个动态获取并分析网页(搜索引擎?)的基本结构,或者你也可以用它来做
RSS分析。
------------------
var analy_tree = {
sina: function(ctx) {
// ...
},
baidu: function(ctx) {
// ...
},
google = function(ctx) {
// ...
}
};
funtion getHostFromUrl() {
// 分析URL,对不同的url返回其host,或返回特定的分析器标识(analy_tree的属性名)
}
var doStateChange = function(mac, state) {
if (state != 4) return;
var host = getHostFromUrl(this.data.src);
var analizer = analy_tree[host];
if (analizer) {
analizer.call(this, this.get('XMLHTTP').responseText);
}
}
------------------
更多的代码,我就不写了。哈哈~~
七、其它
~~~~~~~~~~~~~~~~~~
详见示例:
\Framework\DOCUMENTs\TestCase\T_Ajax.html
这个示例是可以运行在FireFox等Mozilla系列浏览器上的。但由于有跨域数据存取的问题(我在
示例中访问了非本机的Url),因此你可能会看到一个警告框,请确定即可。
在这个文件:
\Framework\DOCUMENTs\TestCase\T_AjaxPriviledge(FF).html
中是一个解释mozilla系列浏览器上跨域存取的示例。但目前来说,没有方法能清除那个提示框。
^.^
分享到:
相关推荐
内容概要:该实验报告旨在指导学生利用Python连接数据库并进行操作,通过实现协同过滤算法构建推荐系统。具体任务包括连接MySQL数据库、数据预处理、实现算法以及模型评价。 适合人群:适用于学习数据挖掘和推荐系统算法的学生及研究人员,尤其对Python编程有一定基础的学习者。 使用场景及目标:①掌握数据库连接的基本技巧;②理解协同过滤推荐系统的原理与实现步骤;③提升模型构建和性能评估的能力。 其他说明:此报告模板详细地列出了实验目的、方法和步骤,适合作为课程实践的参考,对于提高学生实际项目开发能力具有重要意义。
内容概要:本文详细介绍了在Django框架中处理静态文件和媒体文件的方法。包括静态文件的概念与用途,如何在Django中处理静态文件(配置STATIC_URL、STATICFILES_DIRS、收集静态文件),媒体文件的概念与用途,如何在Django中处理媒体文件(配置MEDIA_URL、MEDIA_ROOT、模型中的FileField和ImageField、视图和表单处理文件上传)。同时,还介绍了在生产环境中如何部署静态文件和媒体文件,并探讨了使用CDN、云存储等高级主题。 适合人群:具有Django框架使用经验的开发人员,尤其是对静态文件和媒体文件处理有需求的技术人员。 使用场景及目标:①了解如何在Django中配置和处理静态文件和媒体文件;②掌握如何在生产环境中高效部署静态文件和媒体文件;③探索如何使用CDN和云存储提高文件加载速度和安全性。 其他说明:本文不仅提供理论介绍,还包含实际操作示例,适合动手实践和深度学习。
整体风格与设计理念 整体设计风格简约而不失优雅,采用了简洁的线条元素作为主要装饰,营造出一种现代、专业的视觉感受。配色上以柔和的色调为主,搭配少量鲜明的强调色,既保证了视觉上的舒适感,又能突出重点内容,使整个演示文稿在视觉上具有较强的吸引力和辨识度。 页面布局与内容结构 封面:封面设计简洁大方,“MORIMOTO” 和 “SENYAN” 字样增添了独特的标识性,可根据实际需求替换为汇报人姓名或公司名称等信息,让演示文稿从一开始就展现出专业与个性。 目录页:清晰列出 “工作内容回顾”“工作难点分析”“市场状况概述”“工作目标计划” 四个主要板块,方便观众快速了解演示文稿的整体架构和主要内容,为后续的详细展示做好铺垫。 工作内容回顾页(PART.01):提供了充足的空间用于详细阐述工作内容,可通过复制粘贴文本并选择只保留文字的方式,方便快捷地填充内容,建议使用微软雅黑字体以保证整体风格的一致性。无论是列举日常工作任务、项目执行细节还是工作成果总结,都能清晰呈现,让观众对工作内容有全面而深入的了解。 工作难点分析页(PART.02):这部分页面设计注重实用性,文本框可自由拉伸,方便根据工作难
水电费管理系统主要完成内容: 1、用户数据接口模块:从用电统计模块接入所辖地区用电用户信息、从抄表模块接入用户电量数据 1、数据接口模块:实现了水电费信息的在线统计。 2、水电费管理模块:能够对居民的水电费的基本信息进行登记。 3、缴费管理模块:可以在线进行水电费的缴费信息。 环境说明: 开发语言:Java,jsp JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea 部署容器:tomcat
CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
此为报告样本,完整报告的框架结构
建筑智能化基础知识培训.ppt
CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
环境说明: 开发语言:Java JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea
【风电功率预测】基于matlab豪猪算法优化最小二乘支持向量机CPO-LSSVM风电功率预测【含Matla源码 4034期】
所有源码都有经过测试,可以运行,放心下载~
一个大箱子里杂乱的堆着很多长方体箱子 大箱子里的小箱子各种角度各种位置 用于定位匹配测试使用
通过日文名生成英文变量名,并且作成Get Set方法和注释。
1.前台系统功能模块分为 (1)站内新闻:实现了企业站内新闻信息的展示,以列表的形式展示企业的站内新闻信息,并能查看新闻的详情; (2)系统公告:实现了企业系统的公告信息的展示,能够对企业的公告进行发布,让更多的访客了解企业公告; (3)系统简介:针对家禽养殖网进行一个系统的全面的网站介绍,让用户通过该板块了解网站,并了解企业; (4)用户注册:实现了用户的基本信息的注册,通过注册成为网站的会员,然后才能在线订购相应的家禽产品; (5)家禽信息:以列表和图的形式展示了家禽的基本信息情况,展示了名称,价格,类别等基本信息情况; (6)在线留言:用户通过在线留言,可以对网站进行一些小建议的提出,也可以查看管理员对留言的回复。 2.系统后台功能: (1)用户管理:主要实现了管理员基本信息的管理以及对注册用户的审核管理; (2)系统公告管理:通过对系统公告信息的管理,让管理员可以在后台发布一些最新的公告信息,以真实展示企业的公告; (3)站内新闻管理:实现了对企业的站内新闻信息的基本管理,可以发布最新的新闻信息; (4)员工信息管理:对企业的员工的基本信息进行管理,让企业用...
CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
所有源码都有经过测试,可以运行,放心下载~
71576048246574901-Cadrage Director’s Viewfinder 取景神器安卓.apk
个人信息维护模块: 修改个人信息资料:用户可以更新自己的个人资料。 注销个人信息:用户可以注销自己的账户信息。 我的订票情况:用户可以查看自己的订票记录。 网站首页模块: 在线新闻查看:用户可以查看最新的新闻资讯。 在线留言:用户可以在线提交留言或反馈。 景区票务查看:用户可以查看景区的票务信息。 在线注册:新用户可以注册成为网站会员。 票务预订:用户可以在线预订票务。 在线公告查看:用户可以查看网站的公告信息。 网站简介:提供网站的基本信息和介绍。 后台管理模块: 用户信息管理:管理用户的账户信息。 系统信息管理:管理系统的相关信息和设置。 景区票务管理:管理景区的票务信息。 票务预订管理:管理票务预订的相关信息。 环境说明: 开发语言:Java,jsp JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea 部署容器:tomcat
CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
格式为NetCDF4,记录了挪威峡湾中一处海洋位置的浮标记录数据,包括浪高、海浪周期、海浪偏向角等多项数据。