王致远 周威 陈义明
摘要:虚拟判题系统(virtual judge,VJ)是一种功能强大的ACM在线判题系统,它不仅能动态获取著名ACM在线判题系统中的题目、调用该判题系统的判题引擎并获得结果,而且还能在本地存储相关的信息,为培养ACM选手作出了重要贡献。针对目前的VJ使用SSH框架组合进行开发,面临struts 2安全漏洞和hibernate笨重的问题,使用模型、视图和控制分离的MVC模式,结合网络爬虫技术,开发了一个基于SSM框架组合的虚拟在线判题系统。该系统已在湖南农业大学的ACM选手训练中发挥巨大的作用。
关键词:虚拟判题系统;SSM框架;网络爬虫
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2018)09-0095-03
1 背景
参加过ACM竞赛的同学都知道,想要稳扎稳打的提升能力,进行一次涉及全方位题型的竞赛是必不可少的。现在许多学校都有自己的Online judge(在线判题系统),其拥有出题,判题,举行和参加竞赛的功能。为大家的学习提供了很大的帮助。但不同的Online judge有不同的题目。于是,就有这么一种情况,在一次竞赛中想用到不同Online judge的不同题目。这就变得麻烦了。放弃一些题目?觉得可惜;重新出题?要斟酌出全面,严谨的测试用例的话,不但麻烦,而且还要花上不少时间。基于这样一种需求下Virtual judge(虚拟判题系统)的概念诞生了。
Virtual judge与在线判题系统不同。Online judge是有自己的判题引擎的,但Virtual judge没有。那Virtual judge是如何实现判题功能的呢?事先在Online judge上注册一个账号。通过那个账号将代码提交给Online judge,然后利用网络爬虫获取判题结果并展现给用户。同样,Virtual judge的题目也是可以通过网络爬虫从各个Online judge的题库抓过来的。
当前网络上有着SSH框架的Virtual judge系统。虽然已经是十分完善的Virtual judge网站。但相对SSH而言,SSM框架更轻量级,效率更高,各层之间的耦合度更低。而且SSH框架还有一些缺点,例如:Hibernate虽然能够自动生成SQL语句,但却难以优化,而且使用的门槛较高。以及,Struts2的安全性有待提高,黑客能通过漏洞获得服务器的权限。于是,我们决定用SSM框架搭建Virtual judge。
2 相关技术
系统实现使用了SSM框架集合和网络爬虫技术。
2.1 SSM框架
SSM框架即Spring+SpringMVC+Mybatis,是目前非常流行的web项目框架。能大大提高开发效率,减少重复工作,减少开发难度。
1)Spring是一个基于ioc(控制反转)和AOP(面向切面)的框架。主要功能是把创建对象的工作交给Spring。由Spring创建对象并给对象的属性赋予相关值,实现对对象的管理。使开发过程更加简便。
2)SpringMVC是一个常用的MVC框架,应用于控制层。通过xml配置,注解来决定如何处理用户请求,分隔了各层功能,便于程序员的开发和优化。
3)Mybatis处理与数据库的交互。只需要提供SQL语句,建立连接,异常处理等其他重复的工作都交给Mybatis。使用灵活,便于SQL优化。
MVC框架是指视图(View),控制器(Controller),模型(Model)。视图用于与用户交互。收到的请求由控制器决定如何处理。而模型是用于记录用户上传数据或者所需要的业务模型。
MVC框架将web项目的界面,逻辑,数据分隔开来。降低了各个部件的耦合性,提高了项目的可读性,而且更方便项目工程的搭建。如图1。
2.2 网络爬虫技术
网络爬虫是一种按照特定规则能自动在网络上寻找并抓取所需求信息的程序或脚本,经常用于一些搜索引擎之类的网站。现如今是大数据时代,截至2016年为止,光中国就有364.7万余个网站。随着信息与网站的越来越多,网络爬虫在其中就能发挥更大的作用。
不过Virtual judge所需要的题目信息等都是从确定的Online judge上获取的,是基于目标网页的网络爬虫,所以在Virtual judge的搭建中只需要运用相对简单的方法就能获取我们所需要的相关信息。唯一麻烦的是有多个Online judge,所以要针对不同Online judge编写不同代码,工作量较大。
3 虚拟判题系统功能及实现
Virtual judge是基于满足用户更方便地在Online judge上做题,竞赛的需求而搭建出来的。首先需要能够从各个Online judge上获取题目信息,以及能将代码提交给对应Online judge并再获取提交状态。那么相关的爬虫代码是必不可少的。为了能有更好的用户体验,一些Online judge的功能也是很需要的。一个账号的登錄注册系统。通过个人账户能更好的记录,了解自己的做题情况。账号功能也是竞赛系统必备的一部分,因为要有不同的账号才能方便分辨不同的参赛者。还有一个与ACM竞赛相仿的竞赛系统,这是判题系统最重要的部分。它能很好地锻炼参赛学生,让学生对ACM更熟悉,对竞赛更有经验。
3.1 系统功能描述
1)账号管理
这个部分比较简单,是常见的用户信息的注册与登录。主要包括用户的登录(账号密码的判断),用户注册(输入格式的要求,以及对数据库新添数据),查看用户信息(显示相关信息,重点在于答题的情况)。该功能用于保存用户信息,主要是记录用户的题目提交状态(正确,超时,答案错误,内存超限,格式错误等)和举办的竞赛(主要是比赛信息)。不登录的用户是无法参加比赛和提交代码的。该功能主要是用来方便用户能更直观的查看自己的做题情况。其他相关功能:为了用户账号密码的安全,密码将用MD5加密。
2)竞赛功能
比賽主要有id,标题,描述,分类,密码,开始时间,结束时间,题目,管理员,还有参赛者的提交状态这几个重要属性。其中题目最少1道,最多26道,题目不同重复而且必须已经保存在题库中。比赛时间由创建者决定,能根据具体需要更好的设计比赛。比赛得分参考常见的ACM比赛。首先是比较答对题目数目,在题目数目一致的情况下,比较解题时间。并且每次提交代码但错误的话,加20分钟惩罚时间。通过该功能就很方便地实现了用不同oj的不同题目进行比赛,为组织比赛的老师提供了极大的方便。而且在比赛中加入实时排名功能,能够查看每个人的答题情况,对参赛的学生和辅导老师都提供了很大的帮助。这样就能针对学生水平, 随时加以调整。为ACM竞赛做好充实的准备。
3.2系统体系结构
Virtual judge虚拟判题系统是一种特别的判题系统。它与一般常见的Online judge功能相仿。拥有记录题目信息,判断代码对错,举行和参加竞赛等必要功能。其不同之处在于它本身不拥有判题功能。服务器只进行账号管理,题目信息保存,竞赛的举行与信息记录。判题的过程交给其他Online judge。其原理是通过用户请求的OJ名称和题号,将提交的代码通过URL请求发给Online judge,然后利用爬虫技术从Online judge响应的网页上获得判题的结果,获得的信息显示在Virtual judge的网页上,同时也记录在数据库里。同理,Virtual judge也可以用这种方法通过请求OJ名和题号在对应的Online judge上获取题目信息。利用简单的爬虫原理来解决判题功能,而服务器本身不进行判题,还能减少服务器的压力。如图2。
3.3 爬虫实现
首先,用一个json文件记录在各个oj创建的账号,用这个账号登录,提交代码。然后,为了更方便的处理代码,我们给每个爬虫方法写个父类,父类拥有一些基本的属性方法,再在各个oj具体的爬虫实现时重写方法。需要的父类有:oj账号登录,题目爬取,题目更新,问题更新爬虫,查找oj支持的编译语言,获取所提交问题状态等。因为不同oj会有不同的html页面,不同的url。对每个oj都需要区别对待。我们为每个oj写多个java类来实现爬虫功能,如:该oj信息(页面编码,url等),支持的编译语言,登录对应oj账号操作 ,题目代码提交,页面信息爬取。其中获取信息的方法是获得请求所响应的html页面。从中用Pattern和Matcher(正则表达式)匹配一些特点来找到需要的信息(如:获取hdu上题目的标题,可以通过颜色color:#1A5CC8 来查找。)爬虫代码的请求通过多线程的方式运行(Callable、Future),为了防止服务器压力过大,要设置最多运行线程数量。这个部分最麻烦的是要对每个oj都要写一份相应的代码。工作量大,而且页面更新的话,还要重新编写代码。
其他需实现的相关功能:可以在Virtual judge的题目页面通过输入oj名和题号直接发送url请求来获取题目。还有需要能向Online judge不断发送请求来更新题目信息和提交状态。
3.4 数据库设计
数据库中至少要建立7个表。分别是用户表,登录信息表,题目表,题目描述表,提交状态表,竞赛表,竞赛题目表。这些表用来记录必要的信息,并能对一些相应的信息不断地进行更新。
1) 用户表:记录用户信息,账号密码的表,为了用户安全,密码是用MD5加密。属性有账号id,用户名,密码,别称以及qq号,邮箱等其他信息。
2) 登录信息表:记录用户账号登录情况的表,属性有:用户的登录时间,访问网页时间,和离开网页时间,还有登录的ip地址以及登录的成功与否。
3) 题目表:记录题目的基本信息,属性有:题目id,标题,时间限制,内存限制,来源oj,原始题号,在原始oj上的url。
4) 题目描述表:用于记录题目的相关信息,属性有:对应题目id,题目描述,输入要求,输出要求,样例输入,样例输出等。这部分题目属性有可能会随时间而变化。所以还要有个最后更新时间。
5) 提交状态表:用于记录用户对题目提交的结果。属性有:题目id,原始题号,原始oj,提交用户,提交结果,提交时间,更新时间等。
6) 竞赛表:用于记录所创建的竞赛的相关信息,属性有:竞赛id,标题,竞赛描述,开始时间,结束时间,竞赛创建者等。
7)竞赛题目表:一个简单的用于记录在竞赛中使用到的题目的表。属性有:题目id,竞赛id,题号(竞赛内),标题等。
3.5 系统实现
Virtual judge的jsp页面主要有:
1) 主页:说明该Virtual judge的功能,并写明用到了那些oj,让使用者一目了然。
2)题目页面:显示题目列表,注明来源oj,题号,标题,更新时间。可以进行搜索,会从服务器中查找匹配的题目。要是对oj与题号都进行了要求,如果题库中没有,会自动去试图去对应oj获取对应题目。
3)提交状态页面:该页面显示所有的提交状态。显示提交用户,oj,题号,提交状态和提交语言。同样可以进行检索。
4)竞赛页面:显示所有竞赛,比赛编码,比赛标题,比赛开始时间,持续时间,比赛创建者。在比赛结束前点击对应比赛名能参加比赛。在竞赛页面内还有题目子页面,提交子页面和排名子页面。这些页面能观看该比赛的所有题目和提交状态,还能查看对参赛者的答题情况进行排名。该页面在Virtual judge中十分重要,我们可以写一些简单的小功能来方便用户的使用。比如,在某次竞赛的主页面,我们可以在每道题目后面加上标记来告诉登录用户每道题的做题情况。或者是在显眼的地方加上剩余时间,让用户有更好的体验。
4 结束语
现如今各个高校都在搭建自己的Online judge,而Online judge的普及体现了ACM的算法知识在现如今的学习中更加重要。而Virtual judge的出现是必然的。虽然它脱离不了Online judge,但他在众多Online judge的帮助下使得学生的学习以及老师的教学准备变得便利。本文描述搭建一个SSM框架的Virtual judge的设计思想与具体实现。Virtual judge的出现能让用户更加便捷地进行竞赛,也能更加全面的查看自己的做题过程。由浅入深的练习系统, 竞赛辅导教师可以自己举行比赛,对ACM的学习有很大帮助。
参考文献:
[1] 张锦煌. 基于SSM整合框架开发的项目管理系统[J]. 电脑知识, 2015, 11(11): 103-105.
[2] 肖祥林. 基于 SSM 的毕业设计管理系统设计与实现[J]. 电子科技, 2016, 29(10): 115-117.
[3] 杜长燕. 基于WEB的网络爬虫的设计[J]. 无线互网科技, 2015(5): 49-50.
[4] 王腾. Online Judge系统的设计开发[J]. 计算机应用与软件, 2006, 23(12): 135-137.
[5] 吴舜歆. Online Judge在C++程序设计课程实践教学中的应用[J]. 高教学刊, 2016(9): 164-167.
[6] 顾春琴. 基于Online Judge的C语言实践教学平台研究[J]. 现代计算机:专业版, 2015(18): 76-80.
[7] 王锡良. 利用网络爬虫技术获取天气预报[J]. 电脑编程技巧与维护, 2015(19): 18-19.