基于Ajax脚本的构件组装技术的研究

2019-10-24 版权声明 举报文章

基于Ajax脚本的构件组装技术的研究

摘要:构件组装是基于构件的软件开发中一个核心过程,基于脚本语言的组装是构件组装的一个发展方向。首先分析各种脚本语言,总结基于脚本的组装的主要特点;重点分析基于Ajax脚本的组装技术,提出在客户端直接用Ajax组装Web构件新概念以及其关键要点;最后通过实例展开分析。

关键词:构件;组装;脚本语言;javascript;Ajax

中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)13-3408-03

Research on Component Composition Based on Ajax Script

LIN Si-ming

(Computer Department of Guangdong University of Technology, Guangzhou 510006, China)

Abstract: Composition is one core in CBSD(component based software development), while Composition based on script language is a new composition technology. In paper we category series of script languages, conclude the characters of the composition based on Web script language. Then adopt a new concept of Web composition, which Using Ajax scrpt to composite Web components in client browser, and analysis its technical factors. In the end, we illustrate a realization proof of this composition.

Key words: component; composition; script language; javascript; Ajax

软件构件技术是近几年来倍受关注且迅速发展的软件学科分支,通过定义独立且规范的可执行单元,实现多次复用。构件组装是基于构件的软件开发的核心研究分支,构件必须组装才能形成软件系统。目前国内外主流构件技术有:OMG的CORBA、Microsoft的COM、SUN的JavaBeans/EJB;北京大学软件工程研究所的青鸟工程;我国自主研发的“和欣”网络服务操作系统(Elastos)等。

1 构件及组装技术

软件构件是一种组装单元,它具有规范的接口规约和显式的语境依赖。软件构件可以被独立地部署并由第三方任意地组装[2]。构件定义有多种说法,本文采用Szyperski的构件定义。不过构件基本上都满足以下特性:1) 接口规约;2) 语境依赖;3) 独立可部署;4) 符合一定标准。

构件最终为组装服务,组装技术通过把预先定制的“事物”按一种新方式组合从而复用构件。构件组装使用交互机制使运行的构件按接口进行通信,即构件通过接互[2-3]。根据定义,构件组装有三个特点:1) 运行构件,即对构件实例组装而非构件,因而组装需依赖于运行时环境;2) 组装是两个以上的构件实例的交互,需要交互框架支撑;3) 接口是规范的,构件按规范交互。

构件组装与框架、模型紧密关联。框架是构件的基础设施,提供各种可组装的非功能属性和运行时环境;模型则提供标准以规范构件的接口和行为。框架和模型在许多构件技术上是融为一体的,比如COM,EJB,CORBA/CCM等技术。因此,可将组装技术分成三种形式[1,5]:1) 构件与构件的组装,主要是基于库或接口的内部引用;2) 构件与框架的组装,主要是基于接口及属性集的组装;3) 外部组装,包括基于脚本的组装,基于通信协议的组装等。

2 基于脚本语言的组装技术

脚本语言轻巧快捷,方便使用。越来越多独立构件成品汇聚到市场,特别是Web服务型构件。这些构件表示为黑盒,支持多种系统平台,用户只需要适当胶合就构建新应用。脚本语言是胶合这些构件的最佳方式。

2.1 脚本语言分类

脚本语言有许多种,根据性质分成三种,程序设计脚本、操作系统脚本和Web脚本,以下进行简单分析。

程序设计级脚本如perl[8]、python[9]、TCL及Visaul Basic[1]等,它们本身有许多已存在的可执行单元(即构件、组件或控件,概念是一致的),直接通过编写脚本代码胶合新应用,或者聚合成新构件。同时它们也是程序设计语言,有完备的结构,可以构造功能强大的可复用单元,如脚本构件。其中,visual Basic提供从界面到数据库再到分布式等的ActiveX组件(早期是VBX组件),其核心就是配置各个组件的属性,胶合到窗体容器中实现功能。

