在高校日常管理工作中,学生请假审批是一项频繁且重要的行政事务。传统的纸质请假流程普遍存在审批链条长、效率低下、记录查询困难、状态不透明以及材料易丢失等问题。为解决这些痛点,我们设计并实现了一套基于SSH(Struts2 + Spring + Hibernate)整合框架的“学生请假审批管理系统”,旨在通过信息化手段将请假流程全面数字化、规范化,显著提升教务管理效率与学生服务体验。
该系统采用经典的三层架构设计,实现了表现层、业务逻辑层与数据持久层的清晰分离。表现层选用Struts2作为MVC框架,负责接收用户请求、封装数据并控制视图跳转,其强大的拦截器机制与标签库为前端开发提供了便利。业务逻辑层由Spring框架的核心IoC容器统一管理,所有Service组件均以依赖注入的方式组装,实现了业务组件的松耦合与高可测试性。同时,Spring的声明式事务管理为核心业务操作提供了可靠的数据一致性保障。数据持久层则基于Hibernate构建,通过对象关系映射技术将Java实体对象与数据库表无缝关联,极大简化了数据库操作,并使用HQL面向对象查询语言替代传统的SQL,提升了代码的可读性与可维护性。
数据库架构设计与核心表分析
系统数据库共设计6张核心表,支撑着用户管理、请假流程、信息发布等核心业务。以下重点分析t_student(学生表)和t_leave(请假申请表)的设计亮点。
1. 学生信息表(t_student)设计
CREATE TABLE `t_student` (
`studentId` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生ID',
`studentNo` varchar(20) NOT NULL COMMENT '学号',
`studentName` varchar(20) NOT NULL COMMENT '姓名',
`sex` varchar(10) DEFAULT NULL COMMENT '性别',
`classId` int(11) DEFAULT NULL COMMENT '班级ID',
`password` varchar(20) NOT NULL DEFAULT '111111' COMMENT '登录密码',
PRIMARY KEY (`studentId`),
KEY `classId` (`classId`),
CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classId`) REFERENCES `t_class` (`classId`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
该表设计体现了数据规范性与业务实用性的结合。主键studentId采用自增策略,确保唯一性。studentNo(学号)字段设置为唯一且非空,作为业务层面的关键标识。一个精妙的设计是将默认密码password字段的默认值设为'111111',这简化了系统初始化时账户的创建流程,管理员或教师添加新生后,学生可使用统一初始密码登录并自行修改,兼顾了安全与操作便捷。此外,通过外键classId关联班级表t_class,建立了清晰的学生-班级隶属关系,为后续按班级筛选学生、统计班级请假情况等功能奠定了数据基础。
2. 请假申请表(t_leave)设计
CREATE TABLE `t_leave` (
`leaveId` int(11) NOT NULL AUTO_INCREMENT COMMENT '请假ID',
`studentId` int(11) NOT NULL COMMENT '学生ID',
`leaveReason` varchar(500) NOT NULL COMMENT '请假原因',
`startTime` varchar(50) NOT NULL COMMENT '开始时间',
`endTime` varchar(50) NOT NULL COMMENT '结束时间',
`leaveState` int(11) NOT NULL DEFAULT '0' COMMENT '审核状态',
`approver` int(11) DEFAULT NULL COMMENT '审批人ID',
`approveTime` varchar(50) DEFAULT NULL COMMENT '审批时间',
`approveReason` varchar(500) DEFAULT NULL COMMENT '审批意见',
PRIMARY KEY (`leaveId`),
KEY `studentId` (`studentId`),
CONSTRAINT `t_leave_ibfk_1` FOREIGN KEY (`studentId`) REFERENCES `t_student` (`studentId`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
t_leave表是整个系统的核心,其设计完整记录了请假单的生命周期。leaveState字段使用整型数值(如0-待审核,1-已通过,2-未通过)来标识审批状态,这种枚举式的设计便于程序进行条件判断和统计。startTime和endTime字段定义为varchar(50),在实际应用中通常会存储格式化的日期时间字符串,也可以考虑使用datetime类型以更方便地进行时间计算与比较。审批流程的痕迹被完整保留:approver记录了执行审批操作的教师ID,approveTime记录审批时间,approveReason则允许审批人填写具体的审批意见。这种设计确保了请假流程的每一步都有据可查,实现了流程的可追溯性。
核心功能实现与代码解析
1. 学生请假申请功能
学生登录系统后,可进入请假申请页面,填写详细的请假信息。前端通过表单收集请假事由、起止时间等数据,提交至Struts2的Action进行处理。

对应的核心Action类负责接收请求参数,并调用业务层服务完成持久化操作。
// LeaveAction.java 中处理请假申请的方法
public String addLeave() {
HttpServletRequest request = ServletActionContext.getRequest();
// 从Session中获取当前登录的学生信息
Student student = (Student) request.getSession().getAttribute("currentStudent");
// 封装请假数据到Leave对象
Leave leave = new Leave();
leave.setStudentId(student.getStudentId());
leave.setLeaveReason(leaveReason);
leave.setStartTime(startTime);
leave.setEndTime(endTime);
leave.setLeaveState(0); // 初始状态为0,待审核
// 调用业务层方法保存请假申请
this.leaveService.addLeave(leave);
this.setMessage("请假申请提交成功!");
this.setUrl("leave_manage.jsp");
return "success";
}
2. 教师审批功能
教师或辅导员登录后,系统会列出所有待审批的请假申请。教师可以查看申请详情,并做出通过或拒绝的决策。

审批功能的业务逻辑集中在Service层,利用Spring的事务管理确保数据更新的一致性。
// LeaveService.java 中的审批方法
@Service
@Transactional // Spring声明式事务注解
public class LeaveService {
@Autowired
private LeaveDao leaveDao;
public void approveLeave(Integer leaveId, Integer approverId, Integer state, String approveReason) {
// 1. 根据ID查询出请假实体
Leave leave = leaveDao.getLeaveById(leaveId);
if (leave == null) {
throw new RuntimeException("未找到该请假申请");
}
// 2. 更新审批状态、审批人、审批时间和意见
leave.setLeaveState(state);
leave.setApprover(approverId);
leave.setApproveTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
leave.setApproveReason(approveReason);
// 3. 更新数据库
leaveDao.updateLeave(leave);
}
}
3. 持久层Hibernate映射与查询
Hibernate的ORM映射将数据库表转化为Java实体类,使开发者可以面向对象的方式进行数据库操作。以下是Leave实体类的部分代码。
// Leave.java 实体类
@Entity
@Table(name = "t_leave")
public class Leave {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer leaveId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "studentId")
private Student student;
@Column(name = "leaveReason", length = 500)
private String leaveReason;
@Column(name = "startTime")
private String startTime;
@Column(name = "endTime")
private String endTime;
@Column(name = "leaveState")
private Integer leaveState;
// ... 省略 getter 和 setter 方法
}
对于复杂的查询,例如教师需要查看其管理班级的所有学生的请假历史,可以使用HQL进行关联查询。
// LeaveDaoImpl.java 中的HQL查询示例
@Repository
public class LeaveDaoImpl extends HibernateDaoSupport implements LeaveDao {
public List<Leave> findLeavesByTeacherClass(Integer teacherId) {
String hql = "SELECT l FROM Leave l JOIN l.student s JOIN s.studentClass c JOIN c.teacher t WHERE t.teacherId = ?";
return this.getHibernateTemplate().find(hql, teacherId);
}
}
4. 系统管理与信息发布
管理员拥有最高权限,可以对班级、学生、教师等基础信息进行管理,并发布系统公告。

信息发布功能通常涉及富文本编辑器的集成,后台Action负责处理HTML内容的保存与展示。
// AnnouncementAction.java 中发布公告的方法
public String addAnnouncement() {
Announcement announcement = new Announcement();
announcement.setTitle(title);
announcement.setContent(content); // content为富文本内容
announcement.setCreateTime(new Date());
this.announcementService.addAnnouncement(announcement);
this.setMessage("公告发布成功!");
return "success";
}
实体模型与业务逻辑整合
系统通过精细的实体关系映射构建了完整的业务模型。核心实体如Student(学生)、Teacher(教师)、Leave(请假单)、Announcement(公告)等,通过Hibernate注解建立了多对一、一对多等关联关系。例如,一个Student属于一个Class,一个Class对应一个班主任Teacher,一个Student可以提交多个Leave。这种对象网络使得业务逻辑的表达非常直观。
Spring框架将所有这些组件粘合在一起。通过applicationContext.xml配置文件,定义了数据源、SessionFactory、事务管理器以及各层Bean的依赖关系。
<!-- applicationContext.xml 片段 -->
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/student_leave_db"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 配置Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>com/maan/entity/Student.hbm.xml</value>
<value>com/maan/entity/Leave.hbm.xml</value>
<!-- ... 其他映射文件 -->
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 开启注解驱动的事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
功能展望与系统优化方向
尽管当前系统已满足基本需求,但在以下方面仍有可观的优化空间:
- 流程引擎集成:当前审批流程相对固定。未来可以集成轻量级工作流引擎(如Activiti或Flowable),实现可配置的、多级审批流程(如学生 -> 辅导员 -> 院系领导),满足更复杂的行政管理需求。
- 移动端支持与消息推送:开发配套的微信小程序或App,使学生和教师能随时随地处理请假事务。集成消息推送服务(如极光推送、微信模板消息),在申请提交、审批完成等关键节点实时通知相关人员。
- 数据可视化与分析报表:引入ECharts等前端图表库,为管理员提供数据驾驶舱功能。可视化展示各班级、各时期的请假率、请假原因分布等统计信息,为教学管理决策提供数据支持。
- 附件管理与云存储:强化证明材料的电子化管理。请假申请可支持上传图片、PDF等附件,并考虑将附件存储于阿里云OSS或腾讯云COS等对象存储服务,以减轻服务器压力并提升访问速度。
- 接口开放与系统集成:设计RESTful API,实现与学校现有系统(如教务系统、统一身份认证系统)的数据对接,避免信息孤岛,实现单点登录和学生信息的自动同步。
该系统作为SSH框架技术的一个典型应用案例,不仅成功解决了传统请假流程的弊端,其清晰的分层架构和规范的编码实践也为后续的功能扩展和维护提供了良好的基础。通过持续的技术迭代与功能深化,该平台有望成为校园数字化管理中不可或缺的一环。