黃金春,杜娟嬌
(1.廣西中醫(yī)藥大學(xué)圖書館信息技術(shù)部,南寧 530021;2.廣西中醫(yī)藥大學(xué)第一附屬醫(yī)院教學(xué)部,南寧 530001)
隨著社會(huì)的高度發(fā)展,信息技術(shù)應(yīng)用到了社會(huì)生活的方方面面,也促使更多的學(xué)生投身到信息技術(shù)開發(fā)的工作中,而程序設(shè)計(jì)能力作為最重要的開發(fā)能力,也日益成為了各個(gè)專業(yè)學(xué)生的學(xué)習(xí)要求。提高程序設(shè)計(jì)的能力需要大量的編程實(shí)踐練習(xí),因此很多學(xué)校都開發(fā)了源代碼在線評(píng)測(cè)系統(tǒng)(Online Judge下稱OJ系統(tǒng))以用來提高學(xué)生的程序設(shè)計(jì)水平。但傳統(tǒng)的OJ系統(tǒng)都比較龐大,需要安裝Web服務(wù)器還需要安裝數(shù)據(jù)庫(kù)服務(wù)器,非常不方便在日常的教學(xué)中使用,本文提出一種不需要搭建Web服務(wù)器也不需要搭建數(shù)據(jù)庫(kù)服務(wù)器的超小型OJ系統(tǒng),并具體論述系統(tǒng)的實(shí)現(xiàn)。
超小型OJ系統(tǒng)雖然不需要Web服務(wù)器以及數(shù)據(jù)庫(kù)服務(wù)器,但是同樣實(shí)現(xiàn)Web服務(wù)和數(shù)據(jù)庫(kù)服務(wù)功能。系統(tǒng)Web功能基于Java的HTTP Server API開發(fā),這些API主要實(shí)現(xiàn)了HTTP協(xié)議,HTTP協(xié)議是最為流行的網(wǎng)絡(luò)協(xié)議由請(qǐng)求與應(yīng)答協(xié)議構(gòu)成,最主要使用是HttpServer類、HttpHandle接口。HttpServer類實(shí)例實(shí)現(xiàn)監(jiān)聽客戶端的請(qǐng)求,然后HttpServer會(huì)調(diào)用HttpHandler接口實(shí)現(xiàn)類的回調(diào)方法來處理客戶端請(qǐng)求。數(shù)據(jù)庫(kù)功能采用Sqlite3系統(tǒng)來實(shí)現(xiàn),該數(shù)據(jù)庫(kù)非常小巧,僅為一個(gè)文件,復(fù)制這個(gè)文件即可使用。
在OJ系統(tǒng)中主要存在兩種請(qǐng)求,分別為題目請(qǐng)求(顯示題目以及提供寫程序的表單)和程序提交請(qǐng)求(完成對(duì)提交的程序進(jìn)行編譯、運(yùn)行、檢測(cè)運(yùn)行結(jié)果等工作)。因?yàn)闊oWeb服務(wù)器,無法使用不同網(wǎng)頁來區(qū)分請(qǐng)求。但是可以巧妙地使用HttpServer類的create-Context方法虛擬出不同請(qǐng)求來區(qū)分,具體設(shè)計(jì)是該方法有個(gè)上下文參數(shù),構(gòu)造不同參數(shù)即可實(shí)現(xiàn)區(qū)分不同請(qǐng)求,然后再調(diào)用HttpHandler接口實(shí)現(xiàn)類來處理請(qǐng)求。具體代碼如下:
HttpServer httpserver=provider.createHttpServer(new InetSocketAddress(6666),100);//監(jiān)聽
httpserver.createContext("/",new MyHttpHandler());//跟 文 件夾,表示題目請(qǐng)求。
httpserver.createContext("/hjc2",new SHttpHandler());//hjc2
文件夾,表示程序提交請(qǐng)求
……
static class MyHttpHandler implements HttpHandler{//對(duì)第一種請(qǐng)求響應(yīng)
……}
static class SHttpHandler implements HttpHandler{//對(duì)第二種請(qǐng)求響應(yīng)
特別說明的是,代碼里提到hjc2文件夾,但其實(shí)并不存在這個(gè)文件夾,僅作為區(qū)分請(qǐng)求使用。
在OJ系統(tǒng)中,要實(shí)現(xiàn)的第一個(gè)請(qǐng)求即為題目顯示請(qǐng)求。其流程如圖1所示。
圖1 題目請(qǐng)求流程
從示意圖看出題目請(qǐng)求由兩個(gè)響應(yīng)內(nèi)容合成,一為顯示某個(gè)題目的內(nèi)容與要求,另一個(gè)為顯示提供學(xué)生做題的表單。題目?jī)?nèi)容從數(shù)據(jù)庫(kù)中讀取,用一字符串變量保存,此處涉及數(shù)據(jù)庫(kù)讀取等Java操作本文不論述,要指出的是為了保持系統(tǒng)小型化的特色,選用Sqlite3之類的小型數(shù)據(jù)庫(kù)。表單的顯示比較簡(jiǎn)單,因其為靜態(tài)內(nèi)容只要預(yù)先建立好htm文件用代碼讀取文件即可,要注意的是表單提交的action域必須是含有hjc2的路徑,以便表單提交后作為第二種請(qǐng)求處理。類似: