1. 项目概述:传统架构下的在线考试系统实践
作为一名长期奋战在教育信息化一线的开发者,我最近完成了一个采用传统架构的在线考试系统项目。与当下流行的前后端分离模式不同,这个项目采用了经典的前后端不分离架构,通过JSP+Servlet技术栈实现。这种架构虽然在现代Web开发中显得有些"复古",但在特定场景下仍具有其独特优势。
这个系统主要实现了考生管理、试题库管理、在线组卷、考试监控和成绩统计等核心功能。整个项目采用MVC设计模式,前端使用Bootstrap+jQuery构建响应式界面,后端基于Spring+SpringMVC+Hibernate框架组合,数据库选用MySQL,并通过Druid连接池优化数据库访问性能。
技术选型思考:选择前后端不分离架构主要考虑到教育机构IT运维能力普遍较弱,这种架构部署简单、故障排查直观,且对服务器资源要求较低。实测在2核4G的云服务器上可稳定支持200人同时在线考试。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计与技术选型
2.1 整体架构解析
系统采用典型的三层架构设计:
- 表现层:JSP页面负责渲染,结合EL表达式和JSTL标签库展示数据
- 控制层:SpringMVC的DispatcherServlet统一处理请求,Controller负责业务逻辑调度
- 持久层:Hibernate实现ORM映射,Druid管理数据库连接池
这种架构的优势在于:
- 开发效率高:视图层与业务层紧密耦合,数据流转直接
- 部署简单:打包成单个WAR文件即可部署到Tomcat等Servlet容器
- 学习成本低:技术栈成熟,相关资料丰富
2.2 核心组件技术选型
前端技术栈
- Bootstrap 4:快速构建响应式界面,确保在不同设备上良好显示
- jQuery 3.5:简化DOM操作和AJAX请求处理
- UploadFive:处理文件上传需求,如考生提交附件答案
- DataTables:增强表格数据显示,支持分页、排序和搜索
后端技术栈
- Spring 5:提供IoC容器和AOP支持
- SpringMVC:处理Web请求和路由
- Hibernate 5:对象关系映射(ORM)框架
- Spring Security:认证授权管理
- Apache POI:处理Excel格式的试题导入导出
- Gson:JSON数据序列化/反序列化
数据库相关
- MySQL 8.0:关系型数据库存储业务数据
- Druid 1.2:高性能数据库连接池
- Flyway:数据库版本迁移工具
3. 核心功能实现细节
3.1 用户认证模块实现
用户认证采用Spring Security框架,配置了基于角色的访问控制(RBAC)。核心配置如下:
xml复制<http auto-config="true" use-expressions="true">
<intercept-url pattern="/admin/**" access="hasRole('ADMIN')"/>
<intercept-url pattern="/teacher/**" access="hasRole('TEACHER')"/>
<intercept-url pattern="/student/**" access="hasRole('STUDENT')"/>
<form-login
login-page="/login"
default-target-url="/home"
authentication-failure-url="/login?error"/>
<logout logout-success-url="/login?logout"/>
<csrf disabled="true"/>
</http>
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
<password-encoder ref="passwordEncoder"/>
</authentication-provider>
</authentication-manager>
<beans:bean id="passwordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
关键实现要点:
- 密码存储使用BCrypt强哈希加密,避免明文存储
- 自定义UserDetailsService从数据库加载用户信息
- 配置CSRF保护(开发阶段可暂时禁用)
- 不同角色(管理员、教师、学生)具有不同的访问权限
3.2 试题管理模块设计
试题采用多级分类体系,支持多种题型:
java复制@Entity
@Table(name = "questions")
public class Question {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "category_id")
private QuestionCategory category;
@Enumerated(EnumType.STRING)
private QuestionType type; // SINGLE_CHOICE, MULTI_CHOICE, TRUE_FALSE, ESSAY
@Column(columnDefinition = "TEXT")
private String content;
@Column(columnDefinition = "TEXT")
p