操作系统本身也是一个构件运行时环境,其下有许多独立的程序和进程,可执行某些计算,同时也可被胶合起来完成任务。Unix的shell脚本,可编写一段简单的.sh脚本,定义变量,定义顺序、条件和循环控制结构,使用数据重定向和管道功能,胶合unix下的如more、find、grep等命令程序,或者是自定义的系统调用程序等。Window的批处理脚本用.bat来实现,与.sh用法类似。目前许多服务器如tomcat,jboss等利用以上脚本组合服务器组件实现跨平台的服务器,可随处启动。

Web脚本语言如VBScript,JavaScript,以及asp、php及jsp脚本语言等,这些的目标都为实现Web应用而服务。其中asp、php及jsp是服务器端的动态脚本语言,也是程序设计级脚本语言,它们主要是组合后台的模块及内部构件以及视图组件,生成html页面。而VBScript与JavaScript类似,主要用于Window平台下的IE浏览器下环境。

JavaScript是目前最流行的跨浏览器脚本语言,是一种基于对象和事件驱动并具有安全性的脚本语言,最初用于嵌入到html中实现Web客户的交互。它能提供基础语法和函数库,以及正则表达式;提供DOM对象,专用于解析html元素;同时,它可以组合各种前端组件,如ActiveX组件、Applet程序、flash插件,甚至是COM组件等。另外,Ajax是新概念JavaScript,引入httpRequest等对象,将JavaScript扩展到分布式应用领域,可以组装各种Web服务,构造RIA(富客户端应用,Rich Internet Application)。目前有许多Ajax的框架,如prototype、JQuery、DWR及Ext等,提供丰富的前端(即客户端浏览器)组件[6]。

2.2 脚本组装技术的特征

根据以上分析,总结脚本组装的主要特征如下:

1) 脚本组装不需依赖容器或框架,只依赖于具体的运行时环境,如操作系统本身。

2) 脚本由解释器执行。解释器直接将脚本翻译成可执行编码,翻译较耗时,程序执行速度较慢。

3) 脚本组装的组装是现有可独立运行的构件。这些构件具体为进程或服务。进程是接口和实现的结合体,提供唯一执行入口,通过对输入参数的规约表现接口规范。服务则表现为已运行且可通信的构件,通过消息传递接口参数,或者通过请求远程调用接口。

4) 脚本是一次功能或任务的执行过程,不保存状态,只能运行时上下文保存变量。不过程序级脚本语言可封装实现状态。

5) 脚本可被组织成新的抽象单元,即脚本构件。不过,这是一个功能聚合体。

3 基于Ajax脚本的Web组装

3.1 Web构件

Web构件即是Web服务,可以独立地提供业务服务。目前有两种主要形式,普通Web服务和WebService。其中,普通Web服务指Web服务器所提供的功能应用,使用http请求向服务器请求服务,其接口表现为通过get或post方法传递请求参数,通过html、json或xml等响应请求。而WebService则指服务器容器所提供的一种基于xml规范的服务,其接口使用xml实现关联;客户通过soap协议发送请求和soap消息(xml封装),服务端处理请求并返回soap响应,WebService更适合于跨技术平台的胶合。目前,客户端使用Ajax技术可以实现与这两种服务的通信。

3.2 Ajax脚本实现组装

Ajax对JavaScript脚本语言进行扩展,方便地实现RIA应用。关于Ajax技术的组装原理,见图1的模型。

1) Ajax对DOM元素进行解析,动态检索和创建元素、设置监听事件以及填充数据;

2) Ajax可自定义函数,实现一些特殊处理过程,如验证等;

3) 基于Ajax已出现许多框架,提供丰富的组件库,可通过胶合组件实现客户端的界面渲染和其他功能计算;

4) Ajax通过HTTPRequest对象向后台请求Web构件,监听并使用回调函数处理响应。

