项目名称:javaweb学生在线考试报名以及成绩查询系统
前言
项目介绍:本项目是一个在线考试系统,主要涉及学生、管理员也就是教师两种用户角色,针对不同用户提供了相应的功能模块,以满足在线考试相关的各项业务需求。
一、角色分类
角色分类:管理员,学生
二、系统结构
1.前段部分:
- 前端界面:采用JSP技术开发,通过HTML、CSS和JavaScript实现页面布局与交互效果,为用户提供直观的操作界面。
2.后端部分:
1.后端处理:使用Java语言编写业务逻辑,处理前端请求,与数据库进行数据交互,确保系统功能的实现。
3.数据库设计:
数据库:使用MySQL数据库包括一下几个核心的表,如学生信息、管理员信息、考试信息、报名信息等,为系统运行提供数据支持。
4.界面效果图,学生端部分
1.注册功能
2.学生登录:
3.考试报名功能
4.成绩查询功能
5.管理员功能效果图:
1.登录:
2.登录成功后进入管理页面
3.更新学生信息
4.学生列表查看:在studentList.jsp页面,可搜索和分页显示学生信息,数据由StudentService获取并传递给页面展示。
5.删除学生:在studentList.jsp页面点击删除链接,StudentDeleteServlet处理删除操作。
6.管理员自身管理功能:与学生管理类似,包括管理员添加(adminAdd.jsp和AdminAddServlet)、列表查看(adminList.jsp)、更新(adminUpdate.jsp和AdminUpdateServlet)和删除(AdminDeleteServlet),操作流程和数据处理方式一致。
6.考试信息管理功能:
1.添加考试信息:在examInfoAdd.jsp页面添加考试信息,ExamInfoAddServlet处理存储,页面实时反馈操作结果。
2.考试信息列表查看与搜索:在examInfoList.jsp页面实现,支持分页和按条件搜索,数据交互由ExamInfoService和页面配合完成。
3.更新考试信息:在examInfoUpdate.jsp页面修改考试信息,ExamInfoUpdateServlet更新数据库。
4.删除考试信息:在examInfoList.jsp页面执行删除操作,由ExamInfoDeleteServlet处理。
报名信息管理功能:
1.查看报名信息:在enrollInfoList.jsp页面,可按条件搜索和分页显示报名信息,数据由EnrollInfoService提供。
2.成绩录入:在enrollInfoUpdate.jsp页面,管理员录入学生成绩,EnrollInfoUpdateServlet更新数据库中的成绩数据。
3.删除报名信息:在enrollInfoList.jsp页面点击删除链接,由EnrollInfoDeleteServlet处理。
7.部分代码展示
1.adminLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title>
<link rel="stylesheet" href="<%=request.getContextPath()%>/css/login.css">
</head>
<body>
<div class="login-div">
<h2>登录管理端</h2>
<div class="msg">${errorMsg}</div>
<form action="<%=request.getContextPath() %>/AdminLoginServlet" method="post">
<%-- <label for="username">用户名:</label>--%>
<input id="username" type="text" name="username" required placeholder="用户名" class="input"><br><br>
<%-- <label for="password">密码:</label>--%>
<input id="password" type="password" name="password" required placeholder="密码" class="input"><br><br>
<button class="button_login">登录</button>
<a href="<%=request.getContextPath() %>/stuLogin.jsp" class="button_go_register">学生登陆</a>
</form>
</div>
</body>
</html>
2.StudentLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title>
<link rel="stylesheet" href="<%=request.getContextPath()%>/css/login.css">
</head>
<body>
<%
// 获取cookie里保存的用户信息
Cookie[] cookies = request.getCookies();
String username = null;
String password = null;
String remember = null;
if (cookies != null && cookies.length > 0) {
for (int i=0; i<cookies.length; i++) {
if (cookies[i].getName().equals("username")) {
// 取出用户名
username = cookies[i].getValue();
}
if (cookies[i].getName().equals("password")) {
// 取出密码
password = cookies[i].getValue();
}
if (cookies[i].getName().equals("remember")) {
// 取出是否记住我
remember = cookies[i].getValue();
}
}
}
request.setAttribute("username", username);
request.setAttribute("password", password);
request.setAttribute("remember", remember);
%>
<div class="login-div">
<h2>学生登录</h2>
<div class="msg">${errorMsg}</div>
<form action="<%=request.getContextPath() %>/StudentLoginServlet" method="post" id="login_form">
<input id="username" type="text" name="username" required placeholder="用户名" class="input" value="${ username }"><br><br>
<input id="password" type="password" name="password" required placeholder="密码" class="input" value="${ password }"><br><br>
<label for="remember">记住密码:</label>
<input type="checkbox" id="remember" name="remember"
<c:if test="${remember == 'on'}">checked</c:if>
><br><br>
<button class="button_login">登录</button>
<a href="<%=request.getContextPath() %>/stuRegister.jsp" class="button_go_register">注册</a>
<a href="<%=request.getContextPath() %>/adminLogin.jsp" class="button_go_register">管理员登陆</a>
</form>
</div>
</body>
<script>
var remember = document.getElementById("remember").checked;
if (remember) {
submitForm();
}
function submitForm() {
document.getElementById('login_form').submit();
}
</script>
</html>
3.StudentRegister.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注册</title>
<link rel="stylesheet" href="<%=request.getContextPath()%>/css/register.css">
</head>
<body>
<div class="register-div">
<h2>注册</h2>
<div class="success_msg">${successMsg}</div>
<div class="error_msg">${errorMsg}</div>
<form action="<%=request.getContextPath() %>/StudentRegisterServlet" method="post">
<input id="username" type="text" name="username" required="required" class="input" placeholder="请输入用户名">
<input id="password" type="text" name="password" required="required" class="input" placeholder="请输入密码">
<input id="realName" type="text" name="realName" required="required" class="input" placeholder="请输入真实姓名">
<select id="sex" name="sex" required="required" class="input">
<option value="男">男</option>
<option value="女">女</option>
</select>
<input id="email" type="text" name="email" required="required" class="input" placeholder="请输入邮箱">
<input id="phone" type="text" name="phone" required="required" class="input" placeholder="请输入手机号">
<input id="department" type="text" name="department" required="required" class="input" placeholder="请输入院系">
<input id="major" type="text" name="major" required="required" class="input" placeholder="请输入专业">
<input id="classes" type="text" name="classes" required="required" class="input" placeholder="请输入班级">
<button class="button_register">注册</button>
<a href="<%=request.getContextPath()%>/login.jsp" class="button_go_login">去登录</a>
</form>
</div>
</body>
</html>
4.JDBCUtils
package edu.xx.exam.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 数据库连接工具类
*/
public class JDBCUtils {
private static String url = "jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true";
private static String username = "root";
private static String password = "aA123456";
static {
try {
// 加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取数据库连接方法
* @return
*/
public static Connection getConnection() {
try {
return DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
/**
* 关闭资源方法
* @param connection
* @param preparedStatement
* @param resultSet
*/
public static void closeAll(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
try {
//如果resultSet不空,关闭resultSet
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
//如果preparedStatement不为空,关闭preparedStatement
if (preparedStatement != null) {
preparedStatement.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
8.实体类
1.Admin.Java
package edu.xx.exam.entity;
import java.util.Date;
/**
* 管理员实体类
*/
public class Admin {
/** 用户名 */
private String username;
/** 密码 */
private String password;
/** 昵称 */
private String nickname;
/** 创建时间 */
private Date createDatetime;
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getNickname() {
return nickname;
}
public void setCreateDatetime(Date createDatetime) {
this.createDatetime = createDatetime;
}
public Date getCreateDatetime() {
return createDatetime;
}
@Override
public String toString() {
return "Admin{" +
"username=" + username +
", password=" + password +
", nickname=" + nickname +
", createDatetime=" + createDatetime +
'}';
}
}
2.EnrollInfo .java
package edu.xx.exam.entity;
import java.math.BigDecimal;
import java.util.Date;
/**
* 报名信息实体类
*/
public class EnrollInfo {
/** id */
private Integer id;
/** 报考人id */
private String userId;
/** 报考信息id */
private Integer examId;
/** 成绩 */
private BigDecimal score;
/** 创建时间 */
private Date createDatetime;
/** 报考人姓名 */
private String userRealName;
/** 考试名称 */
private String examName;
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserId() {
return userId;
}
public void setExamId(Integer examId) {
this.examId = examId;
}
public Integer getExamId() {
return examId;
}
public void setScore(BigDecimal score) {
this.score = score;
}
public BigDecimal getScore() {
return score;
}
public void setCreateDatetime(Date createDatetime) {
this.createDatetime = createDatetime;
}
public Date getCreateDatetime() {
return createDatetime;
}
public String getUserRealName() {
return userRealName;
}
public void setUserRealName(String userRealName) {
this.userRealName = userRealName;
}
public String getExamName() {
return examName;
}
public void setExamName(String examName) {
this.examName = examName;
}
@Override
public String toString() {
return "EnrollInfo{" +
"id=" + id +
", userId=" + userId +
", examId=" + examId +
", score=" + score +
", createDatetime=" + createDatetime +
'}';
}
}
3.ExamInfo .java
package edu.xx.exam.entity;
import java.util.Date;
/**
* 考试信息实体类
*/
public class ExamInfo {
/** id */
private Integer id;
/** 考试名称 */
private String examName;
/** 考试地点 */
private String examAddr;
/** 开始时间 */
private Date startTime;
/** 结束时间 */
private Date endTime;
/** 课程名称 */
private String curriculumName;
/** 考试状态(0未开始1进行中2结束) */
private Integer examStatus;
/** 创建时间 */
private Date createDatetime;
public void setId(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setExamName(String examName) {
this.examName = examName;
}
public String getExamName() {
return examName;
}
public void setExamAddr(String examAddr) {
this.examAddr = examAddr;
}
public String getExamAddr() {
return examAddr;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getStartTime() {
return startTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public Date getEndTime() {
return endTime;
}
public void setCurriculumName(String curriculumName) {
this.curriculumName = curriculumName;
}
public String getCurriculumName() {
return curriculumName;
}
public void setExamStatus(Integer examStatus) {
this.examStatus = examStatus;
}
public Integer getExamStatus() {
return examStatus;
}
public void setCreateDatetime(Date createDatetime) {
this.createDatetime = createDatetime;
}
public Date getCreateDatetime() {
return createDatetime;
}
@Override
public String toString() {
return "ExamInfo{" +
"id=" + id +
", examName=" + examName +
", examAddr=" + examAddr +
", startTime=" + startTime +
", endTime=" + endTime +
", curriculumName=" + curriculumName +
", examStatus=" + examStatus +
", createDatetime=" + createDatetime +
'}';
}
}
4.Student .java
package edu.xx.exam.entity;
import java.util.Date;
/**
* 学生实体类
*/
public class Student {
/** 用户名称 */
private String username;
/** 密码 */
private String password;
/** 真实姓名 */
private String realName;
/** 邮箱 */
private String email;
/** 手机号 */
private String phone;
/** 性别 */
private String sex;
/** 所属院系 */
private String department;
/** 所属专业 */
private String major;
/** 所属班级 */
private String classes;
/** 创建时间 */
private Date createDatetime;
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getRealName() {
return realName;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPhone() {
return phone;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setDepartment(String department) {
this.department = department;
}
public String getDepartment() {
return department;
}
public void setMajor(String major) {
this.major = major;
}
public String getMajor() {
return major;
}
public void setClasses(String classes) {
this.classes = classes;
}
public String getClasses() {
return classes;
}
public void setCreateDatetime(Date createDatetime) {
this.createDatetime = createDatetime;
}
public Date getCreateDatetime() {
return createDatetime;
}
@Override
public String toString() {
return "Student{" +
"username=" + username +
", password=" + password +
", realName=" + realName +
", email=" + email +
", phone=" + phone +
", sex=" + sex +
", department=" + department +
", major=" + major +
", classes=" + classes +
", createDatetime=" + createDatetime +
'}';
}
}
总结
本在线考试系统通过详细的需求分析、合理的软件设计和全面的编码测试,实现了学生、管理员等用户角色的各项功能需求。系统功能涵盖了用户管理、考试管理、报名信息管理等核心业务,通过分层架构和数据库设计确保了系统的稳定性和数据的完整性。在测试过程中,对各个功能模块进行了充分验证,保证了系统的可靠性和易用性,能够满足在线考试管理的基本需求,为学校或教育机构提供了一个便捷、高效的考试管理平台。