数据服务空间组合实现_第1页
数据服务空间组合实现_第2页
数据服务空间组合实现_第3页
数据服务空间组合实现_第4页
数据服务空间组合实现_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要随着计算机网络技术的飞速发展,互联网上可用的数据资源剧增。数据在数据模型和数据模式上存在很大差异,形成了大量的异构数据源。如何构建一个便捷的数据集成平台,集成各种异构的数据源中的数据,满足用户个性化的数据集成需求,成为一个亟待解决的问题。数据服务空间(DataServiceSpace,简称DSS)系统是一个可以将网页、WebAPI以及主流关系型数据库中的数据封装为服务并通过服务组合实现异构数据集成的系统。本文在DSS系统的基础上进行了改进,优化了创建服务的过程,增添了登录注册、用户权限管理、多条件服务查询、服务删除、用户个人信息管理、服务推送以及百度地图功能。系统实现中采用的主要技术有AJAX、GWT、DWR等,其中,利用AJAX实现数据的无刷新提交,利用GWT实现Java代码到JavaScript的快速转换,利用DWR实现服务器端数据的推送。系统采用B/S架构设计,界面简洁,方便操作,可以满足普通用户对各种异构数据源中的数据的集成需求,为异构数据源的集成带来极大的便利。关键词:数据服务空间;数据服务管理;地图服务

AbstractWiththerapiddevelopmentofcomputernetworktechnology,availabledataresourcesontheInternetincreasedynamically.Thereisaenormousdifferenceintheirdatamodelsandpatterns,thusmanyheterogeneousdatasourcescomeinbeing.Formingaconvenientdataintegrationplatformtoimprovetheeffectiveuseofinformationdatatomeettheindividualneedsofdataintegrationhasbecomeanurgentproblemtobesolved.DataServiceSpace(DSSforshort)isasystemthatcanintegratedataasaservicefromtheWebPages,WebAPIs,andpopularRDBMSandalsocancombinetheseservicestointegratetheheterogeneousdatasources.BasedontheDSS,wemakeanimprovementinoptimizingtheprocessofcreatingaservice,addingthefunctionoflogin,registration,userrights’management,searchingserviceswithmultipleconditions,deletingservices,users'personalinformationmanagement,pushingservice,andanapplicationoftheBaiduMap.ThemaintechnologiesusedareAJAX,GWT,andDWR.AJAXisusedtosubmitdatawithoutrefresh,andGWTisusedtoconverttheJavacodetoJavaScriptcoderapidly.Inaddition,weuseDWRtopushmessagesoftheserver.ThesystemisdesignedwiththeB/Sarchitecturedesign.Itisveryeasytooperatebecauseofsimpleinterface.Itcanmeettheneedsofenduserstointegratedatafromheterogeneoussources,andbringgreatconvenienceinintegratingtheheterogeneousdatasources.Keywords:DataServiceSpace;DataServiceManagement;mapservice

目录TOC\o"1-2"\h\z\u第一章绪论 51.1课题背景和意义 51.2研究开发现状分析 51.3系统总体介绍 71.4论文组织 7第二章相关工具与技术 92.1相关工具 92.2相关技术 9第三章需求分析 133.1业务分析 133.2系统功能分析 183.3系统非功能分析 26第四章系统设计 294.1体系架构 294.2功能模块 294.3数据库设计 314.4系统详细设计 35第五章系统实现 405.1系统物理结构 405.2系统物理部署 405.3主要功能的实现 425.4遇到的问题和解决方法 67第六章总结与展望 696.1总结 696.2展望 69参考文献 70致谢辞 71附录一英文原文 72附录二中文翻译 82

