王致遠(yuǎn) 周威 陳義明
摘要:虛擬判題系統(tǒng)(virtual judge,VJ)是一種功能強大的ACM在線判題系統(tǒng),它不僅能動態(tài)獲取著名ACM在線判題系統(tǒng)中的題目、調(diào)用該判題系統(tǒng)的判題引擎并獲得結(jié)果,而且還能在本地存儲相關(guān)的信息,為培養(yǎng)ACM選手作出了重要貢獻(xiàn)。針對目前的VJ使用SSH框架組合進(jìn)行開發(fā),面臨struts 2安全漏洞和hibernate笨重的問題,使用模型、視圖和控制分離的MVC模式,結(jié)合網(wǎng)絡(luò)爬蟲技術(shù),開發(fā)了一個基于SSM框架組合的虛擬在線判題系統(tǒng)。該系統(tǒng)已在湖南農(nóng)業(yè)大學(xué)的ACM選手訓(xùn)練中發(fā)揮巨大的作用。
關(guān)鍵詞:虛擬判題系統(tǒng);SSM框架;網(wǎng)絡(luò)爬蟲
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)09-0095-03
1 背景
參加過ACM競賽的同學(xué)都知道,想要穩(wěn)扎穩(wěn)打的提升能力,進(jìn)行一次涉及全方位題型的競賽是必不可少的?,F(xiàn)在許多學(xué)校都有自己的Online judge(在線判題系統(tǒng)),其擁有出題,判題,舉行和參加競賽的功能。為大家的學(xué)習(xí)提供了很大的幫助。但不同的Online judge有不同的題目。于是,就有這么一種情況,在一次競賽中想用到不同Online judge的不同題目。這就變得麻煩了。放棄一些題目?覺得可惜;重新出題?要斟酌出全面,嚴(yán)謹(jǐn)?shù)臏y試用例的話,不但麻煩,而且還要花上不少時間?;谶@樣一種需求下Virtual judge(虛擬判題系統(tǒng))的概念誕生了。
Virtual judge與在線判題系統(tǒng)不同。Online judge是有自己的判題引擎的,但Virtual judge沒有。那Virtual judge是如何實現(xiàn)判題功能的呢?事先在Online judge上注冊一個賬號。通過那個賬號將代碼提交給Online judge,然后利用網(wǎng)絡(luò)爬蟲獲取判題結(jié)果并展現(xiàn)給用戶。同樣,Virtual judge的題目也是可以通過網(wǎng)絡(luò)爬蟲從各個Online judge的題庫抓過來的。
當(dāng)前網(wǎng)絡(luò)上有著SSH框架的Virtual judge系統(tǒng)。雖然已經(jīng)是十分完善的Virtual judge網(wǎng)站。但相對SSH而言,SSM框架更輕量級,效率更高,各層之間的耦合度更低。而且SSH框架還有一些缺點,例如:Hibernate雖然能夠自動生成SQL語句,但卻難以優(yōu)化,而且使用的門檻較高。以及,Struts2的安全性有待提高,黑客能通過漏洞獲得服務(wù)器的權(quán)限。于是,我們決定用SSM框架搭建Virtual judge。
2 相關(guān)技術(shù)
系統(tǒng)實現(xiàn)使用了SSM框架集合和網(wǎng)絡(luò)爬蟲技術(shù)。
2.1 SSM框架
SSM框架即Spring+SpringMVC+Mybatis,是目前非常流行的web項目框架。能大大提高開發(fā)效率,減少重復(fù)工作,減少開發(fā)難度。
1)Spring是一個基于ioc(控制反轉(zhuǎn))和AOP(面向切面)的框架。主要功能是把創(chuàng)建對象的工作交給Spring。由Spring創(chuàng)建對象并給對象的屬性賦予相關(guān)值,實現(xiàn)對對象的管理。使開發(fā)過程更加簡便。
2)SpringMVC是一個常用的MVC框架,應(yīng)用于控制層。通過xml配置,注解來決定如何處理用戶請求,分隔了各層功能,便于程序員的開發(fā)和優(yōu)化。
3)Mybatis處理與數(shù)據(jù)庫的交互。只需要提供SQL語句,建立連接,異常處理等其他重復(fù)的工作都交給Mybatis。使用靈活,便于SQL優(yōu)化。
MVC框架是指視圖(View),控制器(Controller),模型(Model)。視圖用于與用戶交互。收到的請求由控制器決定如何處理。而模型是用于記錄用戶上傳數(shù)據(jù)或者所需要的業(yè)務(wù)模型。
MVC框架將web項目的界面,邏輯,數(shù)據(jù)分隔開來。降低了各個部件的耦合性,提高了項目的可讀性,而且更方便項目工程的搭建。如圖1。
2.2 網(wǎng)絡(luò)爬蟲技術(shù)
網(wǎng)絡(luò)爬蟲是一種按照特定規(guī)則能自動在網(wǎng)絡(luò)上尋找并抓取所需求信息的程序或腳本,經(jīng)常用于一些搜索引擎之類的網(wǎng)站?,F(xiàn)如今是大數(shù)據(jù)時代,截至2016年為止,光中國就有364.7萬余個網(wǎng)站。隨著信息與網(wǎng)站的越來越多,網(wǎng)絡(luò)爬蟲在其中就能發(fā)揮更大的作用。
不過Virtual judge所需要的題目信息等都是從確定的Online judge上獲取的,是基于目標(biāo)網(wǎng)頁的網(wǎng)絡(luò)爬蟲,所以在Virtual judge的搭建中只需要運用相對簡單的方法就能獲取我們所需要的相關(guān)信息。唯一麻煩的是有多個Online judge,所以要針對不同Online judge編寫不同代碼,工作量較大。
3 虛擬判題系統(tǒng)功能及實現(xiàn)
Virtual judge是基于滿足用戶更方便地在Online judge上做題,競賽的需求而搭建出來的。首先需要能夠從各個Online judge上獲取題目信息,以及能將代碼提交給對應(yīng)Online judge并再獲取提交狀態(tài)。那么相關(guān)的爬蟲代碼是必不可少的。為了能有更好的用戶體驗,一些Online judge的功能也是很需要的。一個賬號的登錄注冊系統(tǒng)。通過個人賬戶能更好的記錄,了解自己的做題情況。賬號功能也是競賽系統(tǒng)必備的一部分,因為要有不同的賬號才能方便分辨不同的參賽者。還有一個與ACM競賽相仿的競賽系統(tǒng),這是判題系統(tǒng)最重要的部分。它能很好地鍛煉參賽學(xué)生,讓學(xué)生對ACM更熟悉,對競賽更有經(jīng)驗。
3.1 系統(tǒng)功能描述
1)賬號管理
這個部分比較簡單,是常見的用戶信息的注冊與登錄。主要包括用戶的登錄(賬號密碼的判斷),用戶注冊(輸入格式的要求,以及對數(shù)據(jù)庫新添數(shù)據(jù)),查看用戶信息(顯示相關(guān)信息,重點在于答題的情況)。該功能用于保存用戶信息,主要是記錄用戶的題目提交狀態(tài)(正確,超時,答案錯誤,內(nèi)存超限,格式錯誤等)和舉辦的競賽(主要是比賽信息)。不登錄的用戶是無法參加比賽和提交代碼的。該功能主要是用來方便用戶能更直觀的查看自己的做題情況。其他相關(guān)功能:為了用戶賬號密碼的安全,密碼將用MD5加密。
2)競賽功能
比賽主要有id,標(biāo)題,描述,分類,密碼,開始時間,結(jié)束時間,題目,管理員,還有參賽者的提交狀態(tài)這幾個重要屬性。其中題目最少1道,最多26道,題目不同重復(fù)而且必須已經(jīng)保存在題庫中。比賽時間由創(chuàng)建者決定,能根據(jù)具體需要更好的設(shè)計比賽。比賽得分參考常見的ACM比賽。首先是比較答對題目數(shù)目,在題目數(shù)目一致的情況下,比較解題時間。并且每次提交代碼但錯誤的話,加20分鐘懲罰時間。通過該功能就很方便地實現(xiàn)了用不同oj的不同題目進(jìn)行比賽,為組織比賽的老師提供了極大的方便。而且在比賽中加入實時排名功能,能夠查看每個人的答題情況,對參賽的學(xué)生和輔導(dǎo)老師都提供了很大的幫助。這樣就能針對學(xué)生水平, 隨時加以調(diào)整。為ACM競賽做好充實的準(zhǔn)備。
3.2系統(tǒng)體系結(jié)構(gòu)
Virtual judge虛擬判題系統(tǒng)是一種特別的判題系統(tǒng)。它與一般常見的Online judge功能相仿。擁有記錄題目信息,判斷代碼對錯,舉行和參加競賽等必要功能。其不同之處在于它本身不擁有判題功能。服務(wù)器只進(jìn)行賬號管理,題目信息保存,競賽的舉行與信息記錄。判題的過程交給其他Online judge。其原理是通過用戶請求的OJ名稱和題號,將提交的代碼通過URL請求發(fā)給Online judge,然后利用爬蟲技術(shù)從Online judge響應(yīng)的網(wǎng)頁上獲得判題的結(jié)果,獲得的信息顯示在Virtual judge的網(wǎng)頁上,同時也記錄在數(shù)據(jù)庫里。同理,Virtual judge也可以用這種方法通過請求OJ名和題號在對應(yīng)的Online judge上獲取題目信息。利用簡單的爬蟲原理來解決判題功能,而服務(wù)器本身不進(jìn)行判題,還能減少服務(wù)器的壓力。如圖2。
3.3 爬蟲實現(xiàn)
首先,用一個json文件記錄在各個oj創(chuàng)建的賬號,用這個賬號登錄,提交代碼。然后,為了更方便的處理代碼,我們給每個爬蟲方法寫個父類,父類擁有一些基本的屬性方法,再在各個oj具體的爬蟲實現(xiàn)時重寫方法。需要的父類有:oj賬號登錄,題目爬取,題目更新,問題更新爬蟲,查找oj支持的編譯語言,獲取所提交問題狀態(tài)等。因為不同oj會有不同的html頁面,不同的url。對每個oj都需要區(qū)別對待。我們?yōu)槊總€oj寫多個java類來實現(xiàn)爬蟲功能,如:該oj信息(頁面編碼,url等),支持的編譯語言,登錄對應(yīng)oj賬號操作 ,題目代碼提交,頁面信息爬取。其中獲取信息的方法是獲得請求所響應(yīng)的html頁面。從中用Pattern和Matcher(正則表達(dá)式)匹配一些特點來找到需要的信息(如:獲取hdu上題目的標(biāo)題,可以通過顏色color:#1A5CC8 來查找。)爬蟲代碼的請求通過多線程的方式運行(Callable、Future),為了防止服務(wù)器壓力過大,要設(shè)置最多運行線程數(shù)量。這個部分最麻煩的是要對每個oj都要寫一份相應(yīng)的代碼。工作量大,而且頁面更新的話,還要重新編寫代碼。
其他需實現(xiàn)的相關(guān)功能:可以在Virtual judge的題目頁面通過輸入oj名和題號直接發(fā)送url請求來獲取題目。還有需要能向Online judge不斷發(fā)送請求來更新題目信息和提交狀態(tài)。
3.4 數(shù)據(jù)庫設(shè)計
數(shù)據(jù)庫中至少要建立7個表。分別是用戶表,登錄信息表,題目表,題目描述表,提交狀態(tài)表,競賽表,競賽題目表。這些表用來記錄必要的信息,并能對一些相應(yīng)的信息不斷地進(jìn)行更新。
1) 用戶表:記錄用戶信息,賬號密碼的表,為了用戶安全,密碼是用MD5加密。屬性有賬號id,用戶名,密碼,別稱以及qq號,郵箱等其他信息。
2) 登錄信息表:記錄用戶賬號登錄情況的表,屬性有:用戶的登錄時間,訪問網(wǎng)頁時間,和離開網(wǎng)頁時間,還有登錄的ip地址以及登錄的成功與否。
3) 題目表:記錄題目的基本信息,屬性有:題目id,標(biāo)題,時間限制,內(nèi)存限制,來源oj,原始題號,在原始o(jì)j上的url。
4) 題目描述表:用于記錄題目的相關(guān)信息,屬性有:對應(yīng)題目id,題目描述,輸入要求,輸出要求,樣例輸入,樣例輸出等。這部分題目屬性有可能會隨時間而變化。所以還要有個最后更新時間。
5) 提交狀態(tài)表:用于記錄用戶對題目提交的結(jié)果。屬性有:題目id,原始題號,原始o(jì)j,提交用戶,提交結(jié)果,提交時間,更新時間等。
6) 競賽表:用于記錄所創(chuàng)建的競賽的相關(guān)信息,屬性有:競賽id,標(biāo)題,競賽描述,開始時間,結(jié)束時間,競賽創(chuàng)建者等。
7)競賽題目表:一個簡單的用于記錄在競賽中使用到的題目的表。屬性有:題目id,競賽id,題號(競賽內(nèi)),標(biāo)題等。
3.5 系統(tǒng)實現(xiàn)
Virtual judge的jsp頁面主要有:
1) 主頁:說明該Virtual judge的功能,并寫明用到了那些oj,讓使用者一目了然。
2)題目頁面:顯示題目列表,注明來源oj,題號,標(biāo)題,更新時間??梢赃M(jìn)行搜索,會從服務(wù)器中查找匹配的題目。要是對oj與題號都進(jìn)行了要求,如果題庫中沒有,會自動去試圖去對應(yīng)oj獲取對應(yīng)題目。
3)提交狀態(tài)頁面:該頁面顯示所有的提交狀態(tài)。顯示提交用戶,oj,題號,提交狀態(tài)和提交語言。同樣可以進(jìn)行檢索。
4)競賽頁面:顯示所有競賽,比賽編碼,比賽標(biāo)題,比賽開始時間,持續(xù)時間,比賽創(chuàng)建者。在比賽結(jié)束前點擊對應(yīng)比賽名能參加比賽。在競賽頁面內(nèi)還有題目子頁面,提交子頁面和排名子頁面。這些頁面能觀看該比賽的所有題目和提交狀態(tài),還能查看對參賽者的答題情況進(jìn)行排名。該頁面在Virtual judge中十分重要,我們可以寫一些簡單的小功能來方便用戶的使用。比如,在某次競賽的主頁面,我們可以在每道題目后面加上標(biāo)記來告訴登錄用戶每道題的做題情況?;蛘呤窃陲@眼的地方加上剩余時間,讓用戶有更好的體驗。
4 結(jié)束語
現(xiàn)如今各個高校都在搭建自己的Online judge,而Online judge的普及體現(xiàn)了ACM的算法知識在現(xiàn)如今的學(xué)習(xí)中更加重要。而Virtual judge的出現(xiàn)是必然的。雖然它脫離不了Online judge,但他在眾多Online judge的幫助下使得學(xué)生的學(xué)習(xí)以及老師的教學(xué)準(zhǔn)備變得便利。本文描述搭建一個SSM框架的Virtual judge的設(shè)計思想與具體實現(xiàn)。Virtual judge的出現(xiàn)能讓用戶更加便捷地進(jìn)行競賽,也能更加全面的查看自己的做題過程。由淺入深的練習(xí)系統(tǒng), 競賽輔導(dǎo)教師可以自己舉行比賽,對ACM的學(xué)習(xí)有很大幫助。
參考文獻(xiàn):
[1] 張錦煌. 基于SSM整合框架開發(fā)的項目管理系統(tǒng)[J]. 電腦知識, 2015, 11(11): 103-105.
[2] 肖祥林. 基于 SSM 的畢業(yè)設(shè)計管理系統(tǒng)設(shè)計與實現(xiàn)[J]. 電子科技, 2016, 29(10): 115-117.
[3] 杜長燕. 基于WEB的網(wǎng)絡(luò)爬蟲的設(shè)計[J]. 無線互網(wǎng)科技, 2015(5): 49-50.
[4] 王騰. Online Judge系統(tǒng)的設(shè)計開發(fā)[J]. 計算機應(yīng)用與軟件, 2006, 23(12): 135-137.
[5] 吳舜歆. Online Judge在C++程序設(shè)計課程實踐教學(xué)中的應(yīng)用[J]. 高教學(xué)刊, 2016(9): 164-167.
[6] 顧春琴. 基于Online Judge的C語言實踐教學(xué)平臺研究[J]. 現(xiàn)代計算機:專業(yè)版, 2015(18): 76-80.
[7] 王錫良. 利用網(wǎng)絡(luò)爬蟲技術(shù)獲取天氣預(yù)報[J]. 電腦編程技巧與維護(hù), 2015(19): 18-19.