SSM老项目实战:JSP银行叫号系统源码环境搭建与避坑指南

发布时间:2026/9/23 10:16:13
SSM老项目实战:JSP银行叫号系统源码环境搭建与避坑指南 简介这是一套面向Java Web初学者与课程设计需求的银行排队叫号系统完整项目采用SSM框架搭配JSP技术实现运行于JDK1.8与Tomcat7环境数据库使用MySQL 5.7。项目涵盖取号、叫号、窗口管理与业务统计等典型银行场景模块适合作为毕业设计、课程实训或SSM入门练手参考。压缩包共856个文件约29.65MB其中包含87个Java源文件、49个JSP页面、217个JavaScript脚本与97个CSS样式文件另有大量png、gif、jpg等界面素材及xml、properties、sql等配置与建库脚本并附一份演示视频便于直观了解系统运行效果。目前已有464人学习下载。读者可获得完整可导入Eclipse或IDEA的工程源码、数据库脚本与操作录屏对照目录结构快速理解SSM分层设计与前后端交互流程节省从零搭建的时间成本。1. 从一份 JSP 银行叫号系统源码说起SSM 老项目还能不能跑起来银行大厅里那套“请 A003 号到 2 号窗口”的排队叫号逻辑落到代码层面其实是一套典型的状态机加队列调度。这份基于 JSPM 的银行排队叫号系统源码用的是 SSMSpring SpringMVC MyBatis加 JSP 这套组合JDK 1.8、Tomcat 7、MySQL 5.7开发工具覆盖 Eclipse、MyEclipse、IDEAMaven 3.3.9 管依赖。它解决的是“取号—排队—叫号—业务办理—统计”这条完整链路适合拿来做 Java 课程设计、毕业设计或者想补一段 SSM 整合实战经验的开发者。演示视频能让你先看效果再决定要不要动手源码包里还带着.classpath、.project这类 Eclipse 工程文件说明它原本就是在 Eclipse 系里跑通的。我拿到这类老项目的第一反应不是急着导入而是先确认环境版本能不能对上——这一步翻车的人太多了。2. 环境对齐与工程导入JDK、Tomcat、MySQL 三个版本锁死2.1 为什么 JDK 1.8 和 MySQL 5.7 不能随便换SSM 这套技术栈对版本相当敏感。JDK 1.8 是分水岭往上到 9 之后模块化改动会让老式javax.servlet依赖出问题往下 1.7 又缺一些语法糖。MySQL 5.7 这个点更关键5.7 和 8.0 的驱动类名、连接串参数、认证插件都不一样。5.7 用com.mysql.jdbc.Driver8.0 换成com.mysql.cj.jdbc.Driver连接串还得加serverTimezone。这份源码的pom.xml里锁的驱动版本大概率是 5.1.x你硬上 MySQL 8.0启动就报Unknown system variable query_cache_size或者时区错误。Tomcat 7 对应 Servlet 3.0 规范Tomcat 9 是 4.0JSP 编译行为有差异老项目在 Tomcat 9 上跑经常出现ClassNotFoundException或者 JSTL 标签不解析。我一般会先把这三个版本在本地备好用独立的目录管理不跟系统默认环境混。JDK 装完配JAVA_HOMETomcat 解压即用MySQL 5.7 建议用绿色版或者 Docker 起一个避免跟本机已有的 8.0 冲突。2.2 Eclipse 导入与 Maven 依赖拉取源码包里有.classpath、.project、org.eclipse.wst.common.component这些文件说明它是标准 Eclipse 动态 Web 工程结构。用 IDEA 导入也能跑但需要手动转成 Maven 工程或者配 Artifact。我习惯先用 Eclipse 走一遍确认能跑通再考虑迁移。# 确认 JDK 版本必须是 1.8 java -version # 输出应为 java version 1.8.0_xxx # 确认 Maven 版本 mvn -version # 输出应为 Apache Maven 3.3.9导入步骤Eclipse 里File - Import - Existing Maven Projects选中源码根目录等 Maven 把pom.xml里的依赖拉完。如果拉取慢在settings.xml里配国内镜像。拉完后右键项目Maven - Update Project勾上Force Update。!-- pom.xml 里需要重点确认的依赖版本 -- properties spring.version4.x.x/spring.version mybatis.version3.x.x/mybatis.version mysql.connector.version5.1.x/mysql.connector.version /properties这里spring.version和mybatis.version不用改但mysql.connector.version要跟你本地 MySQL 对上。如果本地是 5.75.1.x 驱动没问题如果非要用 8.0驱动换成8.0.x并改连接串。2.3 数据库建库与连接配置数据库这块先建库再导表。源码里一般有个.sql文件用 Navicat 11 导入最省事。-- 建库字符集用 utf8别用 utf8mb4老驱动可能不认 CREATE DATABASE bank_queue DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; -- 导入表结构后确认关键表 -- 取号记录表、窗口表、用户表、叫号日志表 SHOW TABLES;连接配置在jdbc.properties或者applicationContext.xml里重点看这几项jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/bank_queue?useUnicodetruecharacterEncodingutf8 jdbc.usernameroot jdbc.password你的密码characterEncodingutf8不能省否则中文叫号信息会乱码。useUnicodetrue配合它一起用。如果连接报Access denied检查 MySQL 用户权限报Public Key Retrieval is not allowed那是 8.0 的问题5.7 不会遇到。提示导入 SQL 前先确认sql_mode没有开ONLY_FULL_GROUP_BY老项目里的统计查询经常写不规范的 GROUP BY开了这个模式直接报错。3. 叫号核心逻辑拆解队列、状态机与 JSP 页面交互3.1 取号与排队的数据结构叫号系统的核心是一张排队表字段大致是id、queue_number、status、window_id、create_time、call_time。status用数字表示状态0 等待、1 已叫号、2 办理中、3 已完成、4 过号。取号时插入一条 status0 的记录叫号时按create_time升序取第一条 status0 的更新为 1 并绑定窗口。// QueueServiceImpl.java 取号逻辑 public String takeNumber() { // 生成号码格式 A 三位序号 String maxNum queueMapper.selectMaxNumber(); int next (maxNum null) ? 1 : Integer.parseInt(maxNum.substring(1)) 1; String number A String.format(%03d, next); Queue queue new Queue(); queue.setQueueNumber(number); queue.setStatus(0); queue.setCreateTime(new Date()); queueMapper.insert(queue); return number; }selectMaxNumber里用的是MAX(queue_number)注意这里有个坑号码到 A999 之后substring(1)转 int 会溢出实际项目里得做进位处理。课程设计级别够用但你要知道边界在哪。3.2 叫号与窗口绑定的状态流转叫号动作由窗口操作员触发逻辑是查当前窗口有没有正在办理的没有就从等待队列取一个更新状态和窗口 ID。// callNext 叫号逻辑 public Queue callNext(Integer windowId) { // 先检查该窗口是否有未完成的业务 Queue current queueMapper.selectByWindowAndStatus(windowId, 2); if (current ! null) { throw new RuntimeException(当前窗口还有未完成的业务); } // 取等待队列第一条 Queue next queueMapper.selectFirstWaiting(); if (next null) { return null; // 无人等待 } next.setStatus(1); next.setWindowId(windowId); next.setCallTime(new Date()); queueMapper.updateById(next); return next; }selectFirstWaiting的 SQL 是SELECT * FROM queue WHERE status 0 ORDER BY create_time ASC LIMIT 1。这里并发下会有问题两个窗口同时叫号可能取到同一条。课程设计不考并发但真实场景得加行锁或者用UPDATE ... WHERE status 0 LIMIT 1的原子操作。3.3 JSP 页面与后端的数据传递JSP 在这套系统里承担展示层用 JSTL 标签遍历队列数据。index.jsp是取号页window.jsp是窗口叫号页display.jsp是大屏展示页。!-- display.jsp 大屏展示当前叫号 -- % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % div classcurrent-number c:if test${not empty currentQueue} span请 ${currentQueue.queueNumber} 号到 ${currentQueue.windowId} 号窗口/span /c:if /div页面上的bootstrap.min.css、style.css、ueditor.css这些静态资源放在webapp/static或者webapp/css下路径别搞错。JSP 里引用静态资源建议用${pageContext.request.contextPath}拼前缀不然部署到 Tomcat 带上下文路径时 404。link relstylesheet href${pageContext.request.contextPath}/css/bootstrap.min.csstopNav.jsp.bak、index.jsp.bak这些.bak文件是备份不影响运行但说明作者改过导航和首页你可以对比.bak和正式文件看改了什么。4. 避坑排查老 SSM 项目最容易翻车的五个地方4.1 启动报 ClassNotFoundException: javax.servlet.jsp.jstl.core.Config现象Tomcat 启动后访问 JSP 页面后台抛ClassNotFoundException指向 JSTL 相关类。原因JSTL 依赖没打进WEB-INF/lib或者 Maven 里jstl的 scope 写成了providedTomcat 自身不带 JSTL。解决在pom.xml里确认jstl和standard两个依赖都是compilescope然后Maven - Update Project检查WEB-INF/lib下有没有jstl-1.2.jar和standard-1.1.2.jar。4.2 中文乱码取号显示问号现象取号后页面显示A001正常但窗口名称、业务类型显示成???。原因数据库连接串缺characterEncodingutf8或者 JSP 页面pageEncoding没设对。解决连接串补上useUnicodetruecharacterEncodingutf8JSP 头部加% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %Tomcat 的server.xml里 Connector 加URIEncodingUTF-8。4.3 Maven 依赖下载失败或版本冲突现象mvn clean install报Could not resolve dependencies或者启动时NoSuchMethodError。原因本地仓库有旧版本缓存或者pom.xml里 Spring 各模块版本不一致。解决删掉本地仓库里对应的org/springframework目录重新拉确认spring-core、spring-web、spring-webmvc版本号完全一致必要时在pom.xml里用dependencyManagement统一锁版本。4.4 Tomcat 7 部署后 404现象项目在 Eclipse 里启动正常但打成 war 丢到 Tomcat 7 的webapps下访问 404。原因web.xml里servlet-mapping的 url-pattern 跟访问路径不匹配或者 SpringMVC 的DispatcherServlet拦截了静态资源。解决检查web.xml里DispatcherServlet的url-pattern如果是/需要在spring-mvc.xml里加mvc:default-servlet-handler/放行静态资源确认访问路径带上了项目名。4.5 数据库连接池报连接泄漏现象跑一段时间后报Cannot get a connection, pool exhausted。原因老项目里手动getConnection没close或者 MyBatis 的SqlSession没关。解决确认用的是 Spring 管理的DataSource而不是自己DriverManager.getConnectionService 层加Transactional让 Spring 管事务和连接释放检查有没有在循环里反复开SqlSession。注意.classpath和.project文件里的路径是作者机器的绝对路径导入后如果报 “Project cannot be built”右键项目Build Path - Configure Build Path把 JRE 和 Tomcat 库重新指到你本地的。5. 二次开发与验证从能跑到能改的进阶路径把项目跑起来只是第一步真正有价值的是你能在它基础上改出东西。我一般会先做一轮功能验证确认叫号、过号、完成这三个状态流转没问题再动代码。验证方法很直接开两个浏览器窗口一个当取号机一个当窗口叫号端。取三个号窗口端连续叫号观察大屏展示是否同步更新。然后测过号逻辑——叫号后不点“完成”直接叫下一个看前一个号是否变成过号状态。这一步能暴露状态机写得对不对。// 过号逻辑通常由定时任务或手动触发 public void markPassed(Integer queueId) { Queue q queueMapper.selectById(queueId); if (q ! null q.getStatus() 1) { q.setStatus(4); // 过号 queueMapper.updateById(q); } }二次开发方向我建议从这几个点切入一是把叫号逻辑改成支持多业务类型比如个人业务和对公业务分队列这需要改queue表加business_type字段改selectFirstWaiting加类型过滤二是加一个简单的统计页面按窗口统计办理量用 MyBatis 的聚合查询就能做三是把 JSP 换成 Thymeleaf 或者前后端分离但这属于大改课程设计没必要。改代码前先备份.bak文件就是前车之鉴。我吃过亏——有次直接改applicationContext.xml的事务配置改完没备份项目起不来又回不去只能重新解压源码。从那以后我每次动配置文件前都强制走一遍cp xxx.xml xxx.xml.bak这个习惯救过我好几次。数据库改动记得同步更新 SQL 脚本别只改本地库忘了导出。用 Navicat 的话改完表结构右键“转储 SQL 文件”把新的建表语句存一份下次换机器直接导入。这套源码的价值不在于它多完美而在于它完整、能跑、结构清晰适合拿来拆解 SSM 的整合套路。你把它跑通一遍再改一两个功能对 SpringMVC 的请求流转、MyBatis 的映射配置、JSP 的标签使用就会有实感。希望帮到你。本文还有配套的精品资源点击获取