5) Ajax可同步或异步地组合多个Web构件,实现新的前端业务或任务。

同步与异步。脚本执行过程,除了是顺序、条件和循环的同步执行外,还可以是异步的执行。每个Web构件从请求到响应有一定的响应时延,程序可能是多个构件的组合体,因些Ajax进行胶合时需要合理设计决策:同步时程序等待请求响应,然后才继续执行;异步时将请求结果抛给回调函数,主函数正常执行。例如,当向后台请求一个编号值,然后再根据编号请求其相关信息,这是同步过程。又如向后台请求一个列表,同时又希望可看每一列的相关统计结果,可通过遍历每一项设置参数向后台发送请求,并当取得结果时就附到每一项目上,作为参考,这是一个异步加循环控制的过程。同步和异步特点可以提高前端的响应顺序和效果。

状态变量。Ajax脚本只支持浏览器级别的全局变量,在页面或函数的生存周期内。或者通过cookie来保存状态值,或者通过在每个请求插入参数作为状态值,或者在后台提供自动分辨请求状态的机制。不过RIA下,基本不需要改变页面的状态,页面存在多久,状态变量也存在多久。

访问控制。在Ajax之前,一个页面基本对应一次请求,请求的安全性表现在对页面的安全性控制上。而Ajax脚本则分割成许多的子请求,每个请求相对独立,这就要求在粒度划分上要求将每个请求看为一次业务功能,对应后台一个构件,必须在后台实现对每个请求的安全性控制。不过这有利于为后台划分更精细更独立的Web构件。

技术支持。针对普通的Web服务,Ajax采用httpRequest对象和参数化post/get参数来请求Web构件,同步或异步地组装Web构件,见下文实例分析;针对WebService,扩展WebServices库[7]对构件请求和响应处理,组装到前端应用中,见文献[7]。

4 Web组装实例

广东省教育行业政府协议采购系统是一个B/S模式的Web应用系统,实现“委托书-订单-合同”的协议采购过程。其中,委托书草稿管理环节使用Ajax脚本组装Web服务,实现一个RIA应用。

委托草稿管理的流程为:1) 取得最近委托草稿编号,保存;2) 根据编号分别取得委托书信息(b1),委托项目集(b2),可追加的品目(b3);3) 当追加新项目时,根据编号重新加载信息(b1-b3)。标号与图2对应。

4.1 后台Web服务描述

后台提供5种Web构件:

1)获取最近草稿编号:getLatestDraftId

输入: String:userId

输出(XML):…

2)获取委托草稿信息: getCmsDetail

输入: String:Id

输出(XML):…

3)获取委托草稿项目集: getCmsRecds

输入: String:cmsId

输出(XML):…

4)获取可追加品目:getValidCategory

输入: String:cmsId

输出(XML):…

5)追加新委托品:addNewCmsRecd

输入:String:cmsId, category, brand, spec, unit;

Double: price,amount; Integer: count

输出(XML):…

4.2 前台Ajax脚本

// Request是prototype原型封装的请求类

var cmsId; //全局编号

var url_DraftId, url_CmsInfo, url_CmsItems,

url_Categorys, url_addNew;//初始请求URL

function getLatestDraftId(rqUrl,idArea){

new Ajax.Request(rqUrl, //请求后台

{method : 'get', asynchronous : false,//同步

onSuccess : function(transport)

{ /* 处理响应,设置cmsId , 设置idArea内容*/ }

});

}

function setCmsInfo(rqUrl,draftInfoForm){

var param = "cmsId="+ cmsId;//设参数

new Ajax.Request(rqUrl,//请求后台

{ method : 'post', parameters : params,

asynchronous : false,//异步

onSuccess : function(transport)

{ /*处理响应 设置draftInfoForm内容 */ }

});

}

