黄金春,杜娟娇
(1.广西中医药大学图书馆信息技术部,南宁 530021;2.广西中医药大学第一附属医院教学部,南宁 530001)
随着社会的高度发展,信息技术应用到了社会生活的方方面面,也促使更多的学生投身到信息技术开发的工作中,而程序设计能力作为最重要的开发能力,也日益成为了各个专业学生的学习要求。提高程序设计的能力需要大量的编程实践练习,因此很多学校都开发了源代码在线评测系统(Online Judge下称OJ系统)以用来提高学生的程序设计水平。但传统的OJ系统都比较庞大,需要安装Web服务器还需要安装数据库服务器,非常不方便在日常的教学中使用,本文提出一种不需要搭建Web服务器也不需要搭建数据库服务器的超小型OJ系统,并具体论述系统的实现。
超小型OJ系统虽然不需要Web服务器以及数据库服务器,但是同样实现Web服务和数据库服务功能。系统Web功能基于Java的HTTP Server API开发,这些API主要实现了HTTP协议,HTTP协议是最为流行的网络协议由请求与应答协议构成,最主要使用是HttpServer类、HttpHandle接口。HttpServer类实例实现监听客户端的请求,然后HttpServer会调用HttpHandler接口实现类的回调方法来处理客户端请求。数据库功能采用Sqlite3系统来实现,该数据库非常小巧,仅为一个文件,复制这个文件即可使用。
在OJ系统中主要存在两种请求,分别为题目请求(显示题目以及提供写程序的表单)和程序提交请求(完成对提交的程序进行编译、运行、检测运行结果等工作)。因为无Web服务器,无法使用不同网页来区分请求。但是可以巧妙地使用HttpServer类的create-Context方法虚拟出不同请求来区分,具体设计是该方法有个上下文参数,构造不同参数即可实现区分不同请求,然后再调用HttpHandler接口实现类来处理请求。具体代码如下:
HttpServer httpserver=provider.createHttpServer(new InetSocketAddress(6666),100);//监听
httpserver.createContext("/",new MyHttpHandler());//跟 文 件夹,表示题目请求。
httpserver.createContext("/hjc2",new SHttpHandler());//hjc2
文件夹,表示程序提交请求
……
static class MyHttpHandler implements HttpHandler{//对第一种请求响应
……}
static class SHttpHandler implements HttpHandler{//对第二种请求响应
特别说明的是,代码里提到hjc2文件夹,但其实并不存在这个文件夹,仅作为区分请求使用。
在OJ系统中,要实现的第一个请求即为题目显示请求。其流程如图1所示。
图1 题目请求流程
从示意图看出题目请求由两个响应内容合成,一为显示某个题目的内容与要求,另一个为显示提供学生做题的表单。题目内容从数据库中读取,用一字符串变量保存,此处涉及数据库读取等Java操作本文不论述,要指出的是为了保持系统小型化的特色,选用Sqlite3之类的小型数据库。表单的显示比较简单,因其为静态内容只要预先建立好htm文件用代码读取文件即可,要注意的是表单提交的action域必须是含有hjc2的路径,以便表单提交后作为第二种请求处理。类似: