APP下载

基于JavaEE的学生成绩管理系统的设计与实现

2019-03-15黄帅韩春霞

电脑知识与技术 2019年2期

黄帅 韩春霞

摘要:该文采用JavaEE技术,使用servlet进行逻辑控制及运用MyBatis框架进行数据库访问,以铜仁学院大数据学院为例,开发设计了一个学生成绩管理系统,有助于教师和学生使用,适用于高校推广应用。该文主要介绍系统的具体设计与实现。

关键词:JavaEE;学生成绩管理; MyBatis

中图分类号:TP315      文献标识码:A      文章编号:1009-3044(2019)02-0053-03

1 系统概要设计

1.1总体架构

学生成绩管理系统采用B/S结构、模块化的开发方式进行开发。如图1,整个系统由三个模块组成,分别是公共模块、学生模块和管理模块。公共模块是整个系统的核心,在该模块中放置着实现好的功能与工具,模块中的service层是其它模块使用模块的入口,而管理模块和学生模块主要功能是为管理用户和学生用户提供一个使用平台。这样的设计模式可以提高开发效率,后续也十分便于维护和扩展系统。

1.2需求分析

随着计算机技术应用的普及,越来越多的高校使用学生成绩管理系统来完成学生成绩的管理工作。用以前的传统人工方式来进行学生成绩的管理,工作效率不仅低下,在工作过程中也很容易造成错误。用JavaEE技术实现的学生成绩管理系统,可以让管理者高效地对学生信息和成绩进行录入、修改、查询等,既大大简化了学生成绩的管理工作,同时也方便了学生们对自己成绩的查询。

1.3 模块基本功能

公共模块:也是核心模块,其中Service层实现了对DAO层的调用、图片的上传与加载等功能,其他模块只需调用Service层中的类就能使用该模块的功能。

管理模块:能够使用专有的管理员账号的登录访问,在管理页面中可以录入学生、课程的信息、修改学生、课程的信息,在成绩修改页修改学生成绩等功能呢。

学生模块:实现学生的登录,学生可以通过自己账号和密码进行登录查看自己的个人信息和查询个人成绩。

1.4运行环境与开发工具

IntelliJ IDEA,是由JetBrains公司推出的一款IDE(集成开发环境)。这款开发工具不管在代码编写、代码分析、GUI设计方面都是超常的,使用这款工具可以大大提高开发效率。

MyBatis,是一个基于Java的持久层框架,这款框架支持定制化SQL、存储过程、高级映射等,最主要的是这款框架可以将Java代码与SQL语句完全分离,有利于维护。

BootStrap,是由美国Twitter公司的设计师开发的一款基于Html、Css、JavaScript的前端框架,这款框架具有简洁、优雅、强悍等特性,使用BootStrap开发出的前端页面简约美观,而且使用起来非常容易上手。

MySQL,是最流行的关系型数据库之一,具有速度快、体积小、开源免费等特点,是开发中小型项目的最佳选择。2  系统的详细设计

2.1数据表的设计

数据库设计的好坏会影响整个开发过程和开发成果,本次设计主要包含以下几个数据表

1)学生表:用于存储、管理学生信息的数据表。

2)管理员表:存储管理员的账号和密码等信息,用于登录管理后台页面。

3)专业表:存储专业的信息,该表是分类学生、课程和成绩记录的标识。

4)課程表:存储课程对象的信息。

5)成绩记录表:用于存储学生的成绩、学生的学号和分数,成绩管理的工作基本上是在该数据表上完成的。

2.2 E-R图

E-R 图包含三个要素: 实体、属性和关系, 是用来描述某一单位、组织的概念模型,本系统设计的E-R图如图2所示。

3  系统的实现

3.1 DAO层的实现及MyBatis的实现

DAO层,也称数据访问层,在使用整个系统的过程中几乎都会经过DAO层,使用MyBatis实现DAO层十分方便,只需以下几步:

1)在pom.xml中添加MyBatis 以及数据库驱动的依赖,并编写MyBatis的工具类,用于加载MyBatis和SqlSeesion。

mysql

mysql-connector-java

8.0.12

org.mybatis

mybatis

3.4.6

2)在资源文件夹中添加MyBatis的配置文件和属性文件,并指明映射文件或者包的路径。在本次开发,作者使用的是MyBatis的注解方式操作数据库所以在配置文件中指明的是含映射关系接口类的包路径。

3)在指明的包路径下编写接口类中带注解的方法,整个DAO层准备工作基本完成。

例如

/**

* 得到所有该专业下的学生

* @param categoryId

* @return

*/

@Select("select * from student where categoryId = #{categoryId}")

List getStudentsByCategory(@Param("categoryId") Long categoryId);

(1) 在service层中使用代码如下:

/**

* 得到该专业下的所有学生

*

* @param categoryId

* @return

*/

public List getStudentsByCategory(Long categoryId) {

SqlSession sqlSession = MyBatisUtil.getSession();  //得到sqlSession

try {

StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);

return studentMapper.getStudentsByCategory(categoryId);

} finally {

sqlSession.close(); //关闭sqlSession

}

}

3.2 用户界面设计与实现

用户界面是用户与系统交互的载体,好的用户界面既能给用户留下深刻的印象,又能给用户带来更好的使用体验。所以,用户界面的开发也是整个项目中极其重要的一部分。

1)管理模块所进入的主页如图3所示。

当管理员用户登录成功后所进入的主页,该主页主要显示的是每个专业的板块,当用户点击某一个专业的板块就会进入该专业的主页,在该专业主页就可以进行查询、修改该专业下的课程和学生。若想添加一个新专业、课程或者学生都可以在主页中的导航栏进入相关页面。

2)学生模块所进入的主页如图4所示

学生使用自己的学号和密码登录学生模块后进入该主页,学生就可以自行查看自己的成绩、个人信息。

3.3 管理模块的设计与实现

1)添加课程

当用户进入添加课程页面后,如图5所示,只需填好页面中的各个表单项,点击提交,负责此功能的servlet就可以通过request对象获取表单中的各个参数,并将这些参数打包成一个课程对象,再通过调用公共模块中service层的添加课程方法,以课程对象為参数,即可完成添加。添加完成后,系统会跳转到该专业、年级的课程显示区,并在数据库学生成绩表中给该专业下的所有学生添加课程记录。

2)添加学生

添加学生需要上传学生的照片,所以添加学生的表单具有文件上传项,与添加课程不同,此时表单标签的enctype属性需要修改为enctype="multipart/form-data"。当用户填好表单、选好上传文件并提交到添加学生的servlet后,在servlet中就需要先从service层调用一个解析request的方法。在该方法中,使用到了ServletFileUpload类,在这个类中,使用parseRequest()方法就可以对request进行解析,解析完成后,得到方法的返回值,一个FileItem类型的集合,该集合里实际上就是表单项的值。直接使用迭代器对集合进行遍历,在整个遍历中,首先要考虑两层判断,第一层,通过isFormField()方法判断是否为普通表单项,如果是则进入第二层判断,如果不是,则说明该表单项为文件上传项,直接通过FileItem对象的get()方法得到文件的字节流并给学生对象的“照片”属性赋值(该属性的类型为 byte[])。第二层判断的目的是为了给学生对象除“照片”属性外的其他属性赋值,每一个表单项均与学生的每一个属性一一对应,所以判断的条件是表单项标签中的name属性值,遍历完成后,就能得到一个完整的学生对象,对象的属性值都与用户所填的表单项一一对应,将学生对象返回给servlet,servlet拿到学生对象后就可以调用添加学生的方法,以学生对象为参数,完成添加。添加成功后会和添加课程一样跳转到相应页面,并在数据库学生成绩表中添加相应记录。添加学生页面如图6所示。

3)分类显示课程或学生

当用户点击相应的专业模块,就能进入到相应课程列表页面或学学生列表页面。在跳转到这些页面之前,servlet会做一系列的工作:首先会request对象能得到两个参数,专业ID和年级,通过调用service层的查询课程或者学生方法,以专业ID和年级参数,就能得到该专业、年级下的课程或者学生对象集合。将集合通过request传给将要跳转的JSP页面。在JSP中,通过EL表达式可以很轻松地拿到这个集合对象,通过c:forEach标签遍历JSP拿到的集合对象就可以将每一项展示在页面中了。

4)修改学生成绩

当用户在专业模块的学生显示区点击某个学生的姓名就能进入该学生的管理页,点击学生成绩按钮该页面会呈现该学生在该专业、该年级下的所有课程,点击修改按钮触发js函数就能使学生成绩列表变成可编辑状态,当用户输入完学生的学生课程分数并进行提交,servlet就开始工作了。想完成这个功能首先需要考虑两个问题,如何让servlet知道用户修改的是哪些课程的分数?如何让用户修改的分数与显示的分数一一对应?首先要解决第一个问题,在用户修改的成绩表单中添加两个隐藏的Input标签,这两个标签负责向servlet传学生的学号、年级这两个参数,系统就能知道需要修改的是哪位同学、哪个年级下的课程,就可以先从数据库中取出符合这个条件的成绩记录集合。解决第二个问题,首先可以在JSP页面中的输入成绩的标签中添加name属性,属性的值为成绩记录具唯一性的主键。在servlet中遍历拿到的集合,在遍历中以集合中的成绩记录对象的ID属性(与主键对应)为参数,使用request的 getParameter()方法获取用户输入的分数,如果能取到,说明用户修改的是当前课程的分数,如果取不到任何值,说明没有修改该课程,直接跳过。得到该分数后,进行分数计算,看看该成绩是优秀、合格、挂科还是无效,最后将评级、分数传给service层中的修改成绩方法,以主键为条件,完成修改。遍历完成后,整个页面的成绩就会如我们所想的得到一一对应的修改。最后会跳转到已经修改好的不可编辑的学生成绩页面。补充:虽然可以跳过第一个问题,使用所有的学生成绩记录进行遍历,但一旦学生增多、课程增多,计算量就会增大,性能就会下降。

3.4  学生模块的设计与实现

1)登录问题

学生可以通过自己的学号和密码进行登录,完成登录后,servlet会首先使用学生输入的账号在数据库进行查找,如果查找不到,request会向登录的页面返回一个参数,如果页面能接收到这个参数,就会提示用户输入的账号或密码错误。如果查找得到,servlet就能得到这个学生对象,通过这个学生对象的password属性值与学生用户输入的密码比较,如果相同则登录成功,不同则返回参数。一旦登录成功,在servlet中会在session对象的作用域中存放该学生对象、该生的所有课程成绩记录集合对象。这么做的目的有两点:一是在学生模块的每个JSP页面都可以直接通过EL表达式获取学生和成绩的信息。二是如果学生用户未登录,想直接在地址栏中输入地址进入某个页面,作用在服务器中的filter会检测这一行为,如果没有检测到session对象,说明学生用户并没有登录成功,filter会强行使系统跳转登录页。

2)显示问题

当学生用户在导航栏点击“我的”,就会在该页面看到个人信息。在这一页面可以看到一些基本信息,以及在管理模块中上传的照片。显示个人的基本信息只需要通过EL表达式获取session作用域中的学生对象即可。显示指定的照片需要先创建一个servlet,这个servlet只负责一件事,那就是加载我们需要的图片。首先,直接在servlet中通过session获取当前学生对象,这个对象实际上已经存好了我们想要的照片。在上文提到,这个“照片”其实就是一个byte[]数组,在servlet中将数组读到输入流,通过response对象获取输出流对象(ServletOutputStream),通过输出流的写操作将流输出到浏览器中,最后,只需将负责显示图片的img标签 中的src属性修改为该servlet的映射地址,即可完成指定图片的显示。

当学生用户在导航中点击“成绩”,就会按照年级来分别显示课程的成绩。在显示所有的个人成绩前,servlet通过学生的学号、年级在service层中调用相应的方法。与管理模块的显示方式不同,在学生模块中成绩是无法修改的,所以可以将该学生所有年级的成绩全部都传到一个JSP页面中, 通过4次调用方法获取4个年级不同的集合对象,通过request对象传到成绩页,学生用户就可以选择点击二级导航来决定显示哪个年级的成绩。

4 结束语

本论文主要采用JavaEE技术,设计并实现了学生成绩管理系统,在文中介绍了各功能模块的实现,即管理端:可以对学生的信息、课程的信息、学生成绩信息进行编辑与修改。学生端:每个学生可以依据自己的账户登录并对个人信息及个人成绩信息进行查询等。该系统的设计可以达到学生成绩信息化的管理目标,方便教师与学生的使用,可以在高校推广运用。经测试,系统运行稳定,但在前端部分,可以使用JavaScript进行多方面的优化,如添加用户输入判空、验证码、用户提示等功能,在后续会继续完善。

参考文献:

[1] 郭博,舒娟,史曉凤,等.基于 C#的学生成绩管理系统的设计与实现[J]. 陇东学院学报,2018, 29(5):13-15

[2] 叶小芹,张静.基于C语言的学生成绩管理系统的设计与实现. 电脑知识与技术,2017,13(4):59-62.

[3] 田文涛,张钊,张笑冰. 基于 SSH 的学生成绩信息管理系统的具体设计与实现[J]. 软件,2018,39(2):212-217.

[4] 谭少娟. 高校学生成绩管理系统设计与实现探析[J].知识经济, 2018(3):143-144.

[5] 马强. 学生成绩管理系统的设计与实现[J].数字技术与应用,2017(10):156-158.