第一章绪论1.1课题背景和意义21世纪以来,随着互联网的快速普及和迅猛发展,信息以前所未有的速度不断地增长,人们通过各种途径产生了各式各样的数据,这些数据不仅量大而且结构各异,有结构化的数据,如数据库;半结构化的数据,如邮件、HTML等;以及非结构化的数据,如文本、音频、视频、图像等。由于不同企业和部门对信息的需求不同,处理方式不同,所使用的信息系统也各不相同,使得不同数据源中的数据无法相互关联,形成了一个个的“信息孤岛”。如何将这些孤立的数据信息集成起来,形成一个数据集成平台,方便人们有效的对这些数据进行个性化的分析和利用,实现资源信息的有效共享,就成为一个迫切需要解决的问题。本课题设计实现了数据服务空间(DataServiceSpace,简称DSS)系统的用户管理和数据服务管理模块。DSS是北方工业大学云计算研究中心设计开发的一个面向最终用户的数据集成系统,可以将来自网页、WebAPI以及主流关系型数据库中的数据封装为服务,并可以通过服务的组合实现异构数据的集成。本文系统开发的目的是为了进一步改进DSS系统。系统采用B/S架构,对界面进行优化,方便用户使用,更好地满足用户的数据集成需求。本课题主要完善DSS的系统功能,完善后的系统将参加中国计算机学会举办的2013年“软件研究成果原型竞赛”。1.2研究开发现状分析1.2.1研发现状近年来,随着Web2.0的发展,各种新技术不断涌现,这些新技术完全可以满足本课题所要实现的功能。其中,系统为减少用户等待需要利用AJAX技术实现各种表单数据的无刷新提交,如登录、注册表单的提交;系统为方便调试前端的AJAX程序需要利用GWT实现Java代码到JavaScript代码的快速转换,使用Java编写服务创建的后台代码后利用GWT编译器将其编译为前端的JavaScript代码,再利用GWT的开发者模式可以方便的进行调试;系统为实现服务的即时推送功能需要利用DWR的反向AJAX功能来实现,如可以实现创建删除服务的服务器端数据的及时推送等。综上对国内外研究现状的调查,我们有以下结论:(1)通过使用AJAX,运行于网页上的JavaScript代码直接与服务器进行通信。开发者可以在不刷新整体页面的情况下与Web服务器进行数据交换。AJAX在浏览器与Web服务器之间使用异步数据传输(HTTP请求),这样就可使网页从服务器请求少量的信息,而不是整个页面,大大降低了服务器的负载,最重要的是,这样的刷新方式更易于被用户所接受,降低了用户端浏览器的工作量,增强了用户体验。(2)通过使用GWT,可以用Java编程语言开发界面,方便的实现客户端和服务器端的通信。如果用传统的方式JavaScript进行AJAX开发的话,就会使得应用程序非常难以进行调试,从而降低了生产效率。GWT有望为我们解决这个难题,它使程序员用Java同时开发客户端和服务器端的代码。GWT的编译器会把用于开发客户端的Java代码转化成JavaScript和HTML,而程序员不用关心这一转换过程。(3)通过使用DWR,从Java到JavaScript的远程功能方法给DWR的用户带来非常像传统的RPC机制,就像RMI或者SOAP一样,而且拥有运行在Web上但是不需要浏览器插件的好处,更加方便服务器与客户端之间的通信。1.2.2开发的必要性DSS系统的缺点是界面操作不友好,创建服务过程繁琐,而且没有登录注册、权限管理、服务管理、个人信息管理等功能。因此,要实现系统面向最终用户,方便最终用户操作的目的,需要进行改进。1.3系统总体介绍本文系统开发的目的是为了进一步改进DSS系统,增强系统功能,优化界面设计,方便用户使用,使之更好地满足用户个性化的数据集成需求。课题需要完成的功能主要包括:(1)用户登录注册功能。重点是使用邮件激活账户和找回密码功能;(2)用户权限管理功能;(3)用户个人信息管理功能;(4)对数据服务封装、组合的界面优化。数据服务封装的界面优化又分为封装网页为服务界面的优化、封装WebAPI为服务界面的优化、封装关系型数据库为服务界面的优化;(5)数据服务管理功能,主要包括:1)数据服务的删除;2)定时刷新同步数据;3)服务种类动态显示;4)新建与删除服务的推送功能等;5)数据服务的多条件检索功能。包括按服务名称检索、按服务描述检索、按服务类型检索、按服务创建者检索;(6)数据服务空间典型应用:封装的点评网服务与百度地图服务相结合的服务应用。1.4论文组织本文第一章介绍论文研究背景,研究开发现状以及主要研究内容;第二章介绍本文研究内容的相关技术与工具;第三章介绍了系统的需求分析,包括业务分析、系统功能分析、系统非功能分析;第四章介绍系统的设计过程,包括总体架构设计、静态结构设计、业务用例的实现、数据库的设计以及类的设计;第五章介绍系统的实现过程,包括物理结构的实现、物理部署的实现、主要类的实现、主要功能的实现以及实现中遇到的问题和解决方法;第六章总结全文,并展望下一步的工作。

第二章相关工具与技术2.1相关工具本平台应用基于JavaEE平台,使用EclipseJavaEEIDE在32位WindowsXP桌面系统环境下开发完成。系统开发使用EclipseHeliosServiceRelease2作为开发工具,应用服务器前期使用Jetty作为服务器,后期改用Tomcat6.0.323作为服务器;关系数据库采用MySQL5.5.15-win32;前端页面主要使用JSP+GWT2.1进行开发。2.2相关技术2.2.1XML可扩展标记语言(ExtensibleMarkupLanguage,XML),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML是标准通用标记语言(SGML)的子集,非常适合Web传输。XML提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。XML设计用来传送及携带数据信息,不用来表现或展示数据,HTML语言则用来表现数据,所以XML主要用途的焦点是它说明数据是什么,以及携带数据信息。主要用途如下:(1)丰富文件(RichDocuments):自定文件描述并使其更丰富;(2)属于文件为主的XML技术应用;(3)标记是用来定义一份资料应该如何呈现;(4)元数据(Metadata):描述其它文件或网络资讯;(5)属于资料为主的XML技术应用;(6)标记是用来说明一份资料的意义;(7)配置文档(ConfigurationFiles):描述软件设置的参数。本系统将各种异构数据源中的数据转化为XML,并结合相关的前台呈现技术,最终使用嵌套表格来展现服务所提供的数据。2.2.XPath即为XML路径语言(XMLPathLanguage),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。XPath是一门在XML文档中查找信息的语言。XPath用于在XML文档中通过元素和属性进行导航。XPath使用路径表达式在XML文档中进行导航;XPath包含一个标准函数库;XPath是XSLT中的主要元素;XPath是一个W3C标准。最常见的XPath表达式是路径表达式(XPath这一名称的另一来源)。路径表达式是从一个XML节点(当前的上下文节点)到另一个节点、或一组节点的书面步骤顺序。这些步骤以“/”字符分开,每一步有三个构成成分:(1)轴描述(用最直接的方式接近目标节点);(2)节点测试(用于筛选节点位置和名称);(3)节点描述(用于筛选节点的属性和子节点特征)。2.2.3AJAXAJAX即“AsynchronousJavaScriptandXML”(异步JavaScript和XML),AJAX并非缩写词,而是由JesseJamesGaiiett创造的名词,是指一种创建交互式网页应用的网页开发技术。AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。通过AJAX,运行于网页上的JavaScript代码可以使用XMLHttpRequest对象来直接与服务器进行通信。通过这个对象,开发者可以在不刷新整体页面的情况下与Web服务器进行数据交换。AJAX在浏览器与Web服务器之间使用异步数据传输(HTTP请求),这样就可使网页从服务器请求少量的信息,而不是整个页面,大大降低了服务器的负载,最重要的是,这样的刷新方式更易于被用户所接受,降低了用户端浏览器的工作量,增强了用户体验。今天,AJAX技术已经广泛应用于各种Web应用当中,通过AJAX,因特网应用程序可以变得更完善,更友好。本系统在页面中使用AJAX向服务器发送各种请求,实现页面无刷新并自动响应结果。2.2.4GoogleWebToolkit的缩写,有了GWT就可以使用Java编程语言编写AJAX前端,然后GWT会交叉编译到优化的JavaScript中,而JavaScript可以自动在所有主要浏览器上运行。GWT允许开发人员使用Java编程语言快速构建和维护复杂但性能高的JavaScript前端应用程序,从而降低了开发难度,尤其是与EclipseGoogle插件结合使用时,优势更明显。目前GWT的应用还不是特别广泛,包括Google自己的Gmail等系统都不是用GWT开发。但是在这一些电子领域里GWT已经有厂商使用GWT开发设备上的用户界面,从而实现远程本地一套代码的效果。本系统使用GWT构建各个服务封装和组合的主要界面,同样实现无刷新提交请求并进行响应。2.2.5DWR(DirectWebRemoting)是一个用于改善Web页面与Java类交互的远程服务器端AJAX开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在Web服务器上的Java函数,就像它在浏览器里一样。它包含两个主要的部分:允许JavaScript从Web服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容.DWR采取了一个类似AJAX的新方法来动态生成基于Java类的JavaScript代码。这样Web开发人员就可以在JavaScript里使用Java代码,就像它们是浏览器的本地代码(客户端代码)一样;但是Java代码运行在Web服务器端而且可以自由访问Web服务器的资源。出于安全的理由,Web开发者必须适当地配置哪些Java类可以安全的被外部使用。这个从Java到JavaScript的远程功能方法给DWR的用户带来非常像传统的RPC机制,就像RMI或者SOAP一样,而且拥有运行在Web上但是不需要浏览器插件的好处。本系统使用DWR来实现创建与删除服务的及时推送功能。