function setCmsItems(rqUrl, tableArea){

var param = "cmsId="+ cmsId;//设参数

//异步请求后台,将委托项查询结果加到tableArea

//与setCmsInfo相类似,略

}

function setCategorys(rqUrl, categoryBar){

var param = "cmsId="+ cmsId;//设参数

//异步请求后台,将品目录查询结果加到categoryBar

//与setCmsInfo相类似,略

}

function addNewRecd(rqUrl,addForm){//按钮触发

//验证addForm各个项的有效性

var param = "cmsId="+ cmsId + //取得表单参数

"&category=" + addForm.category + …;//其他

new Ajax.Request(rqUrl,//请求后台

{ method : 'post', parameters : params,

asynchronous : true,//同步

onSuccess : function(transport)

{ //处理结果,并刷新整体页面,重载入

setCmsInfo(url_ CmsInfo, "draftInfoForm

setCmsItems (url_ CmsItems, "tableArea");

setCategorys(url_Categorys, "categoryBar");

}

});

}

function bodyOnload(){//加载页面时启动函数

getLatestDraftId(url_, "idArea");//同步

//以下三个异步加载

setCmsInfo(url_ CmsInfo, "draftInfoForm");

setCmsItems (url_ CmsItems, "tableArea");

setCategorys(url_Categorys, "categoryBar");

}

以上每个函数都是脚本代码块,实现与后台Web构件交互。其中bodyOnload函数在页面加载时触发,并组合4个函数,getLatestDraftId必须完成后才能执行其他3个,而其他3个是同时向服务器请求的。同理,addNewRecd函数是在提交按钮时触发,首先验证表单正确性,验证成功后异步请求后台,重载委托书及项目及品目的信息。

5 结束语

Internet的发展,Web技术的广泛应用。一方面,Ajax是老技术新应用,许多基于Ajax的框架也开发成形;另一方面,厂商开始专注于提供各种Web构件,横跨搜索、邮件及电子商务等领域,通过组装这些构件,可以使互联网形成一个更大的分布式集群。本文提出使用Ajax脚本来组装Web构件的新概念,用这种技术来实现Web构件的前端组装,实现系统对RIA的完全支持。随着技术的不断深入,相信不久以后Ajax脚本组装将成为RIA的应用的典范。

参考文献:

[1] 杨芙清,梅宏.构件化软件设计与实现[M].北京:清华大学出版社,2008:1-28,250-259.

[2] Szyperski C.构件化软件-超越面象对象编程[M].北京:电子工业出版社,2008.

[3] Bachmann F.Technical Concepts of Component-Based Software Engineering[R].2nd ed.CMU/SEI-2000-TR-008,ESC-TR-2000-007.

[4] 艾萍.软件构件组装基础研究进展[J].计算机工程与设计,2003(12).

[5] 任洪敏,钱乐秋.构件组装及其形式化推导研究[J].软件学报,2003(1).

[6] 涂传滨,杨先亭.征服RIA――基于JavaScript的Web客户端开发[M].北京:电子工业出版社,2009.

[7] Snell J.Call SOAP Web services with Ajax[EB/OL]./developerworks/.

[8] Schwartz R L,Christiansen T.Perl语言入门[M].北京:中国电力出版社会,2000-08.

[9] Chun W J.Python核心编程[M].北京:机械工业出版社,2001-08.

注:本文为网友上传,不代表本站观点,与本站立场无关。举报文章

0

好文章需要你的鼓励

上一篇:无线网络自主学习平台的设计 下一篇:五子棋智能博弈的研究与设计

被举报文档标题:基于Ajax脚本的构件组装技术的研究

被举报文档地址:

https://wenmi.com/article/pzuh7104ivfu.html
我确定以上信息无误

举报类型:

非法(文档涉及政治、宗教、色情或其他违反国家法律法规的内容)

侵权

其他

验证码:

点击换图

举报理由:
   (必填)

发表评论  快捷匿名评论,或 登录 后评论
评论