丁振凡
(華東交通大學(xué)信息工程學(xué)院,江西南昌330013)
近年來,出現(xiàn)了眾多的Web網(wǎng)絡(luò)考試系統(tǒng),監(jiān)測(cè)正在考試的用戶成為一個(gè)有趣的問題.由于Web瀏覽器采用無連接的HTTP協(xié)議,給監(jiān)測(cè)設(shè)計(jì)帶來一定困難.要實(shí)現(xiàn)在線用戶的監(jiān)視,需要客戶端和 Web服務(wù)端的配合.本文采用AJAX技術(shù)與Spring結(jié)合實(shí)現(xiàn)考試在線用戶監(jiān)測(cè).其基本工作原理如圖1所示.服務(wù)端為tomcat服務(wù)器,采用Spring編程處理技術(shù),Spring是一個(gè)高效的輕量級(jí)開發(fā)框架,通過Spring控制器實(shí)現(xiàn)HTTP請(qǐng)求和響應(yīng)處理.客戶端通過AJAX技術(shù)實(shí)現(xiàn)與用戶的事件交互,并可通過AJAX引擎的HTTP接口實(shí)現(xiàn)與服務(wù)器的交互.
圖1 應(yīng)用的基本工作原理
系統(tǒng)的實(shí)現(xiàn)邏輯如圖2所示.系統(tǒng)采用一個(gè)業(yè)務(wù)Bean來記錄在線考試用戶,Spring容器中構(gòu)建的Bean對(duì)象在應(yīng)用的整個(gè)生命周期保持有效.Spring控制器所提供的REST風(fēng)格的服務(wù)邏輯要調(diào)用業(yè)務(wù)邏輯Bean中的相應(yīng)方法.在Spring控制器代碼設(shè)計(jì)中可通過屬性依賴關(guān)系注入Bean.
通過集合類型的onlineUsers屬性存儲(chǔ)在線用戶,并提供該屬性的getter和setter方法,同時(shí),針對(duì)用戶進(jìn)入、用戶離開、考試監(jiān)測(cè)處理分別定義了相應(yīng)方法.代碼如下:
圖2 應(yīng)用具體實(shí)現(xiàn)邏輯
在Servlet的配置文件中,要通過配置實(shí)現(xiàn)Bean在容器中的注冊(cè).Bean的onlineUsers屬性初始設(shè)置為空集合,Bean的作用范圍采用默認(rèn)的singleton形式,從而保證多用戶訪問Bean時(shí)操作的是同一個(gè)對(duì)象實(shí)例.以下為Bean的配置代碼:
根據(jù)應(yīng)用特點(diǎn),本應(yīng)用在服務(wù)設(shè)計(jì)上沒有采用MVC模型中用視圖顯示信息的形式,而是采用給請(qǐng)求者返回消息的形式[1].服務(wù)方控制器共提供了3個(gè)Mapping方法.“/logexam”用于處理用戶進(jìn)入考試,“/leaveexam”用于處理用戶離開考試,“/showusers”用于查詢?cè)诰€用戶.前面兩個(gè)方法只需要在業(yè)務(wù)邏輯Bean中進(jìn)行登記處理,不需要返回任何消息給服務(wù)請(qǐng)求者.返回消息的形式方便AJAX對(duì)服務(wù)的調(diào)用.本文采用google的JSON工具包實(shí)現(xiàn)對(duì)消息的Json封裝[2].另外,系統(tǒng)采用Spring Security實(shí)現(xiàn)用戶登錄認(rèn)證與授權(quán)訪問處理[3].在控制器的Mapping方法中通過方法參數(shù)注入HttpServletRequest類型的request對(duì)象,利用其getRemoteUser()方法得到用戶標(biāo)識(shí).在控制器的方法中通過定義屬性monitor依賴引用容器中的monitorBean,這樣,在控制器的代碼中可方便通過monitor實(shí)例變量訪問業(yè)務(wù)邏輯 Bean中的方法.
值得一提的是,用HttpServletResponse對(duì)象發(fā)送響應(yīng)消息時(shí),要采用普通文本的方式發(fā)送,同時(shí)指明編碼方式為utf-8編碼,這樣客戶方可正確地解析字符串中的漢字字符.
客戶方通過Javascript的事件來監(jiān)測(cè)用戶進(jìn)入和離開考試頁(yè)面的行為.在頁(yè)面的body標(biāo)簽中通過onload和onunload屬性設(shè)置對(duì)應(yīng)的Javascript事件處理函數(shù).函數(shù)中通過發(fā)送AJAX請(qǐng)求給服務(wù)方的控制邏輯[4],從而完成用戶進(jìn)入和離開的登記處理.
實(shí)現(xiàn)頁(yè)面的定時(shí)刷新處理,有兩種基本思路.一種是利用HTML標(biāo)簽,讓頁(yè)面定時(shí)請(qǐng)求服務(wù)器,例如,以下META標(biāo)記將導(dǎo)致頁(yè)面每10秒刷新1次.
如果采用這種方式,服務(wù)器的控制器處理代碼也要做相應(yīng)更改,要采用視圖顯示結(jié)果.客戶方不用編任何腳本代碼.
本文采用由AJAX定時(shí)發(fā)送請(qǐng)求的方式實(shí)現(xiàn)頁(yè)面更新.以下程序中,init()方法實(shí)現(xiàn)相關(guān)處理.網(wǎng)頁(yè)加載時(shí),利用onload事件觸發(fā)執(zhí)行該方法.init方法首先發(fā)送請(qǐng)求給服務(wù)器,并獲取服務(wù)器的JSON響應(yīng)數(shù)據(jù);調(diào)用JavaScript的eval函數(shù)JSON文本轉(zhuǎn)化為對(duì)象形式;然后,利用DHTML技術(shù)將對(duì)象數(shù)據(jù)項(xiàng)的值寫入頁(yè)面元素中;最后,通過Javascript的set-Timeout函數(shù)控制方法每間隔2秒重復(fù)執(zhí)行.
本文介紹的考試監(jiān)測(cè)主要是跟蹤查看當(dāng)前在線解答試卷的用戶,及時(shí)掌握有哪些用戶缺考.通過用戶進(jìn)入考試時(shí)的考試頁(yè)面的裝載與卸載事件來跟蹤的行為,客戶無論通過“后退”、“瀏覽其他頁(yè)面”、“關(guān)閉瀏覽器”等離開考試頁(yè)面,均能被監(jiān)測(cè)到.該應(yīng)用的設(shè)計(jì)模式也適用于其他網(wǎng)頁(yè)中對(duì)在線訪問者的監(jiān)測(cè)處理.由于學(xué)生用戶標(biāo)識(shí)經(jīng)常以學(xué)號(hào)后兩位作為后綴,因此,實(shí)際應(yīng)用中還可將用戶標(biāo)識(shí)進(jìn)行排序顯示,在服務(wù)方和客戶方均可進(jìn)行排序處理,這樣可更清晰掌握有哪個(gè)學(xué)生缺考.
[1]丁振凡.基于AJAX結(jié)合Spring MVC的信息訪問服務(wù)模式研究[J].計(jì)算機(jī)時(shí)代,2012,(6):25 -29.
[2]丁振凡.Spring REST風(fēng)格Web服務(wù)的Json消息封裝及解析研究[J].智能計(jì)算機(jī)與應(yīng)用,2012,(2):9 -11.
[3]丁振凡.基于Spring Security的Web資源訪問控制[J].宜春學(xué)院學(xué)報(bào),2012,(8):71 -74.
[4]丁振凡.Web編程實(shí)踐教程[M].北京:清華大學(xué)出版社,2011.