第三章需求分析本系统并不像传统软件开发一样有明确的需求,所有的功能依据系统的应用场景分析得出。3.1业务分析3.1.1业务范围系统用户主要分为两类:普通用户和管理员。业务用例图如图3.1所示:图3.1业务用例图本文系统完成的普通用户的功能主要包括:登录、创建服务(部分功能)、检索服务、使用服务、编辑删除自己的服务、管理个人信息以及使用百度地图应用的功能。管理员除了具有普通用户的一切功能之外,还能够编辑删除所有人发布构造的服务。游客只能浏览本系统的帮助界面以及进行注册。3.1.2业务领域模型本系统的业务领域模型图中主要包括用户、服务两类实体,而服务又分为四类,它们之间的关系如图3.2所示:图3.2业务领域模型图3.1.3核心业务流程活动图游客的注册活动图,如图3.3所示。图3.3注册活动图(2)已注册用户的登录活动图,如图3.4所示。图3.4登录活动图(3)创建服务活动图,这里以创建封装WebAPI的服务为例,如图3.5所示。图3.5创建服务的活动图(4)删除服务活动图,如图3.6所示。其中结束1指的是用户删除服务操作活动的结束,结束2指的是系统整个删除活动流程的结束。图3.6删除服务的活动图(5)浏览服务活动图,如图3.7所示。图3.7浏览服务的活动图流程图:用户登录流程图,如图3.8所示:图3.8用户登录流程图用户注册流程图,如图3.9所示:图3.9用户注册流程图创建服务的流程图,这里以创建封装WebAPI的服务为例,如图3.10所示:图3.10创建服务的流程图3.2系统功能分析3.2.1普通用户的用例图如图3.11所示:图3.11普通用户功能用例图3.2.2用例规约下面是主要用例的详细描述。(1)登录用例名称登录参与者普通用户前置条件用户访问该网站且未登录后置条件进入网站服务展示界面事件流基本路径:(1)用户点击登录按钮,用例开始(2)用户个人登录信息录入到系统中,确认提交(3)系统查找用户表,并返回登录结果,用例结束。可选路径:(1)在提交请求前的任何时候,都可以选择取消,该用户不会被登录(2)在基本路径(2)中,如果输入的信息不正确,系统将提示修改这些信息(3)在基本路径(3)中,如果用户登录失败,系统将给出失败提示(2)创建封装网页的服务用例名称创建封装网页的服务参与者普通用户前置条件用户访问该网站且已成功登录后置条件成功创建该服务事件流基本路径:(1)用户点击CreateClippers链接,用例开始(2)用户将网页地址录入到系统中,点击Open按钮(3)系统根据用户输入的网址进行处理,打开响应的网页(4)用户选取数据或链接,点击AddProperty添加相应的名称(5)用户点击Create按钮,系统弹出服务信息输入界面(6)用户输入创建的服务所需信息,确认提交(7)系统提示用户创建结果,用例结束。可选路径:(1)在提交创建服务请求前的任何时候,都可以选择取消,该服务不会被创建(2)在基本路径(2)、(6)中,如果输入的信息不正确,系统将提示修改这些信息(3)在基本路径(7)中,如果服务创建失败,系统将给出失败提示(3)创建封装WebAPI的服务用例名称创建封装WebAPI的服务参与者普通用户前置条件用户访问该网站且已成功登录后置条件成功创建该服务事件流基本路径:(1)用户点击CreateDataServiceWrapper链接,用例开始(2)用户将WebAPI地址录入到系统中,点击Load按钮(3)系统根据用户输入的WebAPI进行处理,返回响应的数据(4)用户点击Create按钮,系统弹出服务信息输入界面(5)用户输入创建的服务所需信息,确认提交(6)系统提示用户创建结果,用例结束。可选路径:(1)在提交创建服务请求前的任何时候,都可以选择取消,该服务不会被创建(2)在基本路径(2)、(5)中,如果输入的信息不正确,系统将提示修改这些信息(3)在基本路径(6)中,如果服务创建失败,系统将给出失败提示(4)创建封装关系型数据库用例名称创建封装数据库的服务参与者普通用户前置条件用户访问该网站且已成功登录后置条件成功创建该服务事件流基本路径:(1)用户点击CreateDataServiceWrapper链接,用例开始(2)用户点击Connect按钮,系统弹出信息输入框(3)用户输入所需链接的数据库的信息,点击输入框中的Connect按钮(4)系统根据用户输入的信息进行处理,返回响应的数据库表列表(5)用户选择想要封装的表,系统自动加载表中的数据(7)用户点击Create按钮,系统弹出服务信息输入界面(8)用户输入创建的服务所需信息,确认提交(9)系统提示用户创建结果,用例结束。可选路径:(1)在提交创建服务请求前的任何时候,都可以选择取消,该服务不会被创建(2)在基本路径(3)、(7)中,如果输入的信息不正确,系统将提示修改这些信息(3)在基本路径(3)、(8)中,如果服务创建失败,系统将给出失败提示(5)创建组合服务用例名称创建服务组合参与者普通用户前置条件用户访问该网站且已成功登录后置条件成功创建该服务事件流基本路径:(1)用户点击CreateMashUp链接,用例开始(2)用户在网页工具栏中选择操作(3)用户点击SaveAs按钮,系统弹出信息输入框(4)用户输入创建的服务所需信息,确认提交(5)系统提示用户创建结果,用例结束。可选路径:(1)在提交创建服务请求前的任何时候,都可以选择取消,该服务不会被创建(2)在基本路径(4)中,如果输入的信息不正确,系统将提示修改这些信息(3)在基本路径(5)中,如果服务创建失败,系统将给出失败提示(6)编辑服务用例名称编辑服务参与者普通用户前置条件用户访问该网站且已成功登录后置条件成功修改该服务事件流基本路径:(1)用户点击相应服务的Edit链接,用例开始(2)用户在网页工具栏中选择操作(3)用户点击Save按钮,确认提交(4)系统提示用户编辑结果,用例结束。可选路径:(1)在提交Save请求前的任何时候,都可以选择取消,该服务不会被修改(2)在基本路径(4)中,如果服务修改失败,系统将给出失败提示(7)删除服务用例名称删除服务参与者普通用户前置条件用户访问该网站且已成功登录后置条件成功删除该服务事件流基本路径:(1)用户点击相应服务的Remove链接,用例开始(2)系统接收到需要删除的服务的相关信息,进行删除(3)系统返回结果,此服务删除,对用户不可见,用例结束可选路径:(4)在基本路径(2)中,如果服务删除失败,系统将给出失败提示(8)检索服务用例名称检索服务参与者普通用户前置条件用户访问该网站且已成功登录后置条件系统将检错结果返回给用户事件流基本路径:(1)用户点击Browse链接,用例开始(2)用户在DiscoverDataServices下面的信息输入框中选择自己的检索条件,点击FindDataService按钮(3)系统进行相应的查找,并返回查找结果,用例结束可选路径:(1)在基本路径(1)中,用户可以点击MyDataService链接进行同样的操作(2)在基本路径(2)中,用户也可以直接点击BrowsebyDomain下面的服务种类链接进行检索(9)使用服务用例名称使用服务参与者普通用户前置条件用户获得相应服务的访问接口后置条件系统将服务的数据内容返回给用户事件流基本路径:(1)用户通过网页或者API同步访问,用例开始(2)系统返回相应服务的数据,用例结束可选路径:(1)在基本路径(2)中,如果用户访问的服务不存在,系统将返回错误提示(10)个人信息管理用例名称个人信息管理参与者普通用户前置条件用户访问该网站且已成功登录后置条件系统提示修改成功事件流基本路径:(1)用户点击user链接,用例开始(2)系统返回相应服务的数据,呈现给用户(3)用户在相应的信息框中修改跟个人信息,确定提交(4)系统返回修改结果,用例结束可选路径:(1)在提交修改请求前的任何时候,都可以选择取消,该信息不会被修改(2)在基本路径(3)中,如果输入的信息不正确,系统将提示修改这些信息(3)在基本路径(4)中,如果信息修改失败,系统将给出失败提示 除去注册功能用例及其描述,系统管理员的功能用例图以及用例描述与普通用户基本一致。目前,系统普通用户与系统管理员的主要区别是:普通用户仅能对自己创建的服务进行删除编辑,管理员对所有服务都可以删除和编辑。3.3系统非功能分析3.3.1运行环境需求系统采用B/S结构设计,部署在ApacheTomcat上运行,与客户端采用HTTP通信协议进行通信。 客户机:外围设备:鼠标,键盘,显示器;

