◆李智文 杨永红
基于SHH框架的多用户在线评判系统的设计与实现
◆李智文 杨永红
(佳木斯大学信息电子技术学院 黑龙江 154007)
为了培养计算机专业学生在程序设计的创新开发一实以及实践动手能力,我们基于SSH框架设计了一个多用户在线评判系统,致力于帮助专业学生培养相关的专业素养。该系统以SSH框架和B/S架构以及利用多线程编程技术设计了一个高效、精确、稳定的多用户在线评判系统。
SSH框架;B/S架构;多用户在线评判系统
为了培养计算机专业学生在程序设计的创新开发意识以及实践动手等候能力,设计一个高效方便的基于B/S架构的多用户在线评判系统是十分有益的,基于相关的需求我们使用SSH框架设计了一个具有高效性和精确性的多用户在线评判系统。用户可以自主系进行代码提交通过系统的自动编译后进行裁判并将结果并反馈给用户。通过OJ可以自由组织比赛并能够按照比赛规则进行自动排名。系统基于J2EE的多层结构,通过SSH(Struts+Spring+Hibernate)组合框架进行设计搭建。利用多线程编程技术设计一个高效以及精确、稳定的多用户在线评判系统[1]。
该系统是一个基于B/S架构进行设计的多用户系统,可以为用户提供基于Web的实时在线程序设计实验的平台[2]。该系统主要包括五个模块:用户管理模块、试题模块、裁判模块、比赛模块和信息交流模块。各个模块之下各有其不同功能子属模块,如图1所示。
在线评判系统工作流程为:用户登录评判系统经过身份认证进入网站,可以进行在线浏览试题库题目,并且在本地客户端机器进行代码编辑以及编译运行和调试,之后提交代码至判题系统,系统进行编译运行检测数据样例,使用输入输出数据流进行重定向将用户代码所得结果与标准答案进行比对,将错误数据反馈至网站用户交互界面,并将本次代码保存,同时记录进入数据库。
该系统是一个多用户在线编程以及可以组织竞赛的Web应用,需要数据库进行对用户、题目以及比赛信息的存储,因此要合理进行数据库设计。裁判模块是系统中的核心,用户提交的程序由裁判模块进行编译,并且裁判模块还需要完成重定向输入输出流,测试样例的输入以及结果的比对等工作。关于安全性,需要考虑代码在服务器中运行时用户的代码是否属于恶意代码程序,例如程序执行关机程序以及删除系统文件等,因此需要着重加强相关应对的有效措施来保证系统的安全稳定。
图1 系统功能结构图
由于传统的J2EE的JSP+Servlet+JavaBean结构耦合性太高,所以本系统使用的是J2EE中的高级技术框架技术SSH(Struts+Spring+Hibernate)。SSH框架很好降低了各层结构代码之间的耦合性,使代码变得更加易于维护,同时使得代码的可读性和可维护性提升。我们使用Struts MVC框架作为前端,Spring框架作为业务流转,数据库的ORM映射功能由Hibernate提供。拥有统一开发平台是SSH框架的一大优点,通过统一的开发平台可以大大减少应用层相关的开发费用,并且也可以降低应用程序开发的复杂性。通过SSH集成应用技术,可以极大提升应用部署和目录添加的效率[3]。
Struts作为经典的表示层MVC框架,其优秀的设计模式在大量实践使用中已经充分地被证明,表示层功能由Struts与JSP和Html配合实现[4]。Spring框架的一大优点是它是一个轻量级的容器框架,由于其控制反转和面向切面的灵活特性,可以极大节省开发成本和缩短时间周期[5]。Hibernate是一种轻量级的持久化技术,拥有强大的缓存机制,针对JDBC封装性良好,还能自动生成POJO实体与数据访问类DAO。
系统采用B/S模式的三层架构,表示层、业务逻辑层、数据层。表示层,即前端网页用于与用户进行交互,例如用户可在登录界面进行登录,可以浏览题库题目,提交代码等。业务逻辑层,用于处于处理业务逻辑,例如获取将登录界面用户提交的身份信息,并通过持久层获取信息记录,进行身份验证等功能。数据层,用于存储题库的信息以及用户数据等[6]。
我们通过Struts中的Action来提供系统表示层的实现,通过ActionForm作为表单模型对用户提交的数据进行接收,使用ActionServlet作为控制器来实现对Service层各种业务,视图的转发是由Action Forward控制,用户的页面调用和转发还需要通过ActionMapping配合合作完成[7]。数据库我们使用开源的MySQL,同时MySQL与Apache这款Web服务器软件有着很好的配合,可以极大提升开发效率[8]。
数据库的设计是十分重要的,这直接决定了系统对数据的访问效率。合理正确的设计数据库可以有效地提升系统的性能。系统有五个模块:用户管理模块、试题模块、裁判模块、比赛模块和信息交流模块,数据库中的核心是用户表、试题表、比赛信息表、提交记录表。设计定义四个了实体,表与表之间属于多对多的关系,同样对于数据库的查询大部分属于联合查询。
裁判模块是整个系统的核心。当系统监听到用户提交解题程序后,系统启动子程序编译用户提交的代码。开始将题目对应的输入数据文件通过重定向进行逐个输入,同时每得到一个结果就与标准答案文件里对应的答案进行比对,若答案完全一致则继续输入数据直至结束,否则直接结束数据输入,并将错误信息与错误答案返回。在程序开始运行时刻就开始计时在合法的时间范围之内如果可以得到正确答案,并且内存消耗也在合法限制范围之内,那么表示程序通过,给出用户反馈Accept提示,否则就需要终止程序并反馈给用户相应错误的提示。
当系统监听到多为用户提交程序时,我们相应的为每个用户开启一个子程序,并按照图2流程进行判题。我们使用JAVA的多线程编程技术实现多用户在线评判系统。裁判模块流程图如图2。
图2 裁判程序流程图
为统计系统资源的使用情况我们定义一个类用于检测:
class ResourceUtilization{
long userstarttime;//用户执行程序的时间
long userendtime
long systemstarttime;//系统执行程序开始时间
long systemendtime;
long noiopage; //不需要I/O操作的页面缺失数
long iopage; //需要I/O操作的页面缺失数
}
Userstarttime和userendtime变量是用户程序提交后开始执行程序开始的时间和结束时间,systemstarttime和systemendstarttime是系统执行程序开始和结束的时间。noiopage和iopage指程序不需要 I/O操作和需要I/O操作时页面的缺失数,页面缺失发生在内核需要获得一个内存页面用于进程访问。借助这个类可以统计各个程序占用系统资源的情况。
执行程序消耗时间统计:
Alltime=(ResourceUtilization.userendtime-ResourceUtilization.Userstarttime)+(ResourceUtilization.systemendtime-ResourceUtilization. Systemstarttime)
程序占用内存开销统计:
memoryusage=sysusage.noiopage*4
对于安全性处理,用户提交的程序在服务器上进行测试运行,如果代码里有一些非法恶意代码将会对系统进行造成损害,所以我们需要对代码进行检查将恶意代码进行屏蔽。所以我们通过对子进程管理来控制子进程的优先级,对子进程对系统资源的访问权限进行限制。同样为了系统安全我们还需要对用户权限进行限制。
本文介绍了基于SSH框架设计搭建的多用户在线评判系统。我们通过对系统功能上的需求进行分析指定了相关的设计方案,介绍了系统的设计思路以及搭建系统所用到的技术环境,同时也对系统内核的运行情况以及工作流程进行了简单介绍。对于安全性的保障也描述了实现思路。相信通过该系统可以对学生独立思考问题以及解决问题的能力的提升将会有很大的帮助。该系统仍有一些需要处理的问题,例如大量用户使用所产生的高并发问题以及数据量的增长致使性能下降的问题,前端交互页面的友好性以及系统后续扩展性等,这些问题仍需要后续去进行解决。
[1]乔少杰,杨燕,葛永明,等.基于B/S架构的多用户在线程序评判系统设计与实现[J].计算机工程与科学,2011.
[2]吴晓珊,曹旭东,王森,等.基于B/S架构的管理系统软件开发[J].计算机测量与控制,2019,27(02):123-128.
[3]刘楠,孙国道,田贤忠.ACM在线评判系统设计与实现[J].计算机时代,2010(02):34-35+38.
[4]余腊生,任炬.基于SSH三层架构的OJ系统研究与设计[J].电脑知识与技术,2008(26):1698-1701.
[5]陈鹏. 在线评判系统的设计和实现[D].东南大学,2015.
[6]刘鑫标.基于B/S架构及Linux系统的ACM竞赛在线评判系统[J].福建电脑,2010,26(11):151-152+146.
[7]陈宇,杨成虎,庄英杰,等.基于Linux的ACM程序设计竞赛在线评判系统研究[J].民营科技,2008(02):26+88.
[8]蒋社想,戴书文.基于J2EE的ACM竞赛在线评判系统的设计[J].安徽理工大学学报(自然科学版),2009,29(04):59-63.