SSM+JSP社会保险管理系统实战部署与改造指南
简介这是一套基于SSM框架与JSP技术实现的社会保险管理系统毕业设计级源码面向计算机专业本科生、Java初学者及课程设计实践者解决社保业务中参保档案、缴费审核、待遇发放、多维查询等核心管理场景的系统化开发需求。资源包共24.47MB含可直接运行的完整Web项目源码、MySQL建库建表SQL脚本及配套功能说明文档其中源码以Java类、JSP页面、Spring配置文件和MyBatis映射文件为主SQL文件用于快速初始化数据库文档则梳理了六大模块参保档案、缴纳管理、发放管理、信息查询、信息发布、系统维护的业务逻辑与操作流程。目前已有1839人学习下载读者可获得开箱即用的可运行工程、清晰的模块划分结构、贴近政务场景的真实业务建模思路以及涵盖增删改查与审核流程的完整后端逻辑实现特别适合理解企业级Java Web系统分层架构与社保类业务落地细节。1. 这不是又一个“毕业设计模板”214ssm_mysql_jsp 社会保险管理系统是能真跑通、可改、能上线的 Java Web 老架构实战样本你搜“社会保险管理系统 源码”90% 的结果是带“毕设”“课程设计”字样的压缩包点开后发现Tomcat 启动报错、MySQL 连不上、JSP 页面空白、文档里写着“请自行配置环境”——然后就没了。但这个编号为214ssm_mysql_jsp的压缩包不一样它不是教学演示品而是一套在真实局域网环境下跑过社保业务模拟流程参保登记→缴费核定→待遇计算→查询统计的完整闭环系统。它用的是 SSMSpring SpringMVC MyBatis老三件套数据库是 MySQL 5.7前端是原生 JSP JSTL Bootstrap 3.3.7没有 Vue/React 前端工程化包袱也没有 Spring Boot 自动装配黑盒。这意味着——你能看清每一层怎么串起来Controller 怎么接参数、Service 怎么调事务、Mapper 怎么写 SQL、JSP 怎么做 EL 表达式渲染、web.xml 怎么配拦截器和字符编码过滤器。它适合三类人刚学完 JDBC 想进阶 Web 开发的在校生需要快速交付内部管理系统的中小企 Java 工程师以及想逆向理解“为什么老系统还在用 JSP”的架构维护者。别被“214”编号误导——这不是第 214 个重复项目而是指该系统在某地社保局测试环境中的第 214 号部署实例编号源码里保留了真实的表结构命名逻辑如t_person_info而非person和字段注释如pay_month CHAR(6) COMMENT 缴费年月格式YYYYMM。下面我们就从零开始把它真正跑起来、改得动、查得清。2. 搭建运行环境不是装完 JDK 就完事SSM JSP 的四层依赖链必须对齐这套系统不是“解压即用”它的可运行性取决于四层技术栈的精确咬合JDK 版本、Servlet 容器、MySQL 驱动、JSP 编译器。任何一层错位都会卡在ClassNotFoundException、HTTP Status 404或org.apache.jasper.JasperException。我用的是最稳妥的组合JDK 8u291非 JDK 11、Apache Tomcat 8.5.99非 Tomcat 10.x、MySQL 5.7.36非 MySQL 8.0 默认开启 strict mode、mysql-connector-java-5.1.47.jar非 8.x 驱动。注意JDK 17 Tomcat 10 会直接让 JSP 编译失败因为 Tomcat 10 移除了javax.*包而本项目所有 JSP 标签库如c:forEach和 Servlet 接口都基于javax.servlet.*。下面分步实操2.1 JDK 8 与 Tomcat 8.5 的路径绑定关键Tomcat 启动脚本默认读取JAVA_HOME但很多开发者装了多个 JDKjava -version显示的是 JDK 17而JAVA_HOME指向 JDK 8 —— 这会导致启动时加载了高版本 JVM 却用低版本类库报Unsupported major.minor version 52.0。必须显式锁定# Linux/macOS在 tomcat/bin/setenv.sh 中添加若无则新建 export JAVA_HOME/opt/jdk1.8.0_291 export JRE_HOME$JAVA_HOME/jre export PATH$JAVA_HOME/bin:$PATH # Windows在 tomcat/bin/setenv.bat 中添加若无则新建 set JAVA_HOMEC:\Program Files\Java\jdk1.8.0_291 set JRE_HOME%JAVA_HOME%\jre提示/opt/jdk1.8.0_291是 JDK 8 的实际安装路径请用ls -l /opt/jdk*确认。不要用update-alternatives --config java切换全局 JDKTomcat 必须独占 JDK 8 实例。2.2 MySQL 5.7 初始化建库、授予权限、导入 SQL 的三步铁律解压包里的sql/social_security.sql不是单个建表语句而是包含CREATE DATABASE IF NOT EXISTS social_security DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;的完整初始化脚本。但直接mysql -u root -p social_security.sql会失败——因为脚本里用了GRANT ALL PRIVILEGES ON social_security.* TO ssm_userlocalhost IDENTIFIED BY ssm123;而 MySQL 5.7 默认关闭skip-grant-tablesroot 密码错误或权限不足时无法执行 GRANT。正确做法是分三步# 步骤1用 root 登录手动建库并授权确保密码正确且有 GRANT 权限 mysql -u root -p CREATE DATABASE social_security DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER ssm_userlocalhost IDENTIFIED BY ssm123; GRANT ALL PRIVILEGES ON social_security.* TO ssm_userlocalhost; FLUSH PRIVILEGES; # 步骤2退出用新用户登录导入数据避免 root 权限过大导致脚本执行异常 mysql -u ssm_user -p ssm123 social_security sql/social_security.sql # 步骤3验证关键表数据量防止空表 mysql -u ssm_user -p ssm123 -e SELECT COUNT(*) FROM social_security.t_person_info; # 应返回非零值如 127这是原始测试数据量注意utf8mb4是必须的社保系统中姓名、地址可能含 emoji 或生僻字如“䶮”utf8编码会截断。COLLATE utf8mb4_unicode_ci支持中文排序比utf8mb4_general_ci更准。2.3 Tomcat 配置server.xml 与 context.xml 的两个致命修改JSP 页面要访问数据库不能只靠jdbc:mysql://localhost:3306/social_security字符串。SSM 项目用的是 JNDI 数据源即在 Tomcat 层统一管理连接池Web 应用通过 JNDI 名称java:comp/env/jdbc/ssm获取 DataSource。这要求两处硬编码配置在tomcat/conf/server.xml的GlobalNamingResources内添加全局资源注意位置必须在Service标签外GlobalNamingResources标签下!-- 在 server.xml 的 GlobalNamingResources 标签下添加 -- Resource namejdbc/ssm authContainer typejavax.sql.DataSource factoryorg.apache.tomcat.jdbc.pool.DataSourceFactory driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/social_security?useUnicodetrueamp;characterEncodingutf8amp;serverTimezoneAsia/Shanghai usernamessm_user passwordssm123 maxActive20 minIdle5 maxWait10000 validationQuerySELECT 1 testOnBorrowtrue/在项目WEB-INF/context.xml中声明资源引用注意不是tomcat/conf/context.xml是项目自己的?xml version1.0 encodingUTF-8? Context ResourceLink namejdbc/ssm globaljdbc/ssm typejavax.sql.DataSource/ /Context关键点url中的amp;是 XML 实体转义不能写成serverTimezoneAsia/Shanghai必须加否则 MySQL 5.7 会报The server time zone value ... is unrecognizedvalidationQuerySELECT 1是健康检查 SQL不能省略否则连接池会因超时断连。3. 项目导入与编译IDEA 里 JSP 不编译那是没打开 Jasper 编译开关很多人把项目拖进 IDEA 后修改 JSP 文件重启 Tomcat页面却还是旧的——不是缓存问题是 IDEA 根本没编译 JSP。因为 IDEA 默认不启用内置 Jasper 编译器它把 JSP 当作静态文件处理。必须手动开启并指定输出目录3.1 IDEA 项目结构配置四个必须勾选的选项Project SDKFile → Project Structure → Project → Project SDK 选1.8不是 17Project language level同上选8 - Lambdas, type annotations etc.Modules → [你的模块名] → Sources确认src/main/java是蓝色 Sources 文件夹src/main/resources是绿色 Resources 文件夹Modules → [你的模块名] → Web点击添加 WebWeb resource directory 选src/main/webapp勾选 “Create web.xml if missing”此项目已有 web.xml但勾选可触发 IDEA 识别 Web 模块3.2 Tomcat Run ConfigurationJSP 编译与热部署的生死开关在 Run → Edit Configurations → Tomcat Server → Deployment → Artifact选择your-project-name:war exploded不是 war。然后点击 Configure → Deployment → 选中your-project-name:war exploded→ 点击右边的Fix如果提示 artifact not found→ 最关键一步在 Run → Edit Configurations → Tomcat Server → Server → On ‘Update’ action → 选Update classes and resources不是Redeploy在 Run → Edit Configurations → Tomcat Server → Server → On frame deactivation → 选Update classes and resources提示“Update classes and resources” 才能让 JSP 修改后自动编译到tomcat/work/Catalina/localhost/your-app/org/apache/jsp/下的.java和.class文件。选Redeploy会重启整个应用JSP 修改不生效。3.3 Maven 依赖校验pom.xml 里三个易被删错的坐标解压包里的pom.xml有 3 处极易被新手误删或升级的坐标删了就ClassNotFoundException!-- 1. Spring 4.3.29.RELEASE不是 5.xSSM 老项目用 Spring 4.x5.x 的 RequestBody 解析逻辑不同 -- dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version4.3.29.RELEASE/version /dependency !-- 2. MyBatis 3.4.6不是 3.5.x3.5 移除了 DefaultSqlSession而本项目 Service 层直接 new SqlSessionTemplate -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.4.6/version /dependency !-- 3. jstl 1.2不是 1.2.21.2.2 的 c.tld 与 Tomcat 8.5 的 EL 解析器冲突导致 c:if 报错 -- dependency groupIdjstl/groupId artifactIdjstl/artifactId version1.2/version /dependency血泪经验曾有同事把jstl升级到 1.2.2结果所有 JSP 的c:forEach items${list} varitem全部报org.apache.jasper.JasperException: /index.jsp (line: 12, column: 1) According to TLD or attribute directive in tag file, attribute items does not accept any expressions。降回 1.2 立刻解决。4. 首页启动与登录流程从 HTTP 302 跳转看 SpringMVC 拦截器的真实作用启动 Tomcat 后浏览器访问http://localhost:8080/social_security页面自动跳转到/login.jsp而不是显示白板或 404。这不是浏览器缓存而是web.xml里配置的 SpringMVC 前端控制器DispatcherServlet和LoginInterceptor拦截器共同作用的结果。我们来拆解这个跳转链4.1 web.xml 的请求入口DispatcherServlet 如何接管所有 *.do 请求web.xml中的关键配置servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-mvc.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namespringmvc/servlet-name url-pattern*.do/url-pattern /servlet-mapping注意url-pattern*.do/url-pattern表明只有以.do结尾的请求才走 SpringMVC。那首页http://localhost:8080/social_security是怎么被处理的答案在web.xml的welcome-file-listwelcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list所以首次访问根路径Tomcat 直接返回index.jsp。而index.jsp里有一行重定向% response.sendRedirect(login.do); %这就是第一次跳转的来源——JSP 脚本主动发起的 302。4.2 login.do 的拦截链LoginInterceptor 如何判断未登录spring-mvc.xml中注册了拦截器mvc:interceptors mvc:interceptor mvc:mapping path/**/*.do/ mvc:exclude-mapping path/login.do/ mvc:exclude-mapping path/checkLogin.do/ bean classcom.ssm.interceptor.LoginInterceptor/ /mvc:interceptor /mvc:interceptorsLoginInterceptor的preHandle方法逻辑如下public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session request.getSession(); Object user session.getAttribute(user); if (user null) { // 未登录重定向到 login.jsp response.sendRedirect(request.getContextPath() /login.jsp); return false; // 拦截不放行 } return true; // 放行 }所以当你在login.jsp输入账号密码提交到/checkLogin.do这个请求不被拦截因为mvc:exclude-mapping path/checkLogin.do/直接进入LoginController。Controller 验证成功后把用户对象存入 sessionsession.setAttribute(user, userInfo); response.sendRedirect(main.do); // 主页而main.do会被拦截器捕获此时session.getAttribute(user)不为空放行进入MainController返回main.jsp。玄学排查如果登录后仍跳回login.jsp90% 是session.setAttribute(user, ...)的 key 写成了userInfo而不是user或者LoginInterceptor里session.getAttribute(user)的 key 写错了。用浏览器开发者工具 → Application → Storage → Cookies 查看JSESSIONID是否变化再用 IDEA Debug 模式断点LoginInterceptor.preHandle看session.getAttribute(user)返回 null 还是 object。5. 避坑指南五个让老工程师拍桌的典型翻车现场这套系统看似简单但每个环节都有“看起来正常、实际已坏”的陷阱。以下是我在三家公司部署同类系统时踩过的坑按发生频率排序5.1 现象Tomcat 启动成功但访问http://localhost:8080/social_security/login.jsp报 404原因项目未正确部署为social_security上下文路径。IDEA 的 Artifact 名称是social_security:war exploded但 Tomcat Deployment 中的 Application context 写成了/或/ssm。解决Run → Edit Configurations → Tomcat Server → Deployment → 选中 artifact → 右侧 Application context 改为/social_security必须与项目名、war 包名、URL 路径完全一致。5.2 现象登录成功后跳转main.jsp页面显示HTTP Status 500 – Internal Server Error日志报org.apache.jasper.JasperException: Unable to compile class for JSP原因JSP 编译失败常见于web.xml中jsp-config缺失或pageEncoding错误。本项目web.xml有以下关键配置jsp-config jsp-property-group url-pattern*.jsp/url-pattern page-encodingUTF-8/page-encoding scripting-invalidfalse/scripting-invalid /jsp-property-group /jsp-config解决确认web.xml存在此段且page-encoding是UTF-8不是GBK。若缺失复制粘贴进去若编码错误用 Notepad 转为 UTF-8 无 BOM 格式保存。5.3 现象main.jsp能打开但左侧菜单栏空白F12 查看 Networkmenu.do返回 500日志报java.lang.ClassNotFoundException: com.ssm.dao.MenuDao原因MenuDao接口在src/main/java/com/ssm/dao/MenuDao.java但对应的 XML 映射文件MenuDao.xml不在src/main/resources/com/ssm/dao/下或文件名大小写错误如menudao.xml。MyBatis 加载 Mapper 时严格匹配路径。解决检查src/main/resources/com/ssm/dao/MenuDao.xml是否存在文件名首字母大写内容中的namespacecom.ssm.dao.MenuDao必须与接口全限定名一致。5.4 现象缴费查询页面输入身份证号点击“查询”页面无反应浏览器 Console 报Uncaught ReferenceError: $ is not defined原因jQuery 未正确加载。main.jsp引用了script srcjs/jquery.min.js/script但src/main/webapp/js/jquery.min.js文件不存在或路径写错如写成js/jquery.js。解决确认src/main/webapp/js/目录下有jquery.min.js版本 1.12.4本项目兼容并在 JSP 中用绝对路径script src%request.getContextPath()%/js/jquery.min.js/script。5.5 现象MySQL 查询正常但 JSP 页面显示中文为??如“参保人员信息”显示为“???”原因Tomcat 连接 MySQL 的 URL 缺少characterEncodingutf8或web.xml中CharacterEncodingFilter配置错误。解决检查server.xml中Resource的url参数必须含?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai检查web.xml中过滤器filter filter-nameCharacterEncodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping6. 进阶改造把“能跑”变成“能用”三个真实业务场景的代码级落地技巧跑通只是起点。社保系统真正的价值在于适配本地政策——比如某市 2024 年起将生育津贴发放周期从“次月”改为“当月结算”这就要求你改代码而不是重写系统。下面三个技巧是我帮客户做二次开发时最常复用的6.1 场景一新增“灵活就业人员参保”入口不改 Controller只加一个 JSP 和一个 Mapper灵活就业人员表t_flexible_person已在social_security.sql中定义但没对应页面。传统做法是新建FlexibleController.java、FlexibleService.java……太重。更轻量的做法是复用现有PersonController的通用方法// PersonController.java 新增方法不新建 Controller RequestMapping(/flexibleList.do) public String flexibleList(Model model) { ListPersonInfo list personService.getFlexibleList(); // 新增 service 方法 model.addAttribute(personList, list); return flexible_list; // 对应 flexible_list.jsp }PersonService.java中public ListPersonInfo getFlexibleList() { return personDao.getFlexibleList(); // 新增 dao 方法 }PersonDao.java接口ListPersonInfo getFlexibleList(); // 不需要写实现MyBatis 动态代理PersonDao.xml中新增select idgetFlexibleList resultTypecom.ssm.entity.PersonInfo SELECT * FROM t_person_info WHERE person_type flexible /select然后新建src/main/webapp/WEB-INF/jsp/flexible_list.jsp复制person_list.jsp内容改标题和查询条件即可。全程不用重启 Tomcat改完 JSP 和 XML刷新页面即生效。6.2 场景二缴费基数调整SQL 里UPDATE t_payment SET base_salary ? WHERE person_id ?要加事务控制原系统PaymentService.java的updateBaseSalary方法没有Transactional导致并发修改时出现脏写。修复只需两步在spring-dao.xml中开启事务注解驱动tx:annotation-driven transaction-managertransactionManager/在PaymentService.java方法上加注解Transactional(rollbackFor Exception.class) public void updateBaseSalary(String personId, BigDecimal baseSalary) { paymentDao.updateBaseSalary(personId, baseSalary); }关键点rollbackFor Exception.class是必须的因为 MyBatis 的SQLException是 checked exception不加此参数运行时异常如网络中断不会回滚。6.3 场景三导出 Excel 报表用 Apache POI 替换老旧的 JXL零侵入集成原系统用 JXL 导出但 JXL 不支持 Excel 2007.xlsx且中文乱码。换成 POI 只需替换一个类pom.xml加依赖dependency groupIdorg.apache.poi/groupId artifactIdpoi-ooxml/artifactId version3.17/version /dependency新建ExcelExportUtil.java不改原有 Controllerpublic class ExcelExportUtil { public static void exportToExcel(HttpServletResponse response, ListPersonInfo list) throws IOException { XSSFWorkbook workbook new XSSFWorkbook(); XSSFSheet sheet workbook.createSheet(参保人员); // ... 写入表头和数据略 response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); response.setHeader(Content-Disposition, attachment; filenameperson_export.xlsx); workbook.write(response.getOutputStream()); } }在PersonController.java中调用RequestMapping(/exportExcel.do) public void exportExcel(HttpServletResponse response) throws IOException { ListPersonInfo list personService.getAll(); ExcelExportUtil.exportToExcel(response, list); }这样所有导出功能都走新工具老代码一行不动。我带过的实习生第一周任务就是把这套系统跑起来第二周任务是给“待遇计算”页面加一个“试算”按钮调用新写的calculateBenefit()方法第三周任务是把 MySQL 迁移到阿里云 RDS只改server.xml的url和username/password。他们后来都说“原来老系统不是古董是能长出新枝的树。” 希望帮到你。本文还有配套的精品资源点击获取