操作系统:装有指定浏览器的各种操作系统;

服务器:外围设备:鼠标,键盘,显示器;

操作系统:Linux或Windows2000以上操作系统;

数据库支持:MySQL5.0以上;

3.3.2系统接口需求(1)用户接口

用户界面要求简洁明了,而且表单操作要求尽量避免使用鼠标。所以数据的填写,控件焦点的转换要自动进行。不同种类数据填写的顺序—即Tab的顺序要符合实际操作的习惯。(2)硬件接口

对于服务器端,应该具有较快的执行速度,较大的存储容量与高速的网络访问速度,因此对此的硬件基本需求如下:服务器端:CPU:1GHz以上硬盘:项目部署后占用磁盘约200M,因此除去系统和各种必须软件所需空间,空闲空间不得少于300M;内存:512M以上。客户端:能够正常运行火狐浏览器且访问网络。(3)软件接口

系统软件的选取是发挥系统功能的关键,好的软件可以增强系统的稳定性、安全性、运行效率。服务器端:JDK1.6以上,Tomcat6.0以上或者Jetty7.0以上,MySQL5.0以上客户端:FireFox3.6.8浏览器,gwt-dev-plugin.xpi火狐插件,foxtidy.xpi火狐插件3.3.3(1)静态数据

在软件开发过程中不可改变的数据,包括用户账号注册时间,用户名,用户邮箱等。(2)动态数据

