基于javaweb的JSP+Servlet在线考试管理系统(java+jsp+jquery+servlet+mysql)

运行环境

Java≥8、MySQL≥5.7、Tomcat≥8

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

540023572402

560023572402

570023572402

580023572402

590023572402

000023582402

基于javaweb的JSP+Servlet在线考试管理系统(java+jsp+jquery+servlet+mysql)

项目介绍

本项目包含管理员与学生两个角色; 管理员角色包含以下功能: 登录页面,管理员首页,考生信息管理,成绩管理,考生录入,题库管理,题目录入,试卷管理等功能。

学生角色包含以下功能: 学生登录,学生主页,开始考试,查看成绩等功能。

PS:在添加学生或者添加试题的时候,可以上传文件来实现,文件的模板在管理试题和管理学生的时候,点击下载就有了。

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS;  5.数据库:MySql 5.7版本; 6.是否Maven项目:否;

技术栈

  1. 后端:Servlet 2. 前端:JSP+jQuery

使用说明

  1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中配置文件中的数据库配置改为自己的配置; 4. 运行项目,输入localhost:8080/ 登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
	break;
default:
break;
}

try {
//实例化数据库连接对象,把上面计算到的分值分别存入数据库中
DatabassAccessObject db = new DatabassAccessObject();
LoginBean loginBean = (LoginBean) session.getAttribute("loginBean");
String ID = loginBean.getID();
db.insert("update student set score = ? where ID = ? ", score, ID);

ResultSet rs = db.query("select * from score where id = ?", ID);
if (!rs.next()) {
db.insert("insert into score values(?,?,?,?,?,?,?,?)", ID, score, score_sing, score_muti, score_jud,
score_fill, score_ess,grade);
} else {
db.modify(
"update score set score = ? , score_sing = ? , score_muti= ? , score_jud = ? , score_fill = ? , score_ess = ?,grade = ? where ID = ? ;",
score, score_sing, score_muti, score_jud, score_fill, score_ess,grade, ID);
}
rs = db.query("select * from student where id = ?", ID);
rs.first();

} catch (Exception e) {
e.printStackTrace();
}
System.out.println(score);
response.setContentType("text/html;charset=utf-8");

//如果考生交了白卷,且作答时间有剩余5分钟以上,则建议考生继续作答,重定向回试卷页面;
//否则,视为交卷成功,重定向回学生信息页。
PrintWriter out = response.getWriter();
long curTime = System.currentTimeMillis() / 1000;
long endTime = (long) session.getAttribute("endTime");
if (score == 0 && endTime - curTime >= 300) {
out.println("<script language=javascript>if(confirm('时间尚有剩余,请认真作答')){window.location='" + request.getContextPath()
+ "/student/student_exam_paper.jsp';}</script>");
out.println("<script language=javascript>window.location='" + request.getContextPath()
+ "/student/student.jsp';alert('试卷已经提交,可以查阅成绩单');</script>");
LoginBean loginBean = (LoginBean) session.getAttribute("loginBean");
loginBean.setScore(score);

} else {
LoginBean loginBean = (LoginBean) session.getAttribute("loginBean");
loginBean.setScore(score);
session.removeAttribute("examTime");
session.removeAttribute("endTime");
out.println("<script language=javascript>window.location='" + request.getContextPath()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
	throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); // 编码处理
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

String executeMode = request.getParameter("executeMode");
int mode = Integer.parseInt(executeMode); // 转化整形
System.out.println(mode);

int cpage = 0;
int per = 10;
if (request.getParameter("cpage") != null) {
cpage = Integer.parseInt(request.getParameter("cpage"));
}
request.setAttribute("cpage", cpage);
if (request.getParameter("per") != null) {
per = Integer.parseInt(request.getParameter("per"));
}
request.setAttribute("per", per);
String ID = request.getParameter("ID");
String name = request.getParameter("name");
String CLASS = request.getParameter("class");
Float score_sing = Float.valueOf(request.getParameter("score_sing"));
Float score_muti = Float.valueOf(request.getParameter("score_muti"));
Float score_jud = Float.valueOf(request.getParameter("score_jud"));
Float score_fill = Float.valueOf(request.getParameter("score_fill"));
Float score_ess = Float.valueOf(request.getParameter("score_ess"));
// Float score=Float.valueOf(request.getParameter("score"));
Float score = score_sing + score_muti + score_jud + score_fill + score_ess;
String grade = "";
int f = Math.round(score);
int g = ((f < 0) == true ? 1 : 0) + ((f < 60) == true ? 1 : 0) + ((f < 75) == true ? 1 : 0)
+ ((f < 85) == true ? 1 : 0) + ((f < 95) == true ? 1 : 0);
switch (g) {
case 0:
grade = "优秀";
break;
case 1:
grade = "良好";
break;
case 2:
grade = "中等";
break;
case 3:
grade = "及格";
break;
case 4:
grade = "不及格";
break;
case 5:
grade = "缺考";
break;
default:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 */
@WebServlet("/ShowQuePage")
public class QuestionShowByPageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 如果没有参数传递过来,初定每页显示10条记录,显示第一页。
// 然后把这两个参数压到request容器传到前台页面。request容器是前台页面收到即销毁的容器。
int cpage = 0;
int per = 10;
if (request.getParameter("cpage") != null) {
cpage = Integer.parseInt(request.getParameter("cpage"));
}
request.setAttribute("cpage", cpage);
if (request.getParameter("per") != null) {
per = Integer.parseInt(request.getParameter("per"));
}
request.setAttribute("per", per);
// 之后进行数据库的查询
try {
// 先数据库的查询结果有多少条记录
DatabassAccessObject db = new DatabassAccessObject();
ResultSet rsTotal = db.query("select count(*) as total from question");
if (rsTotal.next()) {
// 求出总页数压到request容器传递给前台页面。
request.setAttribute("totalPage", 1 + (rsTotal.getInt("total") - 1) / per);
}
// 新建一个动态数组用来存放查询结果
ArrayList<QuestionBean> queBeanAllList = new ArrayList<QuestionBean>();

ResultSet rs=null;
String q_title=request.getParameter("q_title");
String q_type="";
q_type=request.getParameter("q_type");
if (q_title!=null) {
rs=db.query("select * from question where title LIKE '%"+q_title+"%' ;");
}else if(q_type!=null&&q_type.length()>0){

rs=db.query("select * from question where type='"+q_type+"' ;");
}
else {
rs = db.query("select\r\n" +
" *\r\n" +
"from\r\n" +
" question\r\n" +
"order by\r\n" +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46



@WebServlet("/ShowScorePage")
public class ScoreShowByPage extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException {
// 如果没有参数传递过来,初定每页显示10条记录,显示第一页。
// 然后把这两个参数压到request容器传到前台页面。request容器是前台页面收到即销毁的容器。
int cpage = 0;
int per = 10;
if (request.getParameter("cpage") != null) {
cpage = Integer.parseInt(request.getParameter("cpage"));
}
request.setAttribute("cpage", cpage);
if (request.getParameter("per") != null) {
per = Integer.parseInt(request.getParameter("per"));
}
request.setAttribute("per", per);

try {
// 数据库的查询结果有多少条记录
DatabassAccessObject db=new DatabassAccessObject();
ResultSet rsTotal = db
.query("select count(*) as total from student");
if (rsTotal.next()) {
// 求出总页数压到request容器传递给前台页面。
request.setAttribute("totalPage", 1
+ (rsTotal.getInt("total") - 1) / per);
}
// 新建一个动态数组用来存放查询结果
ArrayList<StudentInfoBean> stuBeanAllList = new ArrayList<StudentInfoBean>();
ResultSet rs=null;
String s_ID=request.getParameter("s_ID");
if (s_ID!=null) {
rs=db.query("select score.ID,class,name,score_sing,score_muti,score_jud,score_fill,score_ess,score.score,grade from student join score on student.id=score.id where score.id LIKE '%"+s_ID+"%' ;");
}else {
rs = db.query("select score.ID,class,name,score_sing,score_muti,score_jud,score_fill,score_ess,score.score,grade from student join score on student.id=score.id order by ID ;");
}


int total = 0;
while (rs.next()) {
String ID=rs.getString(1);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 * 此外,还可以接受批量上传的图片,并保存到工程目录下
*/
@WebServlet("/HandleBatchAdd")
@MultipartConfig // 支持文件上传
public class BatchAdditionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); // 编码处理
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String excelSorcePath = "";
Integer mode = Integer.valueOf(request.getParameter("mode"));
String savePath = getServletContext().getRealPath("/images");

/**
* 以下部分为获取上传Excel文件并保存到发布目录
*/
Part part = request.getPart("excel"); // Excle文件
String fileName = part.getSubmittedFileName(); // 获取part对象所携带的文件名称
if (fileName.length() > 0) { // 如果文件不为空
savePath = getServletContext().getRealPath("/images");
part.write(savePath + "/" + fileName);// 上传文件到发布目录下
excelSorcePath = savePath + "/" + fileName;
// 图片的目标路径(当前项目目录)
}

/**
* 以下部分为获取批量上传的配图
*/
for (Part imgPath : request.getParts()) { // 遍历上传的每一个part
if (imgPath.getName().startsWith("img")) {
// 上传按钮也是part对象,在这里用if条件语句过滤它
// 只接受part名称标头为"img"的正文图片数据
String fileName1 = imgPath.getSubmittedFileName(); // 获取单张图片的文件名
if (fileName1 == null || fileName1.length() == 0)
break;
try {
imgPath.write(savePath + "/" + fileName1); // 写入图片到tomcat的发布目录下

} catch (Exception e) {
System.out.println(e);
}

/**


项目链接:
https://javayms.github.io?id=411122572008200tw
https://javayms.pages.dev?id=411122572008200tw