1. 项目背景与核心需求
航空订票管理系统作为现代民航业的核心业务支撑平台,其技术选型与实现方案直接关系到系统的稳定性、可维护性和扩展性。基于SSH(Struts2 + Spring + Hibernate)框架的解决方案,在Java EE企业级应用开发领域具有经典地位,尤其适合作为计算机专业毕业设计的选题。
这个系统的核心业务场景包括:
- 航班信息管理(增删改查、状态更新)
- 机票库存动态管理(余票实时计算)
- 用户注册与身份验证
- 在线选座与支付流程
- 订单管理与退改签处理
- 数据统计与报表生成
提示:选择SSH框架组合时,Struts2负责Web层控制,Spring管理业务逻辑和依赖注入,Hibernate处理数据持久化,这种分层架构符合MVC设计模式,是Java Web开发的经典范式。
2. 技术栈选型分析
2.1 SSH框架组合优势
Struts2+Spring+Hibernate(简称S2SH)的技术组合在2010-2018年间是Java Web开发的主流选择,其技术优势体现在:
- 开发效率:通过XML配置和注解方式,减少了基础代码量
- 解耦程度:明确的分层架构(表现层/业务层/持久层)
- 社区支持:丰富的文档和解决方案积累
- 教学价值:完整覆盖Java EE核心知识点
框架版本建议:
- Struts 2.5.26(最后一个稳定版)
- Spring 4.3.30(与Struts2兼容性最佳)
- Hibernate 5.6.15(支持JPA 2.2规范)
2.2 数据库设计要点
航空订票系统的核心表结构应包括:
sql复制CREATE TABLE flight (
flight_id VARCHAR(20) PRIMARY KEY,
departure_city VARCHAR(50) NOT NULL,
arrival_city VARCHAR(50) NOT NULL,
departure_time DATETIME NOT NULL,
arrival_time DATETIME NOT NULL,
total_seats INT NOT NULL,
base_price DECIMAL(10,2) NOT NULL
);
CREATE TABLE ticket (
ticket_id VARCHAR(30) PRIMARY KEY,
flight_id VARCHAR(20) NOT NULL,
seat_number VARCHAR(10) NOT NULL,
status ENUM('AVAILABLE','BOOKED','CHECKED_IN') DEFAULT 'AVAILABLE',
price DECIMAL(10,2) NOT NULL,
FOREIGN KEY (flight_id) REFERENCES flight(flight_id)
);
注意:实际开发中需要建立完整的关联关系,包括用户表、订单表等,并考虑添加适当的索引优化查询性能。
3. 核心功能实现详解
3.1 航班查询模块实现
Struts2 Action示例代码:
java复制public class FlightAction extends ActionSupport {
private String departureCity;
private String arrivalCity;
private Date departureDate;
private List<Flight> flightList;
@Autowired
private FlightService flightService;
public String execute() {
flightList = flightService.searchFlights(
departureCity,
arrivalCity,
departureDate
);
return SUCCESS;
}
// getters and setters
}
对应的struts.xml配置:
xml复制<action name="searchFlight" class="flightAction">
<result name="success">/flightList.jsp</result>
<result name="input">/searchForm.jsp</result>
</action>
3.2 事务管理配置
Spring的声明式事务管理配置示例:
xml复制<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="bookTicket" propagation="REQUIRED"/>
<tx:method name="cancelBooking" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
4. 系统安全与性能优化
4.1 安全防护措施
- XSS防护:在Struts2中配置拦截器
xml复制<interceptor-ref name="defaultStack">
<param name="staticParams.excludeParams">dojo\..*</param>
</interceptor-ref>
<interceptor-ref name="validation"/>
<interceptor-ref name="token"/>
- SQL注入防护:使用Hibernate参数化查询
java复制Query query = session.createQuery(
"FROM Flight WHERE departureCity = :city AND departureTime > :time"
);
query.setParameter("city", departureCity);
query.setParameter("time", new Date());
- 会话安全:配置Spring Security
xml复制<http auto-config="true">
<intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
<form-login login-page="/login.jsp"/>
</http>
4.2 性能优化方案
- 二级缓存配置:在hibernate.cfg.xml中
xml复制<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
- 连接池配置(使用C3P0):
xml复制<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="maxPoolSize" value="50"/>
<property name="minPoolSize" value="5"/>
<property name="acquireIncrement" value="5"/>
</bean>
5. 毕业设计文档规范
5.1 LW文档结构建议
- 封面:包含题目、姓名、学号、指导教师等信息
- 摘要:300字左右,说明系统功能和实现技术
- 目录:自动生成,包含章节和页码
- 正文:
- 系统需求分析
- 系统设计(架构设计、数据库设计)
- 系统实现(核心模块代码分析)
- 系统测试(测试用例与结果)
- 参考文献:按标准格式列出参考的书籍和资料
- 致谢:简要说明获得的帮助
5.2 源码组织规范
推荐的项目目录结构:
code复制/src
/main
/java # Java源代码
/com
/airline
/action # Struts2 Action类
/service # Spring服务层
/dao # 数据访问层
/model # 实体类
/resources # 配置文件
struts.xml
applicationContext.xml
hibernate.cfg.xml
/webapp # Web资源
/WEB-INF
web.xml
/css
/js
/test # 测试代码
6. 开发环境搭建指南
6.1 基础环境配置
- JDK:推荐JDK 1.8(与框架兼容性最佳)
- IDE:Eclipse或IntelliJ IDEA(需安装Spring插件)
- 服务器:Tomcat 8.5.x
- 数据库:MySQL 5.7或MariaDB 10.3
6.2 Maven依赖配置
pom.xml关键依赖示例:
xml复制<dependencies>
<!-- Struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.26</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.30.RELEASE</version>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.15.Final</version>
</dependency>
</dependencies>
7. 常见问题解决方案
7.1 框架整合问题
问题1:Spring无法注入Struts2 Action的依赖
- 解决方案:确保在struts.xml中配置了Spring插件
xml复制<constant name="struts.objectFactory" value="spring"/>
问题2:Hibernate延迟加载异常
- 解决方案:在Spring配置中启用OpenSessionInViewFilter
xml复制<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter
</filter-class>
</filter>
7.2 业务逻辑难点
机票超卖控制:
java复制@Transactional
public synchronized boolean bookTicket(String flightId, String seatNumber) {
Ticket ticket = ticketDao.getTicket(flightId, seatNumber);
if(ticket.getStatus().equals("AVAILABLE")) {
ticket.setStatus("BOOKED");
ticketDao.update(ticket);
return true;
}
return false;
}
并发冲突处理:
- 使用数据库乐观锁(@Version注解)
- 或采用Redis分布式锁(适用于集群环境)
8. 扩展功能建议
- 微信小程序端:使用RESTful API与后端交互
- 大数据分析:集成Spark进行客流分析
- 微服务改造:将系统拆分为航班服务、订单服务等
- Docker部署:容器化部署方案
- CI/CD流程:Jenkins自动化构建与部署
我在实际开发中发现,机票价格动态计算模块最容易出现性能瓶颈,建议采用预计算+缓存的策略。例如提前计算好未来30天各航班的基准价格,运行时只需根据剩余座位数进行小幅调整,这样可以大幅减少实时计算压力。
