admin 管理员组文章数量: 887021
2024年1月13日发(作者:java编程思想脚本之家)
分 类 号 学号 M201071613
学校代码 10487 密级
硕士学位论文
基于Android平台的自习室信息服务系统的设计与实现
学位申请人: 纪孝桢
学科专业: 通信与信息系统
指导教师: 黑晓军 副教授
答辩日期:2013 年 1月12日
20
A Dissertation Submitted in Partial Fulfillment of the Requirements
For the Degree of Master of Engineering
Design and Implementation of Study Room
Information Service System Based on Android
Candidate : Ji Xiaozhen
Major : Communication & Information System
Supervisor : Associate Prof. Hei Xiaojun
Huazhong University of Science and Technology
Wuhan, Hubei 430074, P. R. China
Jan, 2013
独创性声明
本人声明所呈交的学位论文是我个人在导师的指导下进行的研究工作及取得的研究成果。尽我所知,除文中已标明引用的内容外,本论文不包含任何其他人或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。
学位论文作者签名:
日期: 年 月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
保 密□,在______年解密后适用本授权书。
本论文属于
不保密□。√
(请在以上方框内打“√”)
学位论文作者签名: 指导教师签名:
日期: 年 月 日 日期: 年 月 日
华中科技大学硕士学位论文
摘 要
无线互联网通信技术的发展,以及手机等移动设备的普及,大大方便了人们的生活。在高校这一教育的前沿阵地,网络应用移动化已成为必然趋势,如何利用移动互联网提供校园信息服务已成为重要的研究课题。本课题旨在解决当前校园中自习室信息服务不便利的问题。
现有的基于移动平台的自习室查询系统基本上是从网页到手机客户端的一种简单的功能迁移,并不能满足自习室信息服务更加人性化的需求。本文针对针对目前高校的自习室查询系统现状,在对学生进行需求调研的基础上,设计并实现了基于Android平台的自习室信息服务系统。本文的主要工作有:1)对系统功能进行总体设计,采用业界主流的Android平台作为客户端开发平台,Servlet技术作为服务器端开发技术,Watij+Quatz技术作为定时数据爬取工具,并规定了客户端与服务器端的通信接口。2)在满足学生基本的教室查询需求的基础上,设计并实现了自习室信息反馈功能,让学生实时掌握自习室内的最新情况。围绕此功能,设计并实现了反馈排名统计、消息推送等附加功能,以促进学生积极参与信息反馈。3)最后通过Android模拟器对系统的各个功能进行了测试,测试分析结果表明该系统满足原定需求。
本课题实现了基于Android平台的自习室信息服务系统,系统围绕自习室信息查询,提供了信息反馈、排名统计、消息推送等功能,以帮助学生快速寻找自习室,系统已经在华中科技大学范围内开放使用。本系统荣获首届全国高校移动互联网开发者大赛三等奖。
关键词:自习室, 信息服务系统, Android, Servlet
I
华中科技大学硕士学位论文
Abstract
With the development of the wireless Internet communications technology and the
popularity of mobile devices like mobile phone, people's lives become more and more
convenient. At the university which is a forward position of education, network
applications becoming mobile has become an inevitable trend, and how to provide campus
information service via the mobile Internet has become an important research topic. The
purpose of this project is to solve the problem of the inconvenience of current study room
information service in campus.
The existing study room query system based on the mobile platform is basically
simple migrating the function from web page to mobile client, and can not meet more
humane demand for the study room information service. In this paper, for the current
status of study room check system in campus, based on the research on student’s demand,
we design and develop the study room information service system based on Android. This
thesis firstly design system function, using Android as the client development platform,
using Servlet as the server-side development technology, using Watij and Quatz
technology as the tool of crawling data, and provides the client and server-side
communication interface. Secondly, we design and develop the function of information
feedback, to enable students to obtain the latest information of the study room. Based on
this function, design and implement feedback ranking statistics, message push to promote
students to feedback information. Finally, we test every function via the Android emulator,
it shows that the system has been consistent with the original demand.
We develop the study room information service system based on Android. Around the
study room information queries, the system provide feedback, ranking statistics, message
push function to help students find study room quickly. The system has been used in
Huazhong University of Science and Technology. In first contest of National Universities
Mobile Internet Developer, the system wins the third prize.
Keywords: study room, information service system, Android, Servlet
II
华中科技大学硕士学位论文
目 录
摘 要 .......................................................................................................I
ABSTRACT ............................................................................................ II
1 绪论
1.1 课题背景 ..................................................................................... (1)
1.2 国内外研究现状 .......................................................................... (2)
1.3 项目来源及研究内容................................................................... (3)
1.4 论文结构 ..................................................................................... (4)
2 相关技术综述
2.1 技术选择 ..................................................................................... (5)
2.2 ANDROID开发平台 ...................................................................... (6)
2.3 SERVLET技术 ............................................................................. (10)
2.4 本章小结 ................................................................................... (11)
3 自习室信息服务系统分析与设计
3.1 总体需求 ................................................................................... (13)
3.2 系统部署 ................................................................................... (14)
3.3 系统功能设计 ............................................................................ (14)
3.4 数据库设计................................................................................ (21)
III
华中科技大学硕士学位论文
3.5 数据爬取策略设计 .................................................................... (23)
3.6 客户端与服务器端通信接口设计 .............................................. (24)
3.7 本章小结 ................................................................................... (29)
4 自习室信息服务系统的实现与测试
4.1 客户端功能模块实现................................................................. (30)
4.2 服务器端关键技术实现 ............................................................. (37)
4.3 系统功能测试 ............................................................................ (42)
4.4 本章小结 ................................................................................... (49)
5 总结与展望
5.1 论文总结 ................................................................................... (50)
5.2 前景与展望................................................................................ (50)
致 谢 ..................................................................................................(52)
参考文献 ..............................................................................................(53)
IV
华中科技大学硕士学位论文
1 绪论
1.1 课题背景
计算机网络技术与3G移动通信技术的发展,大大加快了我国信息化的进程,同时也使我国接触使用互联网的人数逐年增加。2012年7月19日,《第30次中国互联网络发展状况统计报告》在北京发布,该份报告显示,截至2012年6月底,中国网民数量达到5.38亿,而手机网民规模达到3.88亿,手机首次超越台式电脑成为第一大上网终端[1]。根据工信部的统计数据,截至2012年9月底,我国3G用户数量突破了2亿户。
如今,互联网技术与无线通信技术服务已经在校园内得到普及,为学校的教学管理以及学生的学习生活提供了极大的便利。我国教育信息化的三大主题之一就是数字化校园建设[2]。数字化校园平台的建设,无疑将为高校师生的工作、学习、生活提供方便,目前全国各个高校都已陆续建设完成[3]。传统的数字化校园平台提供的信息服务都是以PC作为基础的,并不能实现随时随地进行校园信息交流和服务,建立在PC互联网之上的数字化校园平台不可避免地具有时空局限性。但随着我国移动通信技术特别是3G/4G技术的发展成熟,以及无线设备特别是智能手机的普及,越来越多的人利用手机或其他移动设备接入互联网。高校网络应用移动化已经成为高校信息化建设发展的必然趋势[4],同时也为数字化校园的进一步发展提供了新的契机。据调查,手机在高校师生中的拥有率超过95%,与之对比,笔记本电脑的拥有率仅为20%左右[5]。所以,在高校领域中,研究如何利用手机这一学生普遍携带的移动上网设备进行校园信息服务具有深刻的现实意义与广泛的实用价值。
学生上自习是学生在学校中最基本的学习行为,因此如何向学生提供高质量的自习室信息服务,是高校信息化中需要重点考量的内容。目前高校中给学生提供的自习室查询服务的方式基本上采用以下两种方式:1) 教学楼固定位置的电子显示屏查询;2) 通过WEB登陆教务处相关网页查询。这两种查询方式并不能提供随时随地查询的服务,缺乏灵活性和便捷性。而对于自习室内部的人数占用情况,通过这两种方式根本无从得知。每当期末考试临近时,学生找自习室上自习的需求就会激增,相当一部分高校中会出现“一座难求”的现象。找自习室上自习,一度成为了高校学生的一大难题。因此,在高校中,开发出一个基于智能手机的应用系统来提供自习室信息信息服务,可以在很大程度上缓解这个问题。通过这样的一个移动应1
华中科技大学硕士学位论文
用系统,高校学生可以随时随地、方便快捷地进行自习室信息的查询,还可以通过用户的信息反馈,让所有学生都能够实时地获取自习室内部的占用情况,大大缩短找自习室耗费的时间。
据报道,目前中国智能手机市场操作系统中,Android以67.0%的市场份额,占据绝对领先地位。而Android开源的特性决定了Android手机的价位不会太高[6],比较适合高校学生。学生通过Android手机可以很方便地获取到与自己学习生活相关的各种信息。Android操作系统在高校中的普及,将大大推动移动校园信息服务应用的全面发展。
1.2 国内外研究现状
1.2.1 Android平台相关发展现状
Android是以Linux平台为基础的开源操作系统,它由Google公司开发和维护,“安卓”为其中文商标[7]。Android操作系统研发项目最初由安迪·鲁宾创办, 2005年8月17日被谷歌注资收购。2007年11月,开放手持设备联盟(即Open Handset
Alliance)[8]建立,该联盟由Google和84家硬件制造商、软件开发商和电信运营商组成。在这之后,Android获得Apache免费开源许可证,Google公司公布了其源代码,Android正式踏上开源免费的道路。同时,Android开源项目(AOSP)也被建立以便进一步发展和维护Android平台[9]。
随着Android手机的不断普及,大批开发者涌入Android阵营,为Android开发各式各样的应用。截至2012年10月,已经有超过70万个应用程序登陆Android电子市场(Google Play),应用的下载量也在2012年9月突破250亿次。
Android便携设备市场占有率在2010年超越了多年的智能手机操作系统霸主Symbian(诺基亚)。2012年11月,Android操作系统在全世界智能手机操作系统方面的市场份额已达75%,遥遥领先其他智能手机操作系统,最近几个月Android手机出货量进一步增加,发展势头迅猛。因为Android是开源的架构良好的平台,相当一部分人认为它会成为将来MID (Mobile Internet Device)的主流[10]。
1.2.2 高校自习室信息服务系统发展现状
计算机技术的高速发展带动了信息技术和信息产业的快速发展。信息技术中的一个比较新的方面,就是高校信息化建设[6]。提供自习室相关的信息服务,是高校信息化中有一个有机的组成部分,与高校学生的切身利益息息相关,对高校整体学习2
华中科技大学硕士学位论文
氛围的养成有着深远的影响。高校自习室信息服务应该具备准确性、便捷性、移动性等特点。其中准确性要求系统提供的数据必须是准确无误的;便捷性要求学生通过互联网即可查询信息,并且查询方式灵活便捷;移动性要求学生随时随地都可以获取到所需要的信息。当前的高校中所拥有的各类自习室信息服务系统,绝大多数只能在PC上通过WEB进行访问,对于用户来说,使用的时间和地点不可避免地受到局限。从当前的发展情况来看,自习室信息服务的不完善,使得高校学生获取自习室信息、寻找自习室极为不便利。
尽管目前陆续有高校学生开发出基于移动平台的自习室查询系统,但基本上是从网页到手机客户端的一种简单的功能迁移,仅仅能满足单纯的查询需求,并没有考虑到一些细化的需求。例如一个教室当天没有安排课程,但却被临时征用作为活动场地,这种情况下这些查询系统便无法做到及时修正,从而对学生寻找自习室造成误导。另外,在自习室较为紧张时,学生对于自习室内部的人数情况是比较敏感的。如果能实时了解到各个自习室内部的人数情况,无疑将方便学生寻找自习室,实现自习室资源的均衡利用。表 1.1中给出了各种查询方式的对比。
表 1.1 各种自习室查询方式对比
查询方式
电子显示屏
Web查询
现有的手机查询系统
准确性 便捷性 移动性 临时变动 内部人数情况
√
√
√
√
√
√
从表 1.1中可以看出,虽然目前基于移动平台的自习室查询系统已经满足准确性、便捷性、移动性的要求,但是对于一些更加人性化的需求,并不能满足。
1.3 项目来源及研究内容
本课题来源于智能互联网技术湖北省重点实验室自拟课题。课题的目标是建设一个全方位覆盖学生生活、学习和工作的移动校园社区服务平台。自习室信息服务平台作为移动校园社区的基础性平台,满足的是学生上自习的刚性需求。本课题的主要任务是研究如何利用Android平台、利用移动通信网络来提供方便快捷的自习室信息服务。基于Android平台的自习室信息服务系统的开发将有效地帮助学生快速方便地进行自习室信息的查询和共享,最大程度地帮助学生在第一时间找到可自习的教室。
本课题的目标是针对华中科技大学的学生设计与实现出一个便捷好用、实时性3
华中科技大学硕士学位论文
强的自习室信息服务系统。具体研究工作包括以下内容:
1. 在对学生进行充分需求调研的基础上,分析研究自习室信息服务系统的需求,进而设计该系统所要具备的基本功能,搭建出系统的功能框架。
2. 根据Android平台系统的特性要求,提出本系统中客户端开发的解决方案;研究在Servlet服务器端利用Quartz与Watij定时爬取网页数据,设计数据库表进行数据存储;制定Android客户端与和Servlet服务器端之间的通信接口。
3. 根据系统的功能设计以及技术选用,进行系统开发,最终对系统的各部分功能进行测试,验证系统的可行性。
1.4 论文结构
本文分为五个主要章节,其余四个章节分别是:
第二章,根据系统开发的实际情况进行客户端和服务器端开发技术选择,根据选择的结果,概述了Android开发平台的定义、特征、架构及其应用程序组件;概述了Servlet技术的定义、功能及其生命周期。
第三章,对基于Android平台的自习室信息服务系统进行了具体的需求调研和分析,并在此基础上对本系统的整体功能框架、具体功能、本系统的数据库以及客户端/服务器端的通信接口接口进行了详细设计。
第四章,根据第三章的设计方案说明实现方案,分别对本系统的客户端模块实现和服务器端关键技术实现做了详细介绍,并且用Android模拟器实现系统的功能测试。
第五章,对本文的研究内容和成果进行总结,并指出本系统在未来还需提升和改进的方向。
4
华中科技大学硕士学位论文
2 相关技术综述
本系统采用Android平台作为客户端开发平台,采用Tomcat作为Web服务器,采用Servlet来接收/响应客户请求,并通过JDBC(Java Data Base Connectivity, java数据库连接)访问后台MySQL数据库,同时,采用自动化测试工具Watij定时爬取和存储数据。系统的技术模型如图 2.1所示。
服务器端Android客户端Tomcat + Servlet +
JDBC + WatijMySQL数据库
图 2.1 系统技术模型图
以下将对系统客户端和服务器端的开发技术进行对比选择的基础上,介绍Android开发平台以及Servlet技术。
2.1 技术选择
2.1.1 客户端开发技术选择
当前主流的移动开发平台包括Google的Android平台和Apple的iOS平台,虽然微软已推出了Windows Phone平台,但市场渗透率还不高。本文只比较Android平台和iOS平台。表 2.1给出了两者一些特性的对比。
表 2.1 Android平台与iOS平台的对比
系统开放性
手机价格
普及性
开发成本
推广渠道、周期
Android
开放
价格区间广,选择多
广
低,只需一台PC
iOS
封闭
高价
较广
较高,需要Mac OS电脑,一年$99费用
APK开发完成后可直接在第三只能通过App Store,审核周期长
方应用商店、社交网络进行推广
从表 2.1可以看出,由于Android平台开放免费,故Android手机价格相对iPhone5
华中科技大学硕士学位论文
较低,在学生中普及性远远高于iPhone;并且Android平台开发成本较低,开发完成后推广渠道较多,耗时短,故本系统采用Android平台作为客户端开发平台。
2.1.2 服务器端开发技术选择
本系统的服务器端是一个没有网页页面的“非典型”的WEB系统,但是在技术开发上,与动态网页的开发没有区别。目前最常用的动态开发语言有JSP(Java Server
Pages)、PHP(Hypertext Preprocessor)和ASP(Active Server Pages) 三种。其中ASP语言仅支持微软公司的产品,不具备跨平台的特性,因此本文只比较JSP和PHP。由于JSP页面的内置脚本语言是基于Java程序设计语言的,而且所有的JSP页面都被编译成Java Servlet,故JSP与PHP的比较实际上就是Servlet与PHP的比较。表 2.2给出两者一些特性的对比:
表 2.2 Servlet与PHP的对比
语言特性
运行性能
应用特性
Servlet PHP
面向对象的编译型语言 面向过程的解释型脚本语言
性能较好,尤其对数据库的访问以性能一般,不能很高效的处理数据库及数字运算很高效
可维护性和可扩展性强
访问或数字运算等操作
结构松散,可维护性差
Servlet继承了Java语言跨平台性、安全性、性能高效以及自动垃圾回收等诸多优点[11],另外,从表 2.2以看出,由于Servlet面向对象的特性,使其能够支持更加多样的层次化结构设计,并且由于Java语言社区的强大生命力,拥有众多成熟的开源框架和开源工具进行支持[12](本系统中用到的数据爬取工具Watij就是基于Java的开源工具)。由于上述的种种特性,本系统采用Servlet作为服务器端开发技术。
2.2 Android开发平台
Android是“机器人”的意思,中文名“安卓”,是一个基于Linux平台的开源手机操作系统,由Google公司于2007年11月5日发布[13]。Android的底层以开源的Linux为基础,上层用跨平台的Java语言开发应用,是目前可移植性最高的手机操作系统[14]。
2.2.1 Android开发平台的特征
Android平台的特征主要包括以下几个:
1. 采用专门针对移动设备进行优化的Dalvik虚拟机[15]。
6
华中科技大学硕士学位论文
2. 应用程序框架支持组件的重用与替换[16]。
3. 采用轻量级的嵌入式数据库SQLite进行数据存储[17]。
4. 浏览器基于WebKit引擎[18]。
5. 支持大多数静态图像、音视频格式。
6. 优化的2D和3D图形库[19]。
7. 支持GSM、EDGA、3G、WiFi、Bluetooth(依赖硬件)[20]。
2.2.2 Android开发平台的架构
如图 2.2所示,Android平台的体系结构分为4层,由上而下依次是应用程序层、应用程序框架、函数库、Android执行环境和Linux内核。它们以软件叠层的方式构成[21]。
应用程序层应用程序框架Activity
ManagerPackageManagerWindowManagerTelephonyManagerContentProvidersResourceManagerViewSystemLocationManagerNotificationManagerXMPP Service函数库Surface
ManagerOpenGL|ESMediaFrameworkFreeTypeSQLiteAndroid运行时环境Core LibrariesDalvik VirtualMachineWebKitSGLSSLlibcLinux内核DisplayDriverUSB DriverCamera DriverBluetooth
DriverWiFi DriverFlash MemoryDriverAudio DriverBinder (IPC)DriverPowerManagementKeypad Driver
图 2.2 Android系统的架构体系
7
华中科技大学硕士学位论文
1. 应用程序层(Applications)
开发者开发的应用程序都属于这一程,也包括系统自带的应用程序,如contacts 、SMS、email、browser。
2. 应用程序框架(Application Framework)
Android系统提供给开发者的本身就是一个框架,所有的应用开发都是在这个框架上进行扩展,并且都必须遵守这个框架的规则。
3. 函数库(Libraries)
函数库中是一套C/C++库,包含了系统C库、媒体库、3D库、SQLite等核心库[22]。这些库在构建Android的不同组件中起到了重要作用,通过Android的应用程序框架可以将这些库暴露给开发人员[23]。
4. Android运行时环境(Android Runtime)
Android各个应用程序之间是相互独立的,每个应用程序都运行在各自的进程当中,该进程是Dalvik虚拟机的一个实例。Dalvik虚拟机将程序编译成为Dalvik的可执行格式(也就是.dex格式),该格式是被优化过的最小内存依赖的格式[24]。需要说明的是,Dalvik虚拟机是基于寄存器的(JVM是基于堆栈的),基于寄存器的虚拟机对于更大的程序来说,在它们编译时花费的时间更短[25]。
5. Linux内核(Linux Kernel)
Android的内核本质上是基于Linux2.6内核的,但为了添加Android平台所需要的各种驱动,修正了之前版本部分的BUG而成为增强内核版本,使之用于驱动Android上的各部分硬件[26]。
2.2.3 Android应用程序组件
根据完成的功能不同,Android划分了四类核心的组件类:Activity、Service、Broadcast Receiver和Content Provider[27]。以下分别对这四类核心组件进行介绍:
1. Activity
Activity是Android中最基本的一个模块,Android应用程序的流程全部在Activity之中运行。一般来说,一个Activity就对应着手机屏幕上的一屏,如果把手机终端比喻成一个浏览器,那么Activity就等同于浏览器中一个网页[28]。网页中有Button、Text field等组件,Activity中同样有各种控件,如Button、TextView、CheckBox以及FrameLayout、LinearLayout、RelativeLayout等布局控件。一般情况下,一个Android应用程序是由多个Activity组成的,这多个Activity之间可以根据需要进行相互跳转及数据传递[29]。
8
华中科技大学硕士学位论文
Activity有自己的生命周期[30],如图 2.3所示。Activity生命周期中的三种基本状态分别是:Active状态、Paused状态、Stopped状态[31]。
启动ActivityonCreate()onStart()用户导航到ActivityonResume()onRestart()正在运行的Activity正在运行的ActivityActivity重新获得焦点Activity失去了焦点其他程序要占用内存onPause()Activity重新获得焦点Activity仍然没有获得焦点onStop()onDestroy()关闭Activity
图 2.3 Activity的生命周期
2. Service
Service是一种只能在后台运行的长生命周期组件,它可以跟其他的组件进行交互,但是它却没有自己的用户界面。在Android系统中,诸如后台音乐播放、SDCard检测、后台数据下载等操作,均是Service的典型应用场合。
3. Broadcast Receiver
该组件主要是用于接收和处理广播通知。Broadcast Receiver包括两个概念,广播发送者(Sender)和广播接收者(Receiver),这里的广播实际就是指Intent,程序可以自己发送广播自己接收,也可以接受系统或其他应用的广播或是发送广播给其9
华中科技大学硕士学位论文
他应用程序。当系统或某个应用程序发送广播时,可以使用BroadcastReceiver来接收广播消息并作相应处理。
4. Content Provider
Content Provide是标准的数据访问接口[32]。同时,作为第三方应用数据的访问方案,Content Provide还能起到在应用程序之间共享数据的作用。它实现了一系列标准的方法供用户使用[33]。
2.3 Servlet技术
2.3.1 Servlet的定义
Servlet是一种运行于服务器端的Java应用程序,可以生成动态的Web页面[34]。它担当客户请求(Web浏览器或其他HTTP客户端)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。
Servlet采用请求/响应模式提供WEB服务。当一个请求由客户端发送至服务器时,服务器首先将此请求信息发送给Servlet,Servlet生成响应内容并将其传送给服务器,然后再由服务器将响应结果返回给客户端。
2.3.2 Servlet的功能
Servlet可完成以下主要功能:
1. 基于客户端发送的请求,生成并返回的动态HTML页面。
2. 创建HTML片段,该HTML片段可以嵌入到客户端现有HTML页面中。
3. 与其它服务器资源(如数据库或基于Java的应用程序)进行通信。
4. 可以接收多个客户端的输入,并将生成的结果返回到多个客户端上。
5. 根据客户请求采用特定的MIME(Multipurpose Internet Mail Extensions)类型对数据过滤,例如进行图像格式转换。
6. 将一些经过定制的处理提供给所有运行于服务器上的标准例行程序[35]。
2.3.3 Servlet的生命周期
Servlet实例创建、方法调用、销毁的整个过程如图 2.4所示:
10
华中科技大学硕士学位论文
客户端1.发送请求Servlet容器Servlet2.解析请求3.创建Servlet实例4.调用init()方法5.调用service()方法6.输出响应信息7.返回响应8.调用destroy()方法
图 2.4 Servlet的生命周期
在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()方法和destroy()方法都分别只进行一次,当初始化完成后,Servlet容器会将该Servlet实例保存在内存中,并通过调用它的service()方法,为接收到的请求服务。当Server不再需要Servlet时(一般当Server关闭时),Server会通过调用Servlet的Destroy ()方法来卸载Servlet[36]。
2.4 本章小结
本章首先根据系统开发的实际情况,分别对客户端和服务器端开发技术进行对比选择,进而根据技术选择的结果,介绍了自习室信息服务系统的客户端和服务器11
华中科技大学硕士学位论文
端相关技术,分别是作为系统客户端的Android开发平台的定义、特征、体系架构及其应用程序组件;以及作为服务器端的Servlet技术的定义、功能及其生命周期。所提供的这些技术综述将为本文后续章节继续介绍本系统的设计与实现提供技术基础。
12
华中科技大学硕士学位论文
3 自习室信息服务系统分析与设计
本章对自习室信息服务系统的需求进行调研和分析,并结合这些需求对系统功能进行了设计。本章首先从学生的需求入手,对相关的需求进行调研和分析,并对这些需求进行整理和归纳。然后,在需求分析的基础上,对系统的功能框架进行设计,并以此为基础展开对系统核心功能模块以及数据库的设计,最后再介绍客户端与服务器通信接口的设计。
3.1 总体需求
系统的需求分析是进行系统功能设计,进而进行系统详细实现的前提。本系统作为一个服务性质的信息系统,对实系统直接服务的人群——学生进行调研,是进行需求调研的最直接也是最方便的途径。笔者在对我校有上自习需求的学生群体进行需求调研中发现,学生普遍反映每到考试周,自习室就供不应求,找自习座位并不容易。他们迫切需要一个装载在智能手机上的能够准确、及时获取自习室信息服务的软件。
虽然目前学校中已经有一些自习室查询的移动客户端软件出现,但是经过调研发现,这些软件无论从功能上还是用户体验上都远远没有达到方便快捷实时的要求。它们基本上是从网页到手机客户端的一种简单的功能迁移,仅仅能满足分时段分楼栋的查询需求,对于教室的临时变动,以及自习室内部的人数占用情况,显得无能为力。
根据以上分析,整理出本系统的具体需求:
1. 本系统服务器端需每天从教务处信息中心获取最新的数据,实时更新,保证数据准确。
2. 本系统需满足学生最基本的自习室查询需求,包括条件查询、指定查询、快速定位,保证以最快速度查询到可自习教室。
3. 本系统需提供信息反馈机制,让用户自己来更正或提供自习室最新动态,实现信息的最大化共享。
4. 本系统需提供信息推送机制,以保证在发生特殊事件时第一时间通知到用户。
5. 为了鼓励用户积极反馈自习室动态,本系统需提供一定的激励机制,给与积极反馈的用户一定奖励。
13
华中科技大学硕士学位论文
3.2 系统部署
本系统采用当前主流的移动互联网技术,设计出结合一整套完整的自习室信息服务系统解决方案。系统的部署图如图 3.1所示, Android智能手机通过移动网络访问自习室信息服务系统的服务器,而自习室信息服务系统服务器则定时从教室使用信息查询系统爬取数据,并存储到数据库中,同时响应客户端请求提供数据。
智能手机教室使用信息查询系统智能手机信号塔自习室信息服务系统服务器数据库智能手机
图 3.1 系统部署图
3.3 系统功能设计
通过对系统的需求分析,提炼出系统的功能点。自习室信息服务系统功能的设计,首先需要满足准确性、便捷性、移动性的要求,同时兼顾其他一些人性化的需求,以求最大程度帮助学生快速找到自习室。基于以上原则,本系统的功能结构如图 3.2所示。
14
华中科技大学硕士学位论文
按教学楼查询按楼栋快速定位自习室查询按时段筛选信息反馈单个教室查看统计排名自习室信息服务个人信息变更修改昵称消息推送反馈排行榜版本升级
图 3.2 系统功能框架图
本系统以自习室信息查询为基本功能点,提供了按教学楼查询、按楼栋快速定位、按时段查询、单个教室查询等多种查询方式。除此之外,自习室信息的反馈是系统功能的一大亮点。用户在第一次反馈时,必须注册一个昵称,作为一个唯一的ID。一旦用户进行信息反馈,该昵称就会出现在反馈记录中。自习室信息反馈,是为了弥补单一的查询功能无法传递的信息,以最大程度达到信息的准确化。当然,信息的准确化在很大程度上是建立在广大的用户群基础上的,所以,为了鼓励用户反馈,设立了排行榜,通过后台的统计,对积极参与反馈的用户按照反馈次数进行榜上公布。同时,提供一定的物质奖励,通过消息推送机制进行公告。另外,为了保证用户能在第一时间得到版本升级,也提供了升级提示和下载升级功能。
3.3.1 信息查询功能设计
信息查询功能是自习室信息服务最基本的功能,提供了按教学楼查询、按楼栋快速定位、按时段筛选、单个教室查看等多种查询方式。
按教学楼查询:列出学校中所有的教学楼,学生根据需要选择教学楼迅速切换进行查询。
按楼栋快速定位:有些教学楼分了好几个楼栋,如我校的东九教学楼就分了15
华中科技大学硕士学位论文
A、B、C、D四栋子楼,为了让学生快速查询到所需楼栋的自习室信息,需提供楼栋定位导航。
按时段筛选:在时段的选择上,既要做到足够细分,又要做到足够灵活。上午分为1-2节、3-4节、全上午三个时段;下午分为5-6节、7-8节、全下午三个时段;晚上分为9-10节、11-12节、全晚上三个时段。这样就可以覆盖到所有的时间区间,让学生根据自己的需要筛选出可自习的教室。
单个教室查看:学生通过以上方法筛选出可自习的教室,可选择想自习的教室查看全天的课程安排。另外,单间教室查看也是自习室信息反馈的入口。
信息查询模块的类设计如图 3.3所示,这种类结构设计可以将各种查询方式的实现类与主线程类充分解耦合,并且通过内部接口实现了相互传递数据,提高了模块的可扩展性和可维护性。
ClassroomDialog(单个教室查询Dialog)-PriorityListenerPopupBuilding(按教学楼查询Dialog)-PriorityListener+onCreate()+onClick()+onStart()+onStop()+onCreate()+onClick()+onStart()+onStop()MainActivity(主界面、主线程类)PopupMorning(上午时段查询Dialog)-PriorityListener+onCreate()+onClick()+onStart()+onStop()-listenerBuilding-listenerMorning-listenerAfternong-listenerNight+onCreate()<
图 3.3 信息查询功能模块类设计图
本类图中所有类和接口说明如下:
16
华中科技大学硕士学位论文
MainActivity类:是系统的主界面类,也是程序的主线程类,相当于程序的入口,负责监听主界面上的所有按钮并触发操作,发起子线程等;
PriorityListener类:声明在各个Dialog中的内部接口,接口中声明一个回调函数refreshPriorityUI,用于在Dialog的监听事件触发后刷新MainActivity的UI显示;
PopupBuilding类:按教学楼查询方式的显示对话框,列出学校中所有的教学楼供选择;
PopupMorning类:按照时段(上午时段)筛选方式的显示对话框,列出1-2节、3-4节、全上午三个时段供选择;
PopupAfternoon类:按照时段(下午时段)筛选方式的显示对话框,列出5-6节、7-8节、全下午三个时段供选择;
PopupNight类:按照时段(晚上时段)筛选方式的显示对话框,列出9-10节、11-12节、全晚上三个时段供选择;
ClassroomDialg类:单个教室查看的显示对话框;
GetClassroomThread类:子线程类,根据用户选择的结果,向服务器端请求数据;
Classroomdb类:对客户端SQLite数据库的增删查改的封装类,在这里主要用于对查询结果的缓存。
3.3.2 信息反馈功能设计
自习室信息反馈的功能设计是为了提供自习室最及时、最准确的动态。由于教务处只提供每栋教学楼每间教室的所有课程安排情况,并不能提供可自习教室的实时人数情况以及临时变动,因此在自习室资源得不到有效供给的情况下,学生寻找自习室将付出极大的时间成本。自习室信息反馈功能源于此背景,但是在功能的设计上有几个难点需要考虑。
首先,信息的反馈全部来源于应用的直接用户——学生,如何防止学生恶意、虚假反馈,是关乎信息反馈是否有效的首要因素。虽然目前大学生素质在不断提高,但不排除个别学生出于个人目的或其他原因进行恶意、虚假反馈。解决这个问题首先应在后台加入反馈间隔和时间限制。可考虑同一个ID每隔若干秒才能反馈一次,每个ID在若干分钟内反馈次数不能超过若干个。此方法为直接控制法。
其次,高质量、及时的反馈结果一定是建立在大量的用户反馈量基础上的。如何鼓励学生积极地、如实地反馈,又是系统遇到的一大难题。可通过设置昵称,让积极反馈的用户昵称显示在首页,呈现在大家面前,满足“做好事留名”的成就感。同时,专门设立排行榜,通过后台的统计,对积极参与反馈的用户按照反馈次数进17
华中科技大学硕士学位论文
行榜上公布,从直观上“刺激”学生进行有效地反馈。另外,提供一定的物质奖励,比如:手机充值卡、电影兑换券等,不定期奖励给积极、如实反馈的学生,并通过消息推送机制进行系统公告。通过以上的激励方法,能够在一定程度上促使学生进行信息反馈,同时,也能够在一定程度上“稀释”掉极少数的恶意、虚假反馈记录。
最后,反馈形式的设置,很大程度上影响着该功能的用户体验。第一种方式是让用户自己通过文字陈述进行反馈,考虑到这种方式操作起来并不便利,并且会导致信息的杂乱无章,不方便后台的统计,故考虑用第二种方式,通过预设选项让用户进行选择。一个自习室的状态无外乎以下几种:1)自习室内很空,有大量空座位;2)自习室内人数适中;3)自习室内人数很多,只有少量空座位;4)原本可自习的教室被活动占用了。根据以上情况,可设置4个选项供用户选择,如图 3.4所示。一旦用户经过或者进入某个自习室,即可通过此功能进行反馈。
空自习室内很空,有大量空座位一般自习室内人数适中满自习室内人数很多,只有少量空座位被占原本可自习的教室被活动占用了
图 3.4 信息反馈示意图
信息反馈模块的类设计图如图 3.5所示,类结构设计与信息查询模块的类结构设计大致相似。需要说明的是,图中的UpdateAllFeedbackThread类的作用是当主线程MainActivity处理完DoFeedbackThread发来的消息后,启动该线程进行主界面反馈结果的刷新。
18
华中科技大学硕士学位论文
ClassroomDialog(单个教室查询Dialog)-PriorityListener+onCreate()+onClick()+onStart()+onStop()DoFeedbackThread(信息反馈线程类)<
图 3.5 信息反馈功能模块类设计图
3.3.3 消息推送功能设计
为了让用户第一时间获取到相关通知,系统需自带消息推送功能。所有与教室安排相关的信息,都可以通过消息推送机制进行广播通知。例如一些相关机构的考试可能占用整栋教学楼,可提前通过消息推送告知用户,避免不必要的麻烦。另外,上文曾提及,为了鼓励用户参与信息反馈,会提供一定的物质奖励。系统后台会按照每个ID某段时间内的反馈次数进行统计,对于排名靠前的用户,通过消息推送通知其领取奖励。除此之外,系统还可提供一些生活上的便利,如天气预报等等。
本系统的消息推送机制实际上还是客户端主动向服务器端发起请求的过程,即客户端首先发请求至服务器端,询问是否有最新消息,如果有,则服务器端将最新的消息传递至客户端。
消息推送模块的类设计如图 3.6所示,由于消息是通过调用MainActivity中的showNotifacation()方法,在状态栏中弹出,点击状态栏中的消息,必须跳转到另外一个Activity,也就是图中的MessageAcivity,这个Activity用来实现消息的弹出。GetMessagesThread类是获取消息的线程类。
19
华中科技大学硕士学位论文
MessageActivity(消息推送Activity)+onCreate()MainActivity(主界面、主线程类)-listenerBuilding-listenerMorning-listenerAfternong-listenerNight+onCreate()+showNotifacation()GetMessagesThread(获取消息线程类)+run()+initHttp()
图 3.6 消息推送功能模块类设计图
3.3.4 版本升级功能设计
为了保证用户能在第一时间得到版本升级,系统提供了升级提示和下载升级功能。每次在后台发布新版本后,用户打开应用会收到升级提示消息,若选择升级,系统会判断手机是否处在Wifi连接状态,若已连接Wifi,则直接从后台下载数据,下载完毕后覆盖安装即可升级到最新版本;若未连接Wifi,则给与用户提示,是否通过移动网络下载数据。版本升级功能的示意图如图 3.7所示。
消息栏升级提示否是否升级取消升级是否已连接Wifi通过移动网络下载否取消升级是是下载新版本覆盖安装升级完成
图 3.7 版本升级流程图
20
华中科技大学硕士学位论文
版本升级模块的类设计图如图 3.8所示,与信息查询模块和信息反馈模块类似,在版本检测类CheckNew中声明一个内部接口,接口中声明一个回调函数refreshPriorityUI,用于在Dialog的监听事件触发后刷新MainActivity的UI显示;当CheckNew类检测到有新版本时,则跳转到SetupActivity进行程序的覆盖安装完成升级。DetectNewVersionThread类是检测新版本的线程类。
CheckNew(版本检测类)-PriorityListener+showNotifacation()+check()+showUpdateDialog()+showWaitDialog()+downloadTheFile()SetupAcitvity(程序安装Activity)<
图 3.8 版本升级功能模块类设计图
3.4 数据库设计
对于自习室信息服务系统,需要存储教室信息、用户访问记录、用户反馈记录、软件版本信息等数据。本系统选用MySQL数据库来存储各部分数据。MySQL是一个跨平台的开源关系型数据库,它具有操作简单、性能高、可移植性好等特点[37]。
根据自习室信息服务系统各个功能模块的设计要求,设计了6个数据表,包括存储教室课程安排信息的教室信息表,存储用户访问后台数据的用户访问记录表,存储用户反馈信息的用户反馈表,存储后台爬虫爬取并更新数据的更新记录表,存储广播消息的广播消息表,存储软件版本及新特性的版本信息表。数据库模型图如图 3.9所示。
21
华中科技大学硕士学位论文
更新记录表PK
用户访问记录表PKFK1
id教室信息表user_idbuildingrequest_timeversionPK
FK1
FK2
idclassroom_numbuildingmorning1morning2afternoon1afternoon2night1update_timefeedback_idpercentweekuser_idnicknamefeedback_time
广播消息表PK
idtitlemessagedeadlineidupdate_time用户反馈记录表PK
FK1
idclassroom_numuser_idpercentfeedback_timeweeknicknamebuilding版本信息表PK
idversionIDurlfeature用户信息表PK
idnickname
图 3.9 数据库模型图
本系统数据库以教室信息表为核心,通过用户反馈,将教室信息和用户信息串连在一起。各个表的详细功能与结构设计如下:
1. 教室信息表(classroom_info):用于记录每栋教学楼每间教室一周内的课程安排情况。其中字段classroom_num表示教室号;字段building表示教室所在的教学楼;字段morning1和morning2分别表示上午一二节课课程安排和三四节课课程安排;字段afternoon1和afternoon2分别表示下午五六节课课程安排和七八节课课程安排;字段night1表示晚上的课程安排;字段update_time表示数据的更新时间;字段feedback_id表示最新一条的反馈ID,与user_feedback表的主键id建立外键关联;字段percent表示当前教室的人数占用情况;由于classroom_info表存储的是一周七天的数据,故字段week用于区分周几;字段user_id表示当前教室最新反馈的用户22
华中科技大学硕士学位论文
id,与user表的主键id建立外键关联;字段nickname表示当前教室最新反馈的用户昵称;字段feedback_time表示当前教室最新反馈的时间。
2. 用户信息表(user):用于记录每个用户信息的表。其中字段id为每个用户的唯一标识,实际上为每部手机的唯一标识;字段nickname表示每个用户第一次反馈信息时注册的昵称,该昵称可随时修改。具体设计如表所示。
3. 用户访问记录表(user_record):用于记录用户访问后台数据的情况。其中字段user_id表示访问后台数据的用户id,与user表的主键id建立外键关联;由于用户每次从后台获取教室数据,并非全部获取,而是单独获取指定教学楼的教室信息,故building表示当前用户获取数据的教学楼;request_time表示获取数据的时间;version表示该用户使用的系统版本号。
4. 用户反馈记录表(user_feedback):用于记录用户的反馈信息。其中字段classroom_num表示该用户参与反馈的教室号;字段user_id表示反馈信息的用户id,与user表的主键id建立外键关联;字段percent表示该用户反馈的当前教室的人数占用情况;字段feedback_time表示反馈的时间;字段nickname表示反馈用户的昵称;字段building 表示该用户参与反馈的教室所在的教学楼。
5. 更新记录表(log_update):用于记录后台爬虫爬取并更新数据的信息。爬虫每天凌晨启动,爬取今天明天后天三天的数据,故每天产生三条记录。其中字段update_time表示数据更新的时间。
6. 广播消息表(message):用于记录广播通知的信息。其中字段title表示本条消息的标题;字段message表示本条消息的内容;字段deadline表示本条消息的失效日期。
7. 版本信息表(version):用于记录软件版本及新特性信息。其中字段version表示版本号;字段url表示该版本的下载地址;字段feature表示该版本的新特性。
3.5 数据爬取策略设计
基于Android平台的自习室信息服务系统的数据来源于华中科技大学教务处的教室使用信息查询系统。系统服务器每天凌晨启动爬虫从教室使用信息查询系统爬取数据并存储在数据库中。考虑到教室使用信息查询系统一旦发生故障不能访问,将直接导致本系统无数据可依。故本系统首先在爬取数据环节“未雨绸缪”,每天都爬取包括当天在内的未来一周的数据,如图 3.10所示。
23
华中科技大学硕士学位论文
2013/1/22013/1/12013/1/32013/1/42013/1/52013/1/62013/1/72013/1/32013/1/22013/1/42013/1/52013/1/62013/1/72013/1/82013/1/42013/1/32013/1/52013/1/62013/1/72013/1/82013/1/9
图 3.10 数据爬取策略示意图
假设2013年1月1日爬取了从1月1日当天到1月7日的数据,那么第二天1月2日爬取的是从1月2日当天到1月8日的数据,所以,每次爬取都有至少五天的数据被覆盖更新,这样的策略是考虑到教务处的教室使用信息查询系统数据有可能提前一两天做出变动,这样的覆盖更新能够保证系统获取的数据是最新可靠的。并且,一旦教务处的教室使用信息查询系统发生故障不能访问,这样的爬取策略也能够在一定程度上“缓冲”对本系统造成的影响。
3.6 客户端与服务器端通信接口设计
本系统客户端通过HTTP协议,与后台服务器端进行通信,客户端与服务器端通过JSON格式进行数据交互。因此,需要规定好客户端与服务器端之间的通信接口,以保证数据交互能够正常进行。
本系统根据实际功能,设计了8个功能接口,详见表 3.1所示。
表 3.1 功能接口说明
接口名称
获取教室信息接口
查询反馈信息接口
接口类
GetClassroom
GetFeedback
接口说明
获取指定教学楼的所有教室信息
查询指定教学楼所有可自习教室的最24
华中科技大学硕士学位论文
新用户反馈
用户反馈接口 UserFeedback 反馈某个教室的占用情况
获取指定教室当天的反馈记录
获取用户反馈次数总排名
修改用户昵称
获取最新的消息,推送给用户
检测软件是否有新版本
获取单个教室反馈记录接口 GetSingleFeedback
获取反馈总排名接口
修改昵称接口
消息推送接口
检测新版本接口
GetRanking
ModifyNickname
GetMessage
DetectNewVersion
接下来将分析每个接口的请求数据、响应数据,以及服务器端收到请求后的处理、客户端收到响应后的处理:
3.6.1 获取教室信息接口
获取教室信息接口的请求/响应数据字段设计及字段说明如表 3.2所示:
表 3.2 获取教室信息接口字段说明
请求数据字段
identifier
字段说明
Android设备的唯一标识
currentVersion 用户当前使用的客building
户端版本
building 查询的教学楼 Classrooms(数组) 该教学楼当天的全部教室使用信息
响应数据字段
isSuccess
字段说明
本次请求是否成功,不成功则不处理后续数据
查询的教学楼
当服务器端收到客户端发来的请求后,根据字段“building”在数据库中查找出该教学楼当天的全部教室使用信息,通过JSON拼装classroom数组后返回给客户端。客户端在收到服务器端返回的数据后,首先判断字段“isSuccess”是否为true,如果是才可解析classrooms数组并进行后续处理;否则说明本次查询请求不成功,并给与用户相应的提示。
3.6.2 查询反馈信息接口
查询反馈信息接口的请求/响应数据字段设计及字段说明如表 3.3所示:
表 3.3 查询反馈信息接口字段说明
请求数据字段
identifier
字段说明
Android设备的唯一响应数据字段
isSuccess
字段说明
本次请求是否成功,不成功则不25
华中科技大学硕士学位论文
标识
building 查询的教学楼 feedback(数组)
处理后续数据
该教学楼所有教室最新的反馈信息
ranking(数组) 该教学楼当天所有参与反馈用户的排行榜单
当服务器端收到客户端发来的请求后,根据字段“building”在数据库中查找出该教学楼所有教室最新的反馈信息,通过JSON拼装feedbcak和ranking数组后返回给客户端。客户端在收到服务器端返回的数据后,首先判断字段“isSuccess”是否为true,如果是才可解析feedbcak和ranking数组并进行后续处理;否则说明本次查询请求不成功,并给与用户相应的提示。
3.6.3 用户反馈接口
用户反馈接口的请求/响应数据字段设计及字段说明如表 3.4所示:
表 3.4 用户反馈接口字段说明
请求数据字段
identifier
字段说明
Android设备的唯一标识
nickname 当前反馈用户的昵
称
classroom 当前用户反馈的教
室
percent 反馈的教室占用情
况
响应数据字段
isSuccess
字段说明
本次请求是否成功,不成功则不处理后续数据
当服务器端收到客户端发来的请求后,根据字段“identifier”判断该用户在最近一段时间内是否频繁参与反馈并超过了反馈次数限制,如果没有,则将该条反馈记录插入后台数据库,并将字段“isSuccess”设为true返回给客户端通知用户反馈成功;如果该用户超过了反馈次数限制,则将字段“isSuccess”设为false返回给客户端通知该用户超过了反馈次数限制。
3.6.4 获取单个教室反馈记录接口
获取单个教室反馈记录接口的请求/响应数据字段设计及字段说明如表 3.5所示:
26
华中科技大学硕士学位论文
表 3.5 获取单个教室反馈记录接口字段说明
请求数据字段
identifier
字段说明
Android设备的唯一标识
classroom 当前教室 feedback(数组)
响应数据字段
isSuccess
字段说明
本次请求是否成功,不成功则不处理后续数据
当前教室当天的历史反馈记录
当服务器端收到客户端发来的请求后,根据字段“classroom”在数据库中查找出该教室当天的历史反馈记录,通过JSON拼装feedbcak数组后返回给客户端。客户端在收到服务器端返回的数据后,首先判断字段“isSuccess”是否为true,如果是才可解析feedback数组并进行后续处理;否则说明本次请求不成功,并给与用户相应的提示。
3.6.5 获取反馈总排名接口
获取反馈总排名接口的请求/响应数据字段设计及字段说明如表 3.6所示:
表 3.6 获取反馈总排名接口字段说明
请求数据字段
identifier
字段说明
Android设备的唯一标识
ranking(数组)
响应数据字段
isSuccess
字段说明
本次请求是否成功,不成功则不处理后续数据
用户反馈次数总排名
当服务器端收到客户端发来的请求后,在数据库中统计截至目前为止所有用户按照反馈次数从高到低的排名顺序及反馈总次数,通过JSON拼装ranking数组后返回给客户端。客户端在收到服务器端返回的数据后,首先判断字段“isSuccess”是否为true,如果是才可解析ranking数组并进行后续处理;否则说明本次请求不成功,并给与用户相应的提示。
3.6.6 修改昵称接口
查询反馈信息接口的请求/响应数据字段设计及字段说明如表 3.7所示:
表 3.7 修改昵称接口字段说明
请求数据字段
identifier
字段说明
Android设备的唯一标识
nickname 修改后的昵称
响应数据字段
isSuccess
字段说明
本次请求是否成功,不成功则不处理后续数据
当服务器端收到客户端发来的请求后,根据教学楼字段“nickname”在数据库27
华中科技大学硕士学位论文
中替换该用户的旧昵称,并向客户端返回修改结果。如果字段“isSuccess”为true说明修改成功;否则说明修改不成功。
3.6.7 消息推送接口
消息推送接口的请求/响应数据字段设计及字段说明如表 3.8所示:
表 3.8 消息推送接口字段说明
请求数据字段
identifier
字段说明
Android设备的唯一标识
messages(数组)
响应数据字段
isSuccess
字段说明
本次请求是否成功,不成功则不处理后续数据
消息数组
当服务器端收到客户端发来的请求后,在数据库中查询所有有效的消息,通过JSON拼装messages数组后返回给客户端。客户端在收到服务器端返回的数据后,首先判断字段“isSuccess”是否为true,如果是才可解析messages数组并进行后续处理;否则说明本次请求不成功,并给与用户相应的提示。
3.6.8 检测新版本接口
检测新版本接口的请求/响应数据字段设计及字段说明如表 3.9所示:
表 3.9 检测新版本接口字段说明
请求数据字段
identifier
字段说明
Android设备的唯一标识
currentVersion 用户当前使用的客hasNew
户端版本
newVersion
newfeature
upgradeUrl
新版本号
新版本特性
升级链接
响应数据字段
isSuccess
字段说明
本次请求是否成功,不成功则不处理后续数据
是否查询到新版本
当服务器端收到客户端发来的请求后,根据字段“currentVersion”在数据库中查判断该用户当前使用的客户端版本是否最新版本,如果是,则将“hasNew”设为false,并告知客户端;否则将“hasNew”设为true,通过JSON封装newVersion、newfeature、upgradeUrl等字段返回给客户端。客户端在收到服务器端返回的数据后,首先判断字段“isSuccess”是否为true,如果是才可进行后续处理;否则说明本次请求不成功,并给与用户相应的提示。
28
华中科技大学硕士学位论文
3.7 本章小结
本章在上一章所介绍的相关技术的基础上,对自习室信息服务系统进行了需求分析及功能设计,首先针对直接服务对象学生进行需求调研,接着对这些需求进行汇总和整理,然后在此基础上对本系统的总体功能框架进行了设计,并对本系统的具体功能、数据库以及客户端/服务器端的通信接口进行了详细的分析和功能设计。本章所述的需求分析和功能设计为下一章的系统实现提供了前提条件。
29
华中科技大学硕士学位论文
4 自习室信息服务系统的实现与测试
在上一章中对自习室信息服务系统的需求进行分析,并对系统的需求、系统的功能框架、以及数据库进行了详细的设计。本章将在上一章工作的基础上对本系统进行详细的实现和系统测试。
4.1 客户端功能模块实现
本文相关基于Android+Servlet架构的自习室信息服务系统按照功能可以划分成以下功能模块:信息查询模块、信息反馈模块、统计排名模块、个人信息变更模块、消息推送模块、版本升级模块。每个功能模块的大体实现方式类似,都需要从主线程发起子线程与服务器端通信。各个功能模块对应的线程类如表 4.1所示。
表 4.1 功能模块与线程类的对应图
功能模块
信息查询
信息反馈
统计排名
个人信息变更
消息推送
版本升级
线程类
GetClassroomsThread
DoFeedbackThread、UpdateAllFeedbackThread
GetRankingThread
ModifyNicknameThread
GetMessagesThread
DetectNewVersionThread
另外,由于客户端需要通过网络连接服务器端,将部分获取到的数据存储在客户端SQLite数据库中,故本节先介绍网络连接模块和数据存储模块的实现,再选取有代表性的信息查询模块、信息反馈模块的技术实现进行详细阐述。
4.1.1 网络连接模块实现
本系统网络功能模块基于Android内置的HttpClient开发,HttpClient是Apache
Jakarta Common的子项目,是一个集成HTTP客户端工具包,由于其规范化及使用方便的特性被广泛使用[38]。使用HttpClient发送请求、接收响应很简单,只要如下几步即可:
1. 创建HttpClient对象。
2. 如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创30
华中科技大学硕士学位论文
建HttpPost对象。
3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
系统各个功能模块在网络连接方面大体一致,综合归纳,可用以下代码实现:
HttpGet httpRequest = new HttpGet(uriAPI);/* 创建HTTP Get连接 *//* 发出HTTP request */HttpClient client = initHttp();HttpResponse httpResponse = e(httpRequest);private HttpClient initHttp() {HttpClient client = new DefaultHttpClient();// 当向服务器发出请求后,请求和服务器建立socket连接,但是很长时间内都没有建立socket连接ams().setIntParameter(_TIMEOUT, 20000);// 客户端已经与服务器建立了socket连接,但是服务器并没有处理客户端的请求
ams().setIntParameter(TION_TIMEOUT,
20000);
return client;}
以上代码中看出,系统是通过HttpGet方式实现。为了防止网络中断或者服务器端没有处理客户端请求的情况,在initHttp方法中设置了超时时间,超过预设的时间后,系统则忽略该请求。
服务器端是否正常应答,这只需要通过以下代码进行判断:
if (tusLine().getStatusCode() == 200) // 状态码是否为200
服务器端若正常应答,则可通过对应答字符串的处理,获取相应的数据;若非正常应答或无应答,则需要抛出相应的异常并给与用户相应的提示。
需要指出的是,在客户端发起网络连接的过程中,为了不出现用户操作界面阻塞,需要在主线程(UI线程)之外另起子线程进行网络连接的异步操作。在此过程中,用户可以进行其他的操作而不受影响。当子线程通过网络连接获取到相应的的数据后,需要更新UI将结果呈现给用户。但是如果在子线程中直接更新UI,通常会抛出下面的异常:
ERROR/JavaBinder(1029):ot$CalledFromWrongThreadException:Only
the original thread that created a view hierarchy can touch its views.
意思是,无法在子线程中更新UI。为此,Andriod提供了几种方法,可以在子31
华中科技大学硕士学位论文
线程中通知UI线程更新界面:
iThread( Runnable )
( Runnable )
layed( Runnable, long )
Handler
比较常用的是通过Handler,通过Handler来接收子线程发送的数据,并用此数据配合主线程更新UI。那么,只要在主线程中创建Handler对象,在子线程中调用Handler的sendMessage方法,就会把消息放入主线程的消息队列,并且将会在Handler主线程中调用该handler的handleMessage方法来处理消息。
4.1.2 数据存储模块实现
上文已经提及,本系统客户端的数据存储采用的是SQLite数据库存储方式。客户端通过网络连接获取到教室信息数据后,就将这些信息存在客户端本地的SQLite数据库中。为此,需要在工程中预置一个定义好数据表以及数据类型的数据库,这样程序在被安装的时候的时候就不用通过代码以及SQL语句创建新的数据库。所以,把一个数据库db文件放在 res/raw/ 目录下,程序被安装的时候就直接加载这个数据库db文件到程序默认数据库目录下: /data/data/package_name/databases/db_name,
数据库db文件在工程的目录如图 4.1所示:
图 4.1 数据库文件在工程中的目录位置
为了方便客户端对SQLite数据的操作,在工程中专门建立了一个数据库管理类来封装所有的对数据库的操作,并且在中运用单例模式,保证该类仅有一个实例,并提供一个访问它的全局访问点,这样就保证了无论在哪个线程中获取数据库对象,都是同一个对象。
但是,SQLite对多线程支持并不是很好,如果用户发起两次查询请求,而当这两个子线程同时操作数据库时,会报 "Database is locked" 的错误。解决办法是运用32
华中科技大学硕士学位论文
同步机制,在一个线程类中对数据库操作的部分加入 synchronized 关键字,这样就可以确保该线程类的多个实例操作数据库时不会发生冲突。相应的代码如下所示:
private final static byte[] _writeLock = new byte[0];
public void run() {
// synchronized范围内的代码只能同步运行
synchronized (_writeLock) {
……
}
……
}
4.1.3 信息查询模块实现
自习室信息查询作为系统最核心的功能,故程序的主界面实际上就是信息查询界面。界面提供了按教学楼查询、按楼栋快速定位、按时段筛选、单间教室查看等多种查询方式。由此,系统需要生成多个选择对话框供用户操作,每个对话框均需要在xml布局文件中先定义好。以下是教学楼查询对话框的xml布局文件:
无论是教学楼查询对话框还是时段筛选对话框,他们的实现模式相对固定,故可编写对话框生成模块方便调用。在中调用如下方法即可生成相应的对话框:
private void showDialog(int popupLayout, final Dialog popupDialog) {
if (!hasDialog) {
Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
33
华中科技大学硕士学位论文
}
int statusBarHeight = ;
Window window = dow();
// 设置动画
if(popupLayout==_morning||popupLayout==.
popup_afternoon||popupLayout==_night){
dowAnimations(indowAnim);
}else if(popupLayout==_building){
dowAnimations(nWindowAnim);
}
Params lp = ributes();
……
// 设置对话框的相关属性
celedOnTouchOutside(true);
tWindowFeature(E_NO_TITLE);
();
hasDialog = true;
}
以上代码中,showDialog方法有两个参数:
popupLayout:需要生成的对话框的xml布局文件。
popupDialog:需要生成的对话框的实例。该实例在上文中已被定义。
当用户在弹出对话框中进行选择操作后,需要将对话框中选择的结果传回给MainActivity,MainActivity再根据传回的结果筛选出相应的结果进行界面渲染从而呈现给用户。然而,虽然从一个Activity向另一个Activity传递数据可以用Intent类实现,但对话框Dialog类并非一个Activity,所以从Dialog向Activity传递数据需要通过内部接口实现。可在需要生成的对话框类PopupDialog中声明一个内部接口PriorityListener,接口中声明一个回调函数refreshPriorityUI,用于在Dialog的监听事件触发后刷新MainActivity的UI显示。相关代码如下所示:
public class PopupDialog extends Dialog {
/**
* 自定义Dialog监听器
*/
public interface PriorityListener {
/**
* 回调函数,用于在Dialog的监听事件触发后刷新Activity的UI显示
*/
public void refreshPriorityUI(String string);
}
private PriorityListener listener;
/**
* 带监听器参数的构造函数
*/
public PopupDialog(Context context, int theme, PriorityListener listener) {
super(context, theme);
34
华中科技大学硕士学位论文
}
}
er = listener;
protected void onCreate(Bundle savedInstanceState) {
……
}
@Override
public void onClick(View v) {
dismiss();
hPriorityUI("xxx");
}
然后在MainActivity中的Button点击事件中实现这个接口并将其作为PopupDialog的构造函数的参数传入,并实现refreshPriorityUI方法。相关代码如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
……
lickListener(new OnClickListener() {
@Override
public void onClick(View v) {
PopupDialog popupDialog = new PopupDialog(,
, new tyListener() {
@Override
public void refreshPriorityUI(String string) {
…… // 更新UI的相关实现
}
});
……
();
}
});
}
以上代码中,通过refreshPriorityUI方法,就可以实现相关的UI渲染操作。
4.1.4 信息反馈模块实现
自习室信息反馈操作只能在单个教室信息对话框中进行。单个教室对话框如图
4.2所示。当用户第一次点击了“空”、“一般”、“满”、“被占”,会被要求注册昵称,输入昵称之后即可完成信息反馈,以后再进行反馈就无需再输入昵称。反馈之后,对话框下方的历史反馈记录中会出现相应的记录,包括反馈人的昵称、反馈信息、反馈时间。同时,主界面上对应教室的位置也会出现该次反馈的结果,如图4.3所示。
35
华中科技大学硕士学位论文
图 4.2单个教室对话框界面
图 4.3 单个教室对话框界面
在具体实现上,首先需要从MainActivity中生成弹出对话框ClassroomDialog,在PopupDialog类中声明一个内部接口PriorityListener,接口中声明一个回调函数refreshPriorityUI,在MainActivity中的Button点击事件中实现这个接口并将其作为ClassroomDialog的构造函数的参数传入,并实现refreshPriorityUI方法。同时,MainActivity需要发起两个子线程DoFeedbackThread和UpdateAllFeedbackThread,分别用来实现信息数据的反馈和主界面上反馈结果的刷新。下面的图 4.4说明了信息反馈的实现过程。
36
华中科技大学硕士学位论文
用户MainActivity类ClassroomDialog类DoFeedbackThread类UpdateAllFeedbackThread类onClick()show()onClick()refreshPriorityUI()showDialog()()run()ssage()Message()()run()ssage()
图 4.4 信息反馈模块时序图
1.
用户点击需要进行反馈的教室按钮,触发onClick()方法,并通过show()方法弹出显示单个教室信息对话框ClassroomDialog;
2. 在单个教室信息对话框ClassroomDialog中,用户点击了“空”、“一般”、“满”、“被占”四个反馈按钮的任意一个,都会触发onClick()方法,同时,通过回调MainActivity中的refreshPriorityUI方法,启动DoFeedbackThread线程进行信息反馈;
3. 若反馈成功,子线程DoFeedbackThread通过Handler向主线程MainActivity传递消息,子线程通过handleMessage方法接收并处理消息;
4. 主线程MainActivity处理完DoFeedbackThread发来的消息后,启动UpdateAllFeedbackThread线程进行反馈结果的刷新。
4.2 服务器端关键技术实现
基于Android平台的自习室信息服务系统服务器端应用Servlet搭建,并应用37
华中科技大学硕士学位论文
MySql作为底层数据库。相关表的设计请参照前面系统总体设计部分所述内容。
4.2.1 Watij实现网页爬虫
基于Android平台的自习室信息服务系统的数据来源于华中科技大学教室使用信息查询系统,网址为:202.114.5.131/,网页内容如图 4.5所示。在页面上方选择条件,点击查询按钮之后,页面下方会出现查询结果,查询结果以分页的形式显示。由于该网站采用.NET技术,用POST请求将分页的查询的结果通过Javascript进行封装,所以无法获得分页请求的链接。这意味着,通过基于网页链接的爬虫技术,根本无法获得分页的数据。
图 4.5 教室使用信息查询系统网页截图
基于以上原因,本系统采用Watij(Web Application Testing in Java)——基于 Web
应用的自动化测试程序来模拟用户操作,实现分页点击从而保存网页内容。Watij的安装及配置流程为:
1. 下载软件安装包,并进行解压。Watij_release_3.2.1 的下载地址:/projects/watij/files/
2. 将文件中的 拷到 C:windowssystem32 目录下。
38
华中科技大学硕士学位论文
3. 打开一个 Java IDE(如 Eclipse), 并创建一个新的工程。
4. 将 以及 lib 目录下的所有 jar 包都加载到工程的 classpath 中,如图 4.6所示。
图 4.6 Watij加载到工程的classpath中
添加 jar 包的具体操作步骤如下:
1. 依次打开 New->Project,选择“Java Project”,点击“Next”;
2. “Project Name”中输入“Watij”,点击“Next”;
3. 在“Java Settings”中选择“Libraries”的选项,点击“Add External JARs”;
4. 添加“”和 lib 目录下的所有 jar,点击“Finish”。
完成以上步骤后,就可以在程序中调用Watij的API来模拟浏览器操作。Watij支持模拟IE、FireFox,本系统采用IE模拟,打开FireFox网页的代码如下所示:
private static String homepage = "202.114.5.131/";
……
WebSpec spec = new WebSpec().ie(); // 实例化一个IE浏览器
(homepage); // 打开网页
打开网页后,需要一系列的鼠标模拟操作:选择需要查询的教学楼、选择查询日期、选择需要查询的教室(或全选)、点击查询按钮,这些操作的实现代码如下所示:
().("Build").set("value", buildingValue[i]);// 选择教学楼
().("QueryDate").set("value", dates[j]);// 选择日期
().("btnRightall").click();// 选择所有教室
39
华中科技大学硕士学位论文
().("Button1").click();// 点击查询
点击查询按钮之后,就可以将当前网页下载下来。为了实现“翻页”,则需要运行以下代码:
Tag tag = .a().ext("后页");
这样通过循环,就可以将所有教学楼的所有教室使用信息通过网页形式保存到本地硬盘中。再通过正则表达式关键字提取,就可以把教室使用信息批量地存储到MySQL数据库中。综上所述,要实现网页爬虫的基本要素就是网页链接,在本系统中,Watij工具的作用本质上就是提供网页链接,从而实现后台数据爬取的功能。
4.2.2 Quatz定时触发爬虫
上一小节介绍了系统如何实现网页内容的爬取。本小节将介绍如何通过Quatz工具定时启动网页爬虫进行数据爬取。
Quartz是个开源的作业调度框架,利用Quartz可以在 Java 应用程序中进行作业调度。Quartz 允许应用程序定时来调度作业。
使用Quartz之前,需要通过 Quartz API 对项目进行配置。配置之后,就可以通过实现接口,来覆盖execute(JobExecution Context context) 方法。在execute(JobExecution Context context)方法中可以实现需要执行的任何作业代码。在本系统中,就是让爬虫任务类CrawlerScheduleTask实现接口,并重写execute (JobExecutionContext context) 方法,来完成定时启动的任务,相关代码如下所示:
public class CrawlerScheduleTask implements Job {
public void execute(JobExecutionContext context)throws JobExecutionException
{
……
}
)
可以用许多属性来调整 Quartz 的行为,这时就应当在ties文件中指定这些属性:
40
华中科技大学硕士学位论文
#---------调度器属性----------------ceName = ceId = one#---------线程配置--------------- = Count = Priority = 4#---------作业存储设置------------ = Store#---------插件配置-------------=
me =
以上配置文件中,各个属性的说明如下:
1. 调度器属性:分别设置调度器的实例名(instanceName)和实例ID (instanceId)。它们可以是任何字符串,但必须保证这个值是在所有调度器实例中唯一的。
2. 线程池属性:属性class是一个类的全限名称,这个类实现了中的ThreadPool接口。threadCount 属性表示系统创建多少个工作者线程来处理作业。threadPriority属性表示Job线程的优先级,最小值为1,最大值为10。优先级别高的线程比级别低的线程更优先得到执行。
3. 作业存储属性: 该设置描述了在调度器实例的生命周期中,Job 和Trigger信息的存储位置。将属性设置为 .
Store,即可使Job存储在内存中。
4. 其他插件属性:当 被设置成.
tializationPlugin时,JobInitializationPlugin插件会在classpath中搜索名为的文件并从中加载Job和Trigger信息。
所以,接下来要编写ties中“me
= ”的文件,如下所示:
41
华中科技大学硕士学位论文
以上配置文件中,每个
最后,需要在工程的配置文件里加入quatz的监听器,即可正常运行quatz。
4.3 系统功能测试
在完成了系统的设计和实现之后,需要确认系统的实现是否与最初所定义的需求相符,这就需要对系统进行测试[39]。
4.3.1 测试环境
本系统为基于C/S架构的系统,客户端端和服务器端运行环境的不同将对最终的测试结果造成很大影响,因此分别要对Android客户端和Servlet服务器端进行测试。服务器端的测试环境如表 4.2所示。
表 4.2 服务器端测试环境
软件环境
操作系统
Java版本
Tomcat服务器版本
MySQL数据库版本
硬件环境
CPU
内存
Windows 7
jdk1.6.0_18,jre6
apache-tomcat-6.0.9
MySQL Server 5.1
Intel Core i5-2300 2.80GHz
8.00GB
Android平台为在PC机上测试应用程序提供了一个特有的模拟器,它可模拟一个虚拟手机来运行Android程序,可选择自己的SD卡、皮肤样式、GPS支持、LCD大小等,具有高效、简洁、节省资源的特点[40]。本设计为系统创建了API 10的AVD,42
版权声明:本文标题:基于Android平台的自习室信息服务系统的设计与实现 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1705117074h473455.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论