在软件开发过程中可以改变的数据,除开静态数据以外的数据。要求数据符合以下两点:1)录入处理的准确性及容错性;2)数据的一致性和完整性。3.3.4性能需求平台支持多用户同时正常操作。采用软件默认配置,ApacheTomcat默认最大并发量150个,MySQL默认最大连接数100个。3.3.5质量(1)可靠性。系统应保证在规定的条件和规定的时间内,用户所进行的操作能够顺利完成,如果遇到意外情况,应及时回滚操作,保证系统的可靠性。(2)可用性。系统应具有良好的图形化界面,方便用户操作,以面向最终用户为主。(3)安全性。系统应保证不泄露用户个人信息。

第四章系统设计4.1体系架构系统采用基于B/S结构的三层体系架构,如图4.1所示:图4.1系统体系结构图(1)表示层:用于该平台的用户进行交互以及显示根据特定业务规则进行计算后的结果。本系统采用B/S架构,即用户可以直接通过浏览器访问系统。(2)业务逻辑层:负责平台的业务逻辑处理和表示逻辑生成,支持诸如响应客户请求以及查询等功能。中间层进行逻辑处理,再将处理的结果反馈给客户或者发送到数据库中。(3)数据访问层:数据访问层用于访问底层的数据库系统,这里的数据库系统是指关系数据库系统。4.2功能模块该平台的用户主要有2类:管理员、普通用户。各用户在登录界面进行登录进入网页,完成各种操作。平台的功能如图4.2所示。图4.2系统功能模块图模块描述:注册模块:实现用户注册功能;登录模块:实现用户的登录、找回密码、激活账户的功能;用户信息管理模块:实现用户个人信息的管理;服务管理模块:实现服务的添加、删除、查找、编辑、使用功能;检索服务模块:实现服务的多条件检索以及服务的增加与删除的推送功能;创建服务模块:实现用户对四种服务的创建,包括封装网页的服务、封装WebAPI的服务,封装数据库的服务以及服务组合;本文系统完成的是对四种服务的创建页面的优化以及存储的优化;编辑服务模块:实现用户对服务的编辑功能;本文系统完成的是对服务编辑页面优化以及对可编辑服务的显示“编辑”功能;删除服务模块:实现用户对服务的删除功能;使用服务模块:实现用户对服务的使用功能,包括通过网页同步访问和通过API同步访问;本文系统完成的是定时刷新访问的服务,真正做到同步访问。4.3数据库设计本小节介绍系统的数据库设计,包括数据库逻辑结构设计和数据库物理结构设计。4.3.数据库的逻辑结构设计是把概念结构设计阶段设计的基本E-R图转换为与选用的DBMS产品所支持的数据模型相符合的逻辑结构。下图4.3图和4.4为主要实体的数据库逻辑结构图。图4.3服务实体与用户实体之间的E-R图本系统中存在用户、服务、Clipper服务、DB服务、WebAPI服务及APP服务五个实体,所有的功能都是围绕这五个实体所进行的操作。Clippers服务、DB服务、WebAPI服务及APP服务继承自服务,它们之间的关系都是一对一;用户与服务之间的关系是一对多,即一个用户可以拥有多个服务。4.3.2物理数据库是逻辑数据库的物理实现,它描述了数据库中基本表的物理结构和完整性约束等信息。物理数据库的设计依赖于具体的DBMS,本系统使用MySQL数据库。(1)用户表。只有注册用户才能使用本系统的主要功能。非注册用户只能浏览帮助界面。图4.4展示了用户表的物理结构设计。图4.4用户表(2)服务表。用户创建的任何服务的基本信息都在此表中。图4.5展示了服务表的物理结构设计。图4.5服务表(3)封装网页为服务的表。用户创建的封装网页数据为服务的特有信息存放在此表中。图4.6展示了此表的物理结构设计。图4.6网页封装服务表(4)封装WebAPI为服务的表。用户创建的封装WebAPI为服务的特有信息存放在此表中。图4.7展示了此表的物理结构设计。图4.7WebAPI封装服务表(5)封装数据库为服务的表。用户创建的封装数据库为服务的特有信息存放在此表中。图4.8展示了此表的物理结构设计。图4.8数据库封装服务表(6)组合服务的表。用户创建的组合服务的特有信息存放在此表中。图4.9展示了此表的物理结构设计。图4.9组合服务表(7)服务类型表。用户创建的服务类型信息存放在此表中。图4.10展示了此表的物理结构设计。图4.10服务类型表4.4.3数据库访问采用JDBC与JPA相结合的方法访问数据库,实现对象的读写。利用JDBC中提供的数据库访问API直接编写SQL语句实现数据库的访问;利用JPA通过JDK5.0注解描述对象-关系表的映射关系,并将实体对象持久化到数据库中。4.4系统详细设计4.4.1业务用例的实现主要用时序图方式实现。(1)用户查询服务的时序图如图4.11所示:图4.11用户查询服务的时序图(2)用户删除服务的时序图如图4.12所示:图4.12用户删除服务的时序图(3)用户查看个人信息的时序图如图4.13所示:图4.13用户查看个人信息的时序图4.4图4.14展示了与用户登录有关的类及其之间的联系。图4.14与用户登录有关的类图用户登录时前台与服务器之间的请求与响应均是通过控制器loginServlet类来进行的。首先用户登录时给loginServlet类发送请求,loginServlet类将请求中的用户数据封装成User对象,然后调用UserDaoImpl类里的login(User)方法,然后在login(User)类中调用userExists(String)方法判断用户名是否存在,如果用户名已存在,系统通过loginServlet类返回给用户提示,否则在数据库User表中进行相应的查询,然后查询返回结果给loginServlet类,loginServlet类根据返回结果进行判断,将最终结果响应给用户。期间,UserDaoImpl类使用DBUtils中的getConnection()方法创建与数据库之间的链接。四个主要服务及其父类服务之间的关系,如图4.15所示。图4.15四个主要服务类及其父类服务类的类图Db类、WebApi类、App类、Clipper类均继承自父类dataservicetype类,其中每个子类代表着一种服务,其服务的基本信息继承自dataservicetype类,而各自有具有属于自己服务的特有信息。封装网页的服务类图如图4.16所示。图4.16封装网页的服务类图其中,ClipperService类为服务方法定义接口,ClipperServiceAsyc类为异步调用接口,ClipperServiceImpl类为服务器方法实现类,它实现ClipperService接口。GWT中client包中的任何类想要使用非GWT配置文件中声明的其它类中的方法必须通过异步调用接口来间接的调用。

