利用基于Mashup的轻量级应用集成框架构建数字图书馆门户
曾满江, 李勇文
成都医学院图书馆 成都 610083
摘要

设计并实现一个基于Mashup技术的轻量级应用集成框架,该框架采用前端MVC模式以及服务组件架构,具有轻量级、易扩展以及松耦合集成的特点。在该框架的基础上构建数字图书馆门户,实际测试表明该门户系统运行效率高,能快速、低代价地整合各类分布环境下的异构资源。对于中小型图书馆,该解决方案具有较为普遍的适用性。

关键词: Mashup; 应用集成; 数字图书馆门户; 轻量级框架
中图分类号:G250.76
Building Digital Library Portal with Mashup-based Lightweight Application Integration Framework
Zeng Manjiang, Li Yongwen
Library of Chengdu Medical College, Chengdu 610083, China
Abstract

An integrated Mashup-based lightweight application framework is designed and implemented. The framework is easy to expand and loosely coupled integration, which uses a MVC model and the Service Component Architecture (SCA). A digital library portal is constructed based on the framework. And the test shows that the system efficiency is high, and it can quickly integrate all kinds of heterogeneous resources in distributed environment with low-cost. For the middle and small libraries, this solution has a more general applicability.

Keyword: Mashup; Application integration; Digital library portal; Lightweight framework
1 引 言

分布环境下数字资源与服务的集成是当前数字图书馆发展的重点[ 1]。而以Mashup、Ajax、RSS等Web2.0技术为基础的各类集成服务框架和标准则为数字图书馆门户集成服务的发展提供了广泛的基础支撑技术,同时也为数字图书馆门户的构建提供了新的模式。应用集成(Application Integration)是一种在服务与信息层面上整合多种信息系统,并支持这些系统间进行实时的信息和流程交换的解决方案[ 2]。Mashup技术拓展了实施应用集成的技术手段,它作为一种重要的基于用户界面(表示层)级的集成技术,通过Web Feed、REST协议、公共接口API和屏幕抓取等资源获取技术[ 3],将来自多个数据源的内容、界面或者应用功能快速整合成为新的应用或服务。由于Mashup的理念与门户(Portal)概念很相近[ 4],通常基于表示层的Mashup系统其表现形式为个性化门户网页,它通过选择具有标准接口的、内容不同的UI组件,并对它们的位置、外观等属性进行定义,以满足用户的个性化需求[ 5],如iGoogle、My Yahoo、Netvibes等个性化门户系统。为了构建能够快速、低成本地整合分布式异构信息资源与服务,并能给用户带来良好体验的个性化数字图书馆门户,本文设计并实现了一个基于Mashup技术的轻量级应用集成框架。该框架采用了前端MVC模式以及服务组件架构(Service Component Architecture,SCA),具有轻量级、易扩展以及松耦合集成的特点。

2 需求及技术方案
2.1 系统需求分析

目前,数字图书馆门户的解决方案主要分为自主开发、引进成熟的门户系统、与第三方合作开发和采用开源门户系统等4种[ 6]。其中,由于开源门户系统具有低成本的优势以及在使用和拓展上有着更大的自由度,因此在世界范围内越来越多的图书馆转向使用开源的门户系统,如uPortal、 Liferay、Jetspeed等[ 7]。在实际应用中,为了提高门户系统的运行效率和实用性,需要对原开源门户系统的框架体系和功能模块进行一定的本地化开发和优化,但往往开源门户系统的内部实现结构和代码较为复杂,对其进行优化的代价很可能会超出预估。例如,上海图书馆在利用Liferay构建其Web2.0门户的过程中就遇到了类似的问题[ 8]。因此,对于中小型图书馆来说,在人力、财力有限的情况下,利用基于Mashup的轻量级应用集成框架构建一个开发周期短、易于部署以及能为读者提供个性化服务的数字图书馆门户是一种较为可行的解决方案。

2.2 基于Mashup的轻量级应用集成框架

文献[9]提出了基于Mashup的轻量级应用集成框架应具备的几个特点:

(1)集成的对象应该是粗粒度的。集成的对象是一个基于互联网或局域网,并且整合了数据、业务逻辑和表示层(UI)的独立应用。因此,同传统二进制组件模型(如企业级的Java Bean和COM)相比,轻量级应用集成框架能够提供一个更加灵活的、可重用的组件模型。

(2)组件间应具有低耦合度。在Mashup的应用中,内容与服务通常由多个能将分布式网络资源聚合在表示层的UI组件来呈现,而组件间的低耦合度将使各个组件之间的依赖性和制约比较小,更改一个组件较少甚至完全不会影响到其他的模块,因此轻量级应用集成框架能够适应不断变化的业务需求,根据业务需求更轻松地使用和组合服务。

(3)使用成熟的JavaScript库。由于应用集成框架需要广泛地使用客户端脚本语言,因此使用现成的JavaScript库可以方便地实现DOM 操控、CSS处理与导航、事件处理、良好的用户界面效果和Ajax 功能,同时也能尽量减小由于各种浏览器采用不同JavaScript引擎所造成的页面显示差异。

基于以上几点原则,本文设计并开发了基于Mashup的轻量级应用集成框架,其系统结构如图1所示:

图1 基于Mashup的轻量级应用集成框架

整个框架分为客户端和服务端两部分:

(1)客户端在轻量级前端门户框架JPolite的基础上开发,JPolite框架是Google Code上的一个开源项目,旨在使Web开发者能够以一种方便快捷的方式在Web前端进行内容集成[ 10]。该框架以jQuery为基础构建,并采用了前端MVC模式将数据模型、视图和逻辑控制器三个主要模块全部驻留在客户端,其主要特点为能灵活地控制页面布局、实现各UI组件自由拖曳以及提供简单的UI控件(如Tag、Accordion)等。与常用的Mashup表示层对象组件Portlet和Widget[ 3]不同,JPolite框架采用了一种类似于Liferay中的IFrame Portlet方式[ 11]实现内容集成,它通过jQuery中的Load方法[ 12]将参数URL指向的外部资源载入UI组件中,这种集成方式最大的优势在于不受平台与协议标准的限制,能实现多种异构资源的快速聚合。本系统在功能上对JPolite框架进行了扩展与完善,开发了个性化服务模块、添加了UI组件的状态管理以及外观设置方面的一些基本功能等。

(2)根据客户端架构与需求自行开发了本系统的服务端。在服务端内部主要包含了一系列用于集成各种分布资源的服务组件(Service Component),而在客户端中每一个UI组件都绑定了一个与其相对应的服务组件。服务端集成的对象既可以是基于局域网的信息系统或内部服务,也可以是基于互联网的各种应用资源,其中大部分对象都将采用Mashup方式(如Web Feed、OpenAPI和屏幕抓取等)进行集成,同时为了便于对本地遗留系统的整合,也少量采用了基于数据层的集成方式。在服务端采用了Windows+Apache+PHP+SQL Server 2000的开发环境。

3 系统关键模块的实现
3.1 UI组件模块(View)

在轻量级应用集成框架中,UI组件表现为在浏览器中的一系列为用户呈现集成内容的窗口。对于用户来讲,UI组件隐藏了服务端组件的细节,是Mashup框架中存在的唯一实体[ 13]。UI组件模块的主要功能是提供UI组件模板和UI组件容器。

(1)UI组件模板

UI组件模板为所有UI组件提供了一个可重用的框架,包含了UI组件的关闭、刷新、最大(小)化等基本功能,以及用于呈现各集成资源内容的DIV容器ModuleContent。UI组件模板完全用HTML语言来描述,而其基本功能的实现则是通过DOM事件来触发相应的JavaScript函数。例如,当用户点击最小化按钮后,则会触发minModule函数隐藏当前UI组件中呈现资源内容的DIV容器,其代码如下:

function minModule() {

$(this).hide().parents(".moduleFrame").children(".moduleContent").hide();//隐藏DIV容器

$(this).siblings(".action_max").show();//显示“最大化”按钮};

(2)UI组件容器

逻辑控制模块调用UI组件模板及用户数据模型中的各个UI组件的属性后,将生成的UI组件页面传入UI组件容器(Containers)。而UI组件容器则是将门户页面划分为三个ID分别为c1、c2和c3的DIV层。这样通过设定每个DIV层的宽度以及每个UI组件所对应的容器ID号,可以很容易调整每个UI组件的大小和确定每个UI组件在门户页面中的位置。

3.2 用户数据模型(Model)

轻量级框架采用了客户端用户数据模型,这样在客户端逻辑控制模块能快速地利用用户数据模型进行同步业务处理。同时在用户数据模型中采用了结构化的JSON数组或对象来存储数据,使得这种同步业务处理的效率明显提高。

用户数据模型为一个名称为modules.js的JavaScript数据文件,其中JSON对象_modules存储了每个UI组件的编号(ID)、对应服务组件(URL)、标题(Title)以及颜色(Color),JSON数组_layout存储每个UI组件所对应的容器ID号(c1,c2,c3)以及所属的标签(Tag),而JSON对象_tabs中则定义了各标签中每个UI组件容器的宽度(像素值或百分比),其定义格式分别如下:

var _modules={

m101:{l:"modules/lib.php",t:"图书馆公告",c:"blue"},

m102:{l:"modules/rss.php?q= http://news.baidu.com/n?cmd=4&class=internews&tn=rss ",t:"国际新闻", c:"orange"}, …};

var _layout=[

{i:′m101′,c:′c1′,t:′t1′},

{i:′m102′,c:′c2′,t:′t2′},…];

var _tabs={

t1:{c1:"33.3%",c2:"33.3%",c3:"33.3%"},

t2:{c1:"50%",c2:"0",c3:"50%"},…};

3.3 逻辑控制模块(Controller)

逻辑控制模块是UI组件与服务组件之间的连接模块,主要完成读取各个UI组件的属性、加载集成资源内容和提供个性化服务功能。

(1)UI组件控制模块

UI组件控制模块中封装了三个函数loadLayout、addModule和loadContent来实现UI组件属性的读取及内容加载。从系统流程来看,UI组件的初始化及内容加载是由用户打开或刷新页面来触发的,因此三个函数需要在页面DOM加载完成后立即执行。系统流程如图2所示。

图2 UI组件控制模块系统流程

函数loadLayout首先遍历变量_layout中的值,并根据每组数据中UI组件的ID值读取变量_modules中相应的UI组件初始属性并传入函数addModule中。函数addModule接收到参数后,针对每一组UI组件属性调用UI组件模板生成相应的UI组件对象,并将每个UI组件对象所对应的服务组件(URL)传递给函数loadContent。而函数loadContent则通过Ajax方式请求参数URL指向的服务组件,并将返回内容加载到DIV容器moduleContent中,其代码如下:

jQuery.fn.loadContent = function(url) {

return this.each(function() {

if (url ==") return;

x = $(".moduleContent", this);//选择当前DIV容器

x.load(url);//利用Load方法载入服务组件返回的内容

this.loaded = true;

});};

(2)个性化服务模块

个性化服务模块通过用户数据模型直接与OPAC系统中的用户信息连接。当用户登录系统后,个性化服务模块首先读取该用户个性化信息并加载用户定制的UI组件,如果用户为首次登录,则系统直接加载默认上网起始页。个性化服务模块采用发布/订阅(Publish/Subscribe)的模式,实现用户按需定制内容的功能。如图3所示,用户可通过点击“添加模板”菜单中的图标来选择所需要的UI组件,同时也可以通过输入RSS地址,自行定制UI组件内容。

图3 添加模块菜单

在用户使用过程中,个性化服务模块将对用户行为进行跟踪,用户的任何定制操作将会被实时地记录到本地Cookie中。当用户退出系统时,个性化服务模块则会将该用户定制的个性化信息传入用户数据模型并保存到数据库中。

3.4 服务组件模块

服务端基于SCA架构,由若干个服务组件构成。服务组件包含对异构远端服务(Web Feed、OpenAPI等)的引用,同时也提供了UI组件获取数据内容的接口,而服务组件通过HTML流将数据传回UI组件。在框架的服务端包含了以下服务组件:

(1)Web Feed类组件。在服务端,Web Feed类组件用于实现RSS资源聚合(Aggregation),它使用PHP中的SimpleXML扩展解析从指定的RSS Feed 获取数据(XML),然后将其格式化处理后传回相应的UI组件。

(2)OpenAPI类组件。此类组件主要用于获取基于REST风格的OpenAPI资源,该组件实现的主要流程包括接收用户请求(如搜索关键字)并将请求转发到远端API服务器,解析请求结果(通常为XML或JSON格式),最后再返回经格式化处理后的解析结果。

(3)网页抓取类组件。由于部分公共领域的数据没有提供API或RSS订阅功能,因此对于这部分资源内容或资源则需要直接从网页获取。在该组件中,屏幕抓取使用了PHP Simple HTML DOM解析器[ 14]从一个URL或者文件创建一个DOM对象,并在DOM树中提取出相应的信息。

(4)DB类组件。为了便于整合本地OPAC系统以及存储用户个性化信息,DB类组件提供了对底层数据库的操作接口,可直接在本地数据库中检索或存储数据。

4 数字图书馆门户的实现

本文在轻量级集成应用框架构的基础上构建了数字图书馆门户,整个平台实现了各个UI组件页面可拖曳、内容可定制并且界面友好的个性化主页,读者可以根据个人兴趣和行为习惯打造出属于自己的图书馆主页,如图4所示。

图4 个性化数字图书馆门户首页

4.1 系统应用实例

整个门户系统的应用围绕“栏目”展开,栏目从应用功能上可分为3大类,用户可通过点击首页上部的不同标签(Tag)选择相应的类目:

(1)图书馆应用类。该类为校园网内部信息资源与图书馆相关应用的聚合,它包括一些与图书馆应用相关的栏目,其中图书馆公告、校园新闻及公告栏目分别利用网页抓取组件从图书馆网站和校园网站抓取信息,其余如个人借阅信息及图书续借、图书检索、借阅排行、新书推荐4个栏目则通过DB类组件访问OPAC系统后台数据库的方式来实现应用。

(2)互联网应用类。在该类中整合了目前应用较为广泛的一些互联网资源,对于这部分资源主要通过服务端的OpenAPI类组件来实现应用。此类应用目前实现了整合网络搜索、谷歌图书搜索、MySpace社会网络、Flickr图片搜索、在线地图等多个栏目。

(3)综合信息类。该类资源主要通过服务端的Web Feed类组件实现应用。该类栏目在内容定制方面给予了用户最大的灵活性,因为这里不仅有图书馆为用户推荐的各类具有代表性的固定RSS Feed栏目,而且用户也可以自行输入RSS Feed定制个性化栏目。

需要指出的是,以上栏目的实现仅仅是初步运用了Mashup技术手段将各种分布环境下的异构资源聚合到门户中。然而数字图书馆门户还应根据用户的需求,利用自身的专业特点,有针对性地开发专业服务,并与网络上其他适合的应用服务进行Mashup,进而开发出一种全新的信息服务[ 15]

4.2 测试及效果分析

整个门户系统于2010年11月发布以来,目前还处于为期6个月的测试中。进行测试的目的是通过反复测试,力求系统的稳定和完善;进行读者调查,听取用户的建议,提出对门户的修改方案。

从目前的测试情况看,由于门户系统采用了轻量级应用集成框架,因此整个平台的运行效率较高、框架加载速度快,但在测试时发现系统的瓶颈往往出现在各个UI组件页面的加载上。特别是使用网页抓取类组件获取远程资源时,由于需要读取及解析一个完整页面的HTML编码,其平均加载时间超过5秒,甚至有时还会出现加载超时的情况。针对这种情况,作者对服务组件的部署策略进行了调整,对于远程资源只采用返回数据量较少的Web Feed和OpenAPI这两种方式获取,同时尽量选用较XML来说更为轻量级的返回数据格式JSON,而网页抓取类组件只用于本地资源的获取。

在门户系统测试期间发布了在线的读者调查表,用于收集读者对于门户的反馈信息。调查表发布一个月内总计收回52份,其中对新门户系统的总体评价情况为:有23.1%(12人)的读者非常满意,53.8%(28人)的读者基本满意,总体评价满意度超过70%。

5 结 语

利用Mashup技术的简单、轻量级、易扩展以及松耦合集成等特点, 能够很好地支持海量分布式异构信息资源与服务的整合。而基于Mashup技术的轻量级应用集成框架不仅为数字图书馆门户的构建提供了一个易开发、易部署、易应用的基础支撑平台,而且组件化的设计为该平台带来了良好的扩展性,图书馆可以很方便地拓展数字图书馆功能,方便其开展各种个性化的信息利用服务。然而在该平台的基础上,如何使集成的各种分布式网络资源同图书馆自身的专业资源与服务更深入地结合,实现图书馆各种信息服务更高程度的增值,将是本项目下一步研究与实践的目标。

The authors have declared that no competing interests exist.

作者已声明无竞争性利益关系。

参考文献
[1] 张晓林. “网络集成服务标准: 走向综合信息集成服务的基石”专辑序[J]. 现代图书情报技术, 2007(5): 1. [本文引用:1]
[2] Linthicum D S. Next Generation Application Integration: From Simple Information to Web Services[M]. Addison-Wesley Professional, 2003: 1-2. [本文引用:1]
[3] 李峰, 李春旺. Mashup关键技术研究[J]. 现代图书情报技术, 2009(1): 44-49. [本文引用:2]
[4] 窦平安, 靖继鹏. 用于网络信息实时共享与集成的混搭技术[J]. 情报科学, 2009, 27(4): 571-575. [本文引用:1]
[5] 李春旺, 肖伟. 集成融汇: 概念、模式与应用[J]. 现代图书情报技术, 2008(12): 22-26. [本文引用:1]
[6] 钟远薪. 暨南大学图书馆2. 0网站系统构想与进展[R]. 重庆: 中国图书馆Lib2. 09年会, 2009. [本文引用:1]
[7] 唐维. 国内图书馆门户建设的问题及对策[J]. 图书馆学刊, 2010, 32(4): 104-105. [本文引用:1]
[8] 卢颖. 个性化的图书馆资源与服务门户的尝试—基于Ajax的图书馆Web2. 0门户实践[J]. 数字图书馆论坛, 2008(4): 25-33. [本文引用:1]
[9] Ye W, Hu W, Gao X, et al. A Mashup Platform for Lightweight Application Integration[C]. In: Proceedings of the 2009 International Conference on New Trends in Information and Service Science. IEEE Computer Society, 2009: 27-32. [本文引用:1]
[10] jpolite-Project Hosting on Google Code[EB/OL]. [2011-02-12]. http://code.google.com/p/jpolite/. [本文引用:1]
[11] IFrame Portlet[EB/OL]. [2011-02-12]. http://www.liferay.com/zh/community/wiki/-/wiki/Main/Iframe+Portlet. [本文引用:1]
[12] load()-jQuery API[EB/OL]. [2011-02-12]. http://api.jquery.com/load/. [本文引用:1]
[13] Liu X, Hui Y, Sun W, et al. Towards Service Composition Based on Mashup[C]. In: Proceedings of 2007 IEEE Congress on Services. IEEE Computer Society, 2007: 332-339. [本文引用:1]
[14] PHP Simple HTML DOM Parser[EB/OL]. [2010-11-20]. http://simplehtmldom.sourceforge.net/manual.htm. [本文引用:1]
[15] 李凌. 基于图书馆信息服务的Mashup Application[J]. 图书馆研究, 2009(4): 68-70. [本文引用:1]