梁轟++王江平++徐家喜
摘要:在沒有提供校園網(wǎng)站服務(wù)器的開放平臺(tái)環(huán)境下,設(shè)計(jì)實(shí)現(xiàn)了一款基于Android的校園網(wǎng)站客戶端,該客戶端可以查詢校園的即時(shí)信息和非即時(shí)信息,以及校園卡圈存。該系統(tǒng)采用HttpClient技術(shù)實(shí)現(xiàn)信息門戶的登錄和訪問,并利用多線程和jsoup技術(shù)對信息門戶中師生關(guān)注的信息進(jìn)行抓取和有效地提取,使用SQLite輕型數(shù)據(jù)庫對提取的數(shù)據(jù)進(jìn)行存儲(chǔ),并結(jié)合ORMLite持久化框架來對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行高效地增刪改查操作。
關(guān)鍵詞:Android;校園網(wǎng)站客戶端;HttpClient;jsoup;ORMLite持久化框架+
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)11-0044-03
The Design and Implementation of Campus Networks Client Based on Android
LIANG Hong, WANG Jiang-ping, XU Jia-xi
( School of Information Engineering,Nanjing Xiaozhuang University,Nanjing 211171,China)
Abstract: Without the servers open platform of the campus network, a client of campus network based on Android was designed and realized. Instant message and non-instant message could be read and money could be transferred from the bank card to the campus card on the client.The system used HttpClient to login and surf the portal system, used multithreading and jsoup to capture and extract valid data from the portal system, used SQLite database to store data and used ORMLite framework to perform CRUD operations.
Key words:Android; client of campus network; HttpClient; jsoup; ORMLite persistence framework
1 引言
在國內(nèi),智能手機(jī)用戶和互聯(lián)網(wǎng)用戶數(shù)增長顯著。據(jù)《2013-2014年中國移動(dòng)互聯(lián)網(wǎng)調(diào)查研究報(bào)告》,截至2014年6月,我國手機(jī)網(wǎng)民規(guī)模為5.27億,在整體網(wǎng)民中占比達(dá)83.4%[1],并且在2014年,大學(xué)生市場中智能手機(jī)普及率高達(dá)98%[2]。在智能終端的使用越來越廣泛的趨勢下,大學(xué)生也越來越傾向于使用智能終端設(shè)備來瀏覽網(wǎng)絡(luò)信息。但是目前大部分的校園網(wǎng)站是針對PC瀏覽器設(shè)計(jì)開發(fā)的,導(dǎo)致信息在智能終端設(shè)備屏幕上顯示比較凌亂且冗長,查找信息不方便,甚至有的出現(xiàn)無法訪問的情況,因此設(shè)計(jì)實(shí)現(xiàn)一款基于Android顯示簡潔的校園網(wǎng)站客戶端是極具實(shí)用意義的。
在基于Android的校園網(wǎng)站客戶端中,用戶能夠高效便捷地獲取校園網(wǎng)站的即時(shí)信息與非即時(shí)信息。一些如報(bào)名和考試等重要的即時(shí)信息能夠被推送到該校園網(wǎng)站客戶端上,使校園通知公告的及時(shí)性得到提高。同時(shí)用戶還可以快速地查詢?nèi)纾赫n表、成績、借閱書籍等個(gè)人的非即時(shí)信息。
Android校園網(wǎng)站客戶端獲取上述即時(shí)消息和非即時(shí)消息的數(shù)據(jù)有兩種方案,一種是擁有校園網(wǎng)站的的賬號(hào)和密碼以合法用戶身份進(jìn)行訪問。另一種是學(xué)校直接提供校園網(wǎng)站服務(wù)器端的開放平臺(tái),開發(fā)時(shí)直接調(diào)用該平臺(tái)的數(shù)據(jù)接口獲得數(shù)據(jù)。開放平臺(tái)是一個(gè)web服務(wù),負(fù)責(zé)接收客戶端提交的參數(shù),并根據(jù)參數(shù)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯[3],最終將請求的數(shù)據(jù)返回給客戶端。但此類系統(tǒng)一般不提供開放平臺(tái)的接口,因此,基于Android的校園網(wǎng)站客戶端將以某學(xué)院的校園網(wǎng)站為例,采用第一種方案來獲取校園網(wǎng)站數(shù)據(jù),實(shí)現(xiàn)校園網(wǎng)站客戶端。
2 模塊設(shè)計(jì)
由于設(shè)計(jì)的客戶端應(yīng)用程序的用戶主要是在校大學(xué)生,他們比較關(guān)注自己的學(xué)習(xí)成績,學(xué)分,一卡通使用情況和圖書借閱情況等,因此Android校園網(wǎng)站客戶端將這些功能集成在以下四大模塊中:用戶功能模塊、教務(wù)模塊、一卡通模塊和設(shè)置模塊。
為了保證合法用戶能安全的使用Android校園網(wǎng)站客戶端,用戶功能模塊中有登錄和注銷的功能。
個(gè)人數(shù)據(jù)模塊中有個(gè)人信息、選課信息、成績信息、考試信息、借閱信息和讀者信息的功能,用戶通過該模塊的功能可以查詢個(gè)人的教務(wù)和圖書信息。
一卡通模塊主要包括校園卡余額信息、校園卡基本信息、銀行卡余額信息、校園卡消費(fèi)信息、校園卡圈存和密碼修改功能,用戶通過該模塊的功能能夠方便地在智能終端上進(jìn)行校園卡的常規(guī)操作。
設(shè)置模塊中有退出登錄、清除數(shù)據(jù)、版本說明和免責(zé)聲明的功能,該模塊主要提供給用戶刪除本地用戶數(shù)據(jù)的功能。
校園網(wǎng)站客戶端的功能圖如圖1所示。
3 相關(guān)技術(shù)
為了實(shí)現(xiàn)校園網(wǎng)站客戶端上述的所有功能,所需要使用的核心技術(shù)有HttpClient、jsoup和ORMLite。
3.1 HttpClient
HttpClient實(shí)現(xiàn)了所有 HTTP 的方法,如常見的 GET、POST、PUT、HEAD 等[4]。在Android校園網(wǎng)站客戶端中,主要使用GET方法獲取驗(yàn)證碼,使用POST方法獲取信息門戶的Session信息,Session是允許客戶端和服務(wù)器端通過使用 HTTP 的請求與響應(yīng)頭中的數(shù)據(jù)來交換狀態(tài)信息的技術(shù)[5],以便登錄信息門戶。從HttpClient對象中可以獲取訪問目標(biāo)地址的文檔對象的二進(jìn)制數(shù)據(jù)流,最終從該文檔流中提取出校園網(wǎng)站的即時(shí)信息和非即時(shí)信息,存入本地的SQLite數(shù)據(jù)庫中。在Android校園網(wǎng)站客戶端中,主要使用HttpClient技術(shù)獲取校園網(wǎng)站各個(gè)信息頁面的源碼,為jsoup解析頁面提取上述即時(shí)與非即時(shí)數(shù)據(jù)奠定基礎(chǔ)。
3.2 jsoup
jsoup是一款Java的HTML解析器,它提供了一套便利的API,能夠通過文檔對象模型、層疊樣式表和類似于jQuery的操作方法來抓取和操作數(shù)據(jù)[6]。jsoup獲取數(shù)據(jù)有兩大方法:第一種是通過分析文檔對象模型的網(wǎng)頁標(biāo)簽和元素獲取數(shù)據(jù);第二種方法類似jQuery方式,使用jsoup包下的select元素選擇器。
在Android校園網(wǎng)站客戶端中,主要利用jsoup提供的選擇器來篩選出文檔對象中的有效數(shù)據(jù),如選課結(jié)果表單中的課程名、上課時(shí)間、地點(diǎn)、周期等數(shù)據(jù)。
3.3 ORMLite
ORM (Object/Relation Mapping)即對象關(guān)系映射,是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。Android校園網(wǎng)站客戶端中主要利用ORMLite的對象關(guān)系映射,在面向?qū)ο驤ava和關(guān)系型數(shù)據(jù)庫SQLite之間數(shù)據(jù)轉(zhuǎn)換時(shí),避免設(shè)計(jì)繁瑣的SQL語句,提高開發(fā)效率。
4 Android校園網(wǎng)站客戶端實(shí)現(xiàn)
依據(jù)功能圖設(shè)計(jì)的移動(dòng)客戶端的部分界面如圖2所示,在首頁界面中,主要提供了個(gè)人信息、選課信息、成績信息、考試信息、借閱信息和讀者信息的有效數(shù)據(jù),在一卡通界面中,主要提供了校園卡余額信息、校園卡基本信息、銀行卡余額信息、校園卡消費(fèi)信息。
圖2 移動(dòng)客戶端的部分界面圖
Android校園網(wǎng)站客戶端的核心技術(shù)是如何獲取校園網(wǎng)站的有效數(shù)據(jù),而數(shù)據(jù)獲取主要包括獲取HTML文檔數(shù)據(jù),提取有效數(shù)據(jù)和存取數(shù)據(jù),流程圖如圖3所示。
圖3 校園網(wǎng)站客戶端獲取數(shù)據(jù)流程圖
4.1 獲取HTML文檔數(shù)據(jù)
HTML文檔數(shù)據(jù)需要使用HttpClient對象來獲取,獲取流程如圖4所示。
圖4 HttpClient獲取HTML文檔數(shù)據(jù)流程圖
以登錄門戶系統(tǒng)為例,通過HttpClient獲取HTML文檔數(shù)據(jù)的核心代碼如下:
HttpPost httpPost = new HttpPost(“request_url”);
httpPost.setHeader("Cookie", "JSESSIONID=" + cookie);
List
nvps.add(new BasicNameValuePair("username", params[0]));
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity entity = httpResponse.getEntity();
String response_string = EntityUtils.toString(entity,"utf-8");
上述代碼中,HttpPost對象的主要作用是將Android 手機(jī)端的數(shù)據(jù)(NameValuePair對象)提交給Web 應(yīng)用服務(wù)器[8]。參數(shù)request_url是登錄驗(yàn)證用戶名和密碼的請求鏈接,參數(shù)cookie是指訪問該鏈接所需要的SessionID,params[0]是數(shù)組params中的用戶名,username是鍵值對的鍵,該鍵必須與校園網(wǎng)站表單中的name值一致,否則客戶端的請求無法通過校園網(wǎng)站的驗(yàn)證。DefaultHttpClient是發(fā)送HttpPost請求的類,服務(wù)器端處理完請求后會(huì)向客戶端發(fā)送響應(yīng)結(jié)果,該結(jié)果需使用HttpResponse類接收。EntityUitls的toString方法可以將響應(yīng)結(jié)果轉(zhuǎn)換為字符串,即響應(yīng)結(jié)果的HTML字符串。
4.2 提取有效數(shù)據(jù)
jsoup提供了parse(String HTML)的方法,將HTML字符串轉(zhuǎn)換為jsoup可操作的文檔對象模型。提取數(shù)據(jù)需要使用jsoup提供的select元素選擇器,實(shí)現(xiàn)代碼如下:
Document doc=jsoup.parse(response_string);
doc.getElementById("studentNumber").val();
doc.select("div[tabid=01] table tr.t_con");
第一種方法:選擇頁面源碼中id屬性為studentNumber的標(biāo)簽,并通過val()方法獲得該標(biāo)簽下的值,此處即學(xué)號(hào)。
第二種方法:復(fù)雜元素選擇器,選擇文檔對象模型中tabid屬性值為01下的div標(biāo)簽,再選擇該div下的table元素,接著選擇該table下class屬性值為t_con的所有tr元素。
在校園網(wǎng)站客戶端中,主要運(yùn)用以上兩種方法來對校園網(wǎng)站中的個(gè)人信息、選課信息、成績信息、考試信息、借閱信息和讀者信息等數(shù)據(jù)進(jìn)行抓取,避免了直接訪問頁面而出現(xiàn)的訪問不方便或者無法訪問的情況。
4.3 存取數(shù)據(jù)
ORMLite提供了許多在SQLite數(shù)據(jù)庫中便捷地增、刪、改、查數(shù)據(jù)的方法,使用ORMLite需要如下幾步工作:
1)引入ORMLite的jar包:將jar包復(fù)制到工程的libs目錄下。
2)構(gòu)建持久化實(shí)體類,主要使用注解@DatabaseTable將如Entity類映射到數(shù)據(jù)庫中的Entity表,使用注解@DatabaseField將成員屬性映射到Entity表中的字段,不別名字段名則以成員名命名。
3)創(chuàng)建DatabaseHelper類,該類繼承OrmLiteSqliteOpenHelper,實(shí)質(zhì)是間接繼承了SQLiteOpenHelper類,主要用來創(chuàng)建數(shù)據(jù)庫和表等基本數(shù)據(jù)庫的操作。
4)創(chuàng)建DAO類并使用ORMLite提供的方法來存取數(shù)據(jù)。
校園網(wǎng)站客戶端中,ORMLite技術(shù)主要用作保存于讀取從門戶網(wǎng)站中所提取的數(shù)據(jù),ORMLite提供的增、刪、改和查數(shù)據(jù)的方法擁有便捷和快速的特點(diǎn),在開發(fā)過程中節(jié)省了設(shè)計(jì)繁瑣SQL語句的時(shí)間。
5 總結(jié)
基于Android的校園網(wǎng)站客戶端是在沒有服務(wù)器端的開放平臺(tái)下設(shè)計(jì)實(shí)現(xiàn)的系統(tǒng),利用FireFox的FireBug調(diào)試工具和Fillder抓包工具[9]對校園網(wǎng)站進(jìn)行抓包,分析其請求頭部與響應(yīng)結(jié)果,再利用jsoup來抓取頁面中的有效數(shù)據(jù),并通過ORMLite對數(shù)據(jù)進(jìn)行存取。在消息推送方面則采用百度云推送平臺(tái)。該系統(tǒng)能夠使校園網(wǎng)站的信息在移動(dòng)智能終端得以更加方便、快捷的查詢,解決了在智能終端上訪問校園網(wǎng)站不方便或者無法訪問的問題,并且用戶還可以在客戶端上進(jìn)行校園卡圈存等操作,使校園一卡通系統(tǒng)移動(dòng)化,具有良好的實(shí)用性。同時(shí),也為廣大Android開發(fā)者提供了一種在沒有服務(wù)器端的開放平臺(tái)下進(jìn)行網(wǎng)站客戶端開發(fā)的解決方案。
參考文獻(xiàn):
[1] 2013-2014年中國移動(dòng)互聯(lián)網(wǎng)調(diào)查研究報(bào)告[EB/OL].[2014-08-26].[2014-08-29]. http://www.cnnic.net.cn/hlwfzyj/hlwxzbg/ydhlwbg/201408/t20140826_47880.htm.
[2] 樊慧琴.大學(xué)生手機(jī)市場份額:移動(dòng)約占七成[EB/OL]. [2014-04-03].[2014-08-29]. http://news.youth.cn/gn/201404/t20140403_4969997.htm.
[3] 高永朋.網(wǎng)站開放平臺(tái)的研究與實(shí)現(xiàn)[D].遼寧:東北大學(xué),2013.
[4] 王曉琳.基于HttpClient的代購?fù)郊夹g(shù)研究與實(shí)現(xiàn)[J].微型電腦應(yīng)用,2014,30(7):46-48.
[5] 姜晗.基于Cookie和Session的身份認(rèn)證機(jī)制的研究與實(shí)現(xiàn)[J].中國教育技術(shù)裝備,2014,28(4):36-37.
[6] Jonathan Hedley.jsoup : Java HTML Parser [EB/OL].[2014-08-29]http://jsoup.org/.
[7] 周鵬飛.基于MJPG_Streamer的移動(dòng)視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與研究[D].安徽:安徽理工大學(xué),2013.
[8] 劉平.Android手機(jī)訪問服務(wù)器的一種數(shù)據(jù)交互方法[J].電子設(shè)計(jì)工程.2010,8(9);96-102.
[9] 鮮海.淺談以C#模擬登錄新浪騰訊微博[J].計(jì)算機(jī)光盤軟件與應(yīng)用.2013,16(20):57-61.