第五章系统实现5.1系统物理结构系统的物理结构主要有用户注册单元、用户登录单元、个人信息管理单元、创建服务单元、浏览服务单元、编辑服务单元、删除服务单元、使用服务单元以及百度地图应用单元构成,如图5.1所示。图5.1系统组件图5.2系统物理部署系统的物理部署由客户端浏览器、应用服务器Tomcat以及数据库服务器MySQL组成,部署图如图5.2所示。图5.2系统部署图项目参加的2013年“软件研究成果原型竞赛”(相关链接地址:/contest2013.html),需要部署到北京大学的云平台SASE上,如图5.3、5.4、5.5所示:图5.3SASE用户登录图图5.4应用提交界面图5.5查看应用界面5.3主要功能的实现5.3.1用户界面(1)首页界面,如图5.6所示。图5.6首页(2)登录界面,如图5.7所示。图5.7登录界面(3)注册界面,如图5.8所示。图5.8注册界面(4)登录后进入的主页,如图5.9所示。图5.9登录后进入的主页界面(5)服务浏览查询删除界面,如图5.10所示。图5.10服务浏览查询删除界面(6)用户个人信息页面,如图5.11所示。图5.11用户个人信息页面(7)帮助页面,如图5.12所示。图5.12帮助页面界面(8)封装WebAPI为服务的页面,如图5.13所示。图5.13封装WebAPI为服务的页面(9)封装数据库为服务的页面,如图5.14所示。图5.14封装数据库为服务的页面(10)服务组合的页面,如图5.15所示。图5.15服务组合的页面(11)百度地图页面,分别如图5.16、5.17、5.18所示。图5.16地址设定界面图5.17组合信息显示界面图5.18地图路线显示界面界面代码实现:用户界面整体上采用JSP开发,兼用GWT。用户在页面中向服务器提交请求统一使用AJAX技术来实现,并没有使用传统的表单提交,这样可以做到无刷新提交并相应。这里以登录界面图5.19代码示例如下:图5.19登录界面登录页面的代码:<divclass="color_border"> <pclass="margin"> <a>Username:</a> <inputid="login_username"type="text"class="input"onkeypress="enterClick(event)"></input> </p> <p> <a>Password:</a> <inputid="login_password"type="password"class="input"onkeypress="enterClick(event)"></input> </p> <p> <buttonclass="button"onclick="login_null();"onkeypress="enterClick(event)">LOGIN</button> </p></div>登录调用的Javascript代码如下://页面中调用的方法functionlogin_null(){ varusername=document.getElementById("login_username").value; varpassword=document.getElementById("login_password").value; if(username==""||password==""){ if(username==""){ alert("usernameisempty!"); returnfalse; }else{ alert("passwordisempty!"); returnfalse; } }else{ sendRequest("loginServlet?service=login&username="+username+"&password="+password); }}//下面为使用AJAX的过程varXMLHttpReq;//根据不同浏览器创建请求对象XMLHttpRequestfunctioncreateXMLHttpRequest(){if(window.XMLHttpRequest){XMLHttpReq=newXMLHttpRequest();}elseif(window.ActiveXObject){try{XMLHttpReq=newActiveXObject("MSXML2.XMLHTTP");}catch(e){try{XMLHttpReq=newActiveXObject("Mircsoft.XMLHTTP");}catch(e1){}}}}//发送请求functionsendRequest(url){ createXMLHttpRequest(); XMLHttpReq.open("GET",url+"&time="+newDate().getTime(),true); XMLHttpReq.onreadystatechange=processResponse; XMLHttpReq.send(null);}//响应函数functionprocessResponse(){ if(XMLHttpReq.readyState==4){ if(XMLHttpReq.status==200){ varres=XMLHttpReq.responseXML.getElementsByTagName("result")[0].firstChild.data; if(res=="commonuser"||res=="admin"){ window.location.href="index/core/myindex.jsp"; }else{ window.alert(res); return; } }else{ window.alert("Thepageyourequestisabnormal!"); } }}关于用户登录的后台代码。控制器由loginServlet类进行处理,代码如下protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ resp.setContentType("text/xml;charset=utf-8"); resp.setHeader("Cache-Control","no-cache"); PrintWriterout=resp.getWriter(); Stringservice=req.getParameter("service"); UserDaoImpluserdao=newUserDaoImpl(); HttpSessionsession=req.getSession(); if("login".equals(service)){ out.println("<response>"); Stringusername=req.getParameter("username"); Stringpassword=req.getParameter("password"); Useruser=newUser(); user.setUsername(username); user.setPassword(password); intresult=userdao.login(user);//-2:账号未激活 if(result==-2){ out.println("<result>"+"Theaccountisnotactive!"+"</result>"); }//-1:用户名不存在 elseif(result==-1){ out.println("<result>"+"Theusernamedoesnotexist!"+"</result>"); }//0:用户密码错误 elseif(result==0){ out.println("<result>"+"Thepasswordiswrong!"+"</result>"); }//1:普通用户成功登录 elseif(result==1){ intisallowed=userdao.getIsAllowed(username); CSessioncs=newCSession(); cs.setUsername(username); cs.setUsertype("0"); session.setAttribute("C_SESSION",cs); session.setAttribute("username",username); session.setAttribute("isallowed",isallowed); out.println("<result>commonuser</result>"); }else{//管理员成功登录 intisallowed=userdao.getIsAllowed(username); CSessioncs=newCSession(); cs.setUsername(username); cs.setUsertype("1"); session.setAttribute("C_SESSION",cs); session.setAttribute("adminname",username); session.setAttribute("isallowed",isallowed); out.println("<result>admin</result>"); } out.println("</response>"); out.close(); }}在控制器loginServlet类中调用了数据库层的login(Useruser)方法,对用户登录进行数据库查询: /** *验证用户登录 *@paramuser用户*@returnint-2:账号未激活-1:用户名不存在0:用户密码错误1:普通用户成功登录2:管理员成功登录 *@exception出现异常则登录失败 */ publicintlogin(Useruser){ intlogin_result=0; try{ if(userExists(user.getUsername())==0){ login_result=-1; }else{ sql="SELECTUSERNAME,IS_ADMIN,IS_ACTIVEFROMuserWHEREUSERNAME=?andPASSWORD=?andIS_DEL=0"; conn=DBUtils.getConnection(); ps=conn.prepareStatement(sql); ps.setString(1,user.getUsername()); ps.setString(2,user.getPassword()); rs=ps.executeQuery(); if(rs.next()){ if(rs.getInt("IS_ACTIVE")==0){ login_result=-2; }else{ if(rs.getInt("IS_ADMIN")==0){ login_result=1; }else{ login_result=2; } } }else{ login_result=0; } } }catch(SQLExceptione){ e.printStackTrace(); }finally{ DBUtils.free(rs,ps,conn); } returnlogin_result; }5.3.2多条件查询的实现用户查询所有服务或是查询自己的服务时都可以根据条件进行查询。下图中的“BrowsebyDomain”以及DiscoverDataServices中的in下拉框中的服务类型及数量都是动态实现的,是随着数据库中的服务类型和数量的变化而变化的。图5.20多条件查询服务图5.20的功能具体实现过程如下:当页面刚加载时,首先调用下面的两个方法<bodyonload="initDataServices();initTService();">其中initDataServices()方法是使用AJAX异步请求得到数据库中的所有的服务,然后利用响应函数在页面中显示出来并进行分页处理。initTService()方法使控制服务种类的显示的方法,代码如下:functioninitTService(){ varsearchInputdata="Searchdataservicename,ordescription"; varselectDomain="Domain"; varselectRelevance="Relevance"; varshowuser=""; varchecked=false; varurl="browseServlet/browse?cmd=initT&searchInputdata="+searchInputdata+"&selectDomain="+selectDomain+"&selectRelevance="+selectRelevance+"&showuser="+showuser+"&checked="+checked; if(window.XMLHttpRequest){ reqt=newXMLHttpRequest(); }elseif(window.ActiveXObject){ reqt=newActiveXObject("Microsoft.XMLHTTP"); } if(reqt){ reqt.open("post",url,true); reqt.onreadystatechange=initTcomplete; reqt.send(null); } }//响应函数functioninitTcomplete(){ if(reqt.readyState==4){ if(reqt.status==200){ vardomainmap=reqt.responseText;//在这里调用方法显示服务种类和数量 select_list(domainmap); } }}//显示服务种类和数量functionselect_list(domainmap){ document.getElementById("topnav1").innerHTML="";vardomain=document.getElementById("selectDomain"); domain.innerHTML=""; domain.options.add(newOption("Domain","Domain")); domain.options.add(newOption("AnyDomain","AnyDomain"));vardomains=domainmap.split("##%%");for(varj=0;j<domainmap.length-1;j++){ vartypes=domains[j].split(",");varoption=document.createElement("option");option.value=types[0];option.innerHTML=types[0];domain.appendChild(option);document.getElementById("topnav1").innerHTML+="<li><aclass=\"navlink\"href=\"Javascript:findDomain('"+types[0]+"')\">"+types[0]+"</a><spanclass=\"attibutenumCSS\">("+types[1]+")   </span></li>";}}当用户进行删除时,服务种类和数量可以实现无刷新显示,实现代码如下://删除服务的响应函数functionremovecomplete(){ if(req.readyState==4){ if(req.status==200){ varrow=document.getElementById(req.responseText); varindex=row.rowIndex;//rowIndex属性为tr的索引值,从0开始 theTable.deleteRow(index);//从table中删除 numberRowsInTable=theTable.rows.length;//在这里重新调用initTService()方法进行是数据库查询 initTService(); } }}5.3.3封装WebAPI的界面使用GWT技术首先要建立的是模块配置文件(以.gwt.xml结尾的文件),基本上一个功能一个模块,如封装网页为服务的功能独自一个模块,封装WeAPI为服务的功能独自一个模块。这里以封装WebAPI为服务的模块来介绍。图5.21是整个功能模块的包以及包内的类的图(GWT对包的命名以及包中部分类的命名有严格的限制)。图5.21WebAPI功能模块包结构(1)DataServiceWrapper.gwt.xml模块配置文件内容如下:<module><!—下面是继承其他模块,User是必须继承的一个模块。--> <inheritsname="com.google.gwt.user.User"/><!--继承缺省的GWT样式表.能够改变GWT程序的主题--> <inheritsname="com.google.gwt.user.theme.standard.Standard"/><!--指定应用的入口点类--> <entry-pointclass="cn.ac.ict.sigsit.webide2.dataservicewrapper.client.DataServiceWrapper"/> <inheritsname="com.extjs.gxt.ui.GXT"/> <stylesheetsrc="/ExtGWT/css/gxt-all.css"/> <inheritsname="cn.ac.ict.sigsit.webide2.gwt.Module"/></module>(2)入口点类扩展了入口点接口并提供了一个方法onModuleLoad(),这个入口点方法是整个GWT应用程序开始执行的地方,在构造GWT应用程序用户界面中起作用。入口点类:DataServiceWrapper类实现GWT的EntryPoint接口publicclassDataServiceWrapperimplementsEntryPoint{ publicvoidonModuleLoad(){ RootLayoutPanelrootLayoutPanel=RootLayoutPanel.get();//在这里创建WrapperUi类的对象,WrapperUi类采用的是UiBinder技术 rootLayoutPanel.add(newWrapperUi()); }}这里使用的是UiBinder,是一种通过XML来进行页面设计的技术,相应的xml文件WrapperUi.ui.xml如下:<!DOCTYPEui:UiBinderSYSTEM"/gwt/DTD/xhtml.ent"><ui:UiBinderxmlns:ui='urn:ui:com.google.gwt.uibinder'xmlns:g='urn:import:com.google.gwt.user.client.ui'> <g:TabLayoutPanelbarUnit='EM'barHeight='2'> <g:tab> <g:headersize='7'>WebAPI</g:header> <g:DockLayoutPanelunit='EM'> <g:northsize="2.0"> <g:FlowPanel> <g:TextBoxwidth="38em"ui:field="textBoxApiUrl"/> <g:Buttonui:field="buttonApiLoad">Load</g:Button> <g:Buttonui:field="buttonApiCreate"enabled="false">Create</g:Button> </g:FlowPanel> </g:north> <g:center> <g:ScrollPanelui:field="apiNestedTablePanel"/> </g:center> </g:DockLayoutPanel> </g:tab> <g:tab> <g:headersize='7'>Database</g:header> <g:DockLayoutPanelunit='EM'> <g:northsize="2.0"> <g:FlowPanel> <g:Buttonui:field="buttonDbConnect">Connect</g:Button> <g:ListBoxwidth="10em"ui:field="listBoxTableName"enabled="false"/> <g:Buttonenabled="false"ui:field="buttonDbCreate">Create</g:Button> </g:FlowPanel> </g:north> <g:center> <g:ScrollPanelui:field="dbNestedTablePanel"/> </g:center> </g:DockLayoutPanel> </g:tab> </g:TabLayoutPanel>对应的界面如图5.22所示:图5.22通过UiBinder设计的界面(3)客户端与服务器端代码的存放位置使用标准的GWT工程结构可以有效的区分客户端和服务器端的代码,所以推荐使用标准的GWT工程结构。如表5.1所示:表5.1GWT工程结构表包名作用\工程的根目录,包含模块XML文件client\存放客户端代码server\存放服务器端代码public\存放静态资源,如.html,.css,图片等WrapperService类为服务方法定义接口,WrapperServiceAsyc类为异步调用接口,这两个类属于客户端代码,必须位于client包中,WrapperServiceImpl类为服务器方法实现类,它实现ClipperService接口,属于服务器端代码,必须位于server包中。GWT中client包中的任何类想要使用非GWT配置文件中声明的其他类中的方法必须通过异步调用接口来间接的调用。(4)主要客户端与服务器端代码:@RemoteServiceRelativePath("WrapperService")publicinterfaceWrapperServiceextendsRemoteService{ publicstaticclassUtil{ privatestaticWrapperServiceAsyncinstance; publicstaticWrapperServiceAsyncgetInstance(){ if(instance==null){ instance=GWT.create(WrapperService.class); } returninstance; } }//此方法负责加载用户WebAPI的内容并以嵌套表格的形式在页面中展现出来 publicLoadDocumentRetloadWebApiDocument(Stringurl)throwsGwtException;//此方法负责保存WebAPI服务 publicvoidcreateWebApiWrapper(Stringname,Stringservicetype,Stringdesc,Stringurl,Stringencoding, Map<String,String>urlParams, Map<String,String>paramName2description)throwsGwtException;//此方法用于判断服务名是否存在 publicStringserviceNameExists(StringnewName)throwsGwtException;//此方法用于得到数据库中的服务类型 publicList<String[]>getServiceType(intid)throwsGwtException;}在WrapperService接口中定义的方法必须在WrapperServiceAysc接口中定义类似的方法,返回值统一改为void,添加一个异步返回的参数AsyncCallback<String>callback如下:publicinterfaceWrapperServiceAsync{ publicvoidloadWebApiDocument(Stringurl,AsyncCallback<LoadDocumentRet>callback); publicvoidcreateWebApiWrapper(Stringname,Stringservicetype,Stringdesc,Stringurl,Stringencoding, Map<String,String>urlParams, Map<String,String>paramName2description,AsyncCallback<Void>callback); publicvoidserviceNameExists(StringnewName,AsyncCallback<String>callback); publicvoidgetServiceType(intid,AsyncCallback<List<String[]>>callback);}5.3本系统实现的服务推送的主要功能是:当本登录用户或其他登录用户创建或者删除服务的时候,只要用户在创建或者删除服务前打开了Home、Browse、MyDataService中的任一页面并且在没有关闭的情况下,页面中的服务显示列表都会动态的进行显示。(1)首先需要dwr.xml的配置文件,在<allow></allow>标签中可以配置需要公开的方法供页面中的JavaScript调用,本系统并没有公开任何方法,可以不进行配置,但是此文件是必须的。<dwr><allow><createcreator="new"Javascript="testClass"><includemethod="testMethod"/></create></allow></dwr>(2)需要在web.xml文件中进行配置,如下: <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>//这个参数默认是false,如果选择true,可以通过访问

http://localhost:port/app/dwr

,看到部署的每个DWR类,并且可以测试Java代码的每个方法是否运行正常。 <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param>//下面的配置是启用DWR的反向AJAX功能,可以实现服务器端无刷新更新页面内容。 <init-param> <param-name>activeReverseAjaxEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>initApplicationScopeCreatorsAtStartup</param-name> <param-value>true</param-value> </init-param> </servlet>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论