SSM框架零基础入门:IDEA2021搭建Java Web项目实战
简介这份源码资源面向Java Web初学者与需要巩固SSM整合流程的开发者解决从零搭建SpringSpringMVCMyBatis项目时环境配置繁琐、依赖版本易冲突的问题。资源基于IDEA2021、Tomcat9.0与MySQL8.0.25环境整理可直接导入运行适合课程设计、毕业设计或自学练手场景。压缩包共105个文件约22.34MB其中52个jar包提供框架与数据库驱动依赖28个xml文件承担Spring、SpringMVC及MyBatis的核心配置另有java源码、jsp页面、properties配置与class编译文件覆盖控制层、业务层、持久层及实体类的完整分层结构。目前已有3136人学习下载说明其整合思路具备一定参考价值。读者可借此理清SSM各层职责划分、配置文件加载顺序与依赖注入关系对照Book相关模块理解增删改查的调用链路并掌握IDEA下Tomcat部署与MySQL连接的排错方法为后续过渡到SpringBoot打下基础。1. 零基础也能搭SSM 框架到底是什么为什么值得你花一个周末搞懂如果你刚开始学 Java Web大概率听过“SSM”这个词然后被一堆缩写劝退。别慌我第一次接触的时候也这样。你可以把 SSM 想象成开一家小餐馆Spring 是店长负责统筹所有人和事Spring MVC 是前台负责接待客人、把菜单传到后厨MyBatis 是后厨的采购员专门负责跟仓库数据库打交道。三个角色各司其职合在一起就是一套能跑起来的 Web 应用骨架。这套源码就是带你从零把这三个角色请进 IDEA2021一步步搭出一个能运行的完整项目。适合刚学完 Java 基础、想动手做一个真实 Web 项目的新手不需要你懂框架原理跟着敲就行。2. 动手之前先想清楚为什么新手要从 SSM 搭起2.1 不搭一遍你永远不知道 Web 项目怎么跑起来很多新手学 Java 的路径是语法 → 集合 → 多线程 → 然后直接跳到 Spring Boot。中间缺了一环——一个请求从浏览器发出到数据库返回数据再渲染成页面这中间到底经过了哪些代码SSM 搭建的过程就是把这根链条一节一节接给你看。你会亲手配置 web.xml知道 DispatcherServlet 是怎么接管请求的你会写 spring-mybatis.xml明白数据库连接池是怎么被注入的你会写 Controller看到 RequestMapping 如何把 URL 映射到方法上。这些环节在 Spring Boot 里被自动配置藏起来了新手直接上手容易一头雾水。先搭一遍 SSM相当于把黑匣子拆开看了一遍后面再用 Spring Boot 就是“哦原来它帮我做了这些”。2.2 面试和课程设计里SSM 还是绕不开的硬通货你去翻翻招聘要求很多中小公司的 Java 岗位依然写着“熟悉 SSM 框架”。为什么因为大量存量项目还在用这套组合维护和二次开发都需要能看懂 XML 配置的人。另外高校的课程设计、毕业设计里SSM 出现的频率极高因为它的结构清晰、分层明确老师一眼就能看出你哪里写了业务逻辑、哪里写了数据库操作。你花一个周末把这份源码跑通改一改就能变成自己的课程设计底子。这不是让你停留在 SSM而是用它当跳板——先能跑通一个完整项目再去学 Spring Boot 的自动配置你会比直接上手的人理解深得多。2.3 这份源码解决的核心问题把散落的知识点串成一条线你单独学 Spring 的 IoC、单独学 MyBatis 的映射、单独学 Servlet 的请求处理每个都懂一点但合在一起就不知道怎么组织。这份源码的价值在于它给了一个可运行的最小完整结构pom.xml 里依赖怎么配、web.xml 里怎么注册前端控制器、applicationContext.xml 里怎么扫描包、mapper 文件放在哪里、jsp 页面怎么取数据。你照着搭一遍这些零散的知识点就自动归位了。而且 IDEA2021 这个版本对新手比较友好Maven 依赖下载和 Tomcat 配置都有图形化引导不容易在环境上卡死。3. 从零迈出第一步环境准备和项目骨架搭建3.1 先检查你电脑上有没有这三样东西在打开 IDEA 之前先确认三件事JDK 版本、Maven 版本、Tomcat 版本。这份源码基于 JDK 8 或 JDK 11 都可以跑建议用 JDK 8因为很多老项目的依赖对高版本 JDK 兼容性不好。Maven 用 3.6 以上IDEA2021 自带 Maven 也可以但建议自己装一个独立版本方便在命令行排查问题。Tomcat 用 8.5 或 9.0不要用 Tomcat 10因为 Tomcat 10 把 javax.servlet 包名改成了 jakarta.servlet这份源码里的 web.xml 和依赖还是旧的命名空间用 Tomcat 10 会直接报 404 或 ClassNotFound。检查方法很简单打开命令行输入java -version mvn -v如果 java -version 显示 1.8 开头mvn -v 显示 3.6 以上就基本没问题。Tomcat 不用命令行检查后面在 IDEA 里配置时再选路径。提示如果你电脑上装了多个 JDK一定要在 IDEA 的 Project Structure 里把 SDK 和 Language Level 都设成 8否则编译时可能报“无效的目标发行版”。3.2 用 IDEA2021 新建 Maven Web 项目打开 IDEA2021点击 File → New → Project左侧选 Maven勾选“Create from archetype”然后选org.apache.maven.archetypes:maven-archetype-webapp。这个模板会自动生成 webapp 目录和 web.xml省得你手动建。填好 GroupId 和 ArtifactId比如com.example和ssm-demo一路 Next 到 Finish。建好之后你会看到项目结构里有一个 src/main/webapp 目录里面有个 index.jsp 和 WEB-INF/web.xml。这时候项目还不能跑因为缺 Java 源码目录。右键 src/main新建 Directory命名为 java然后右键这个 java 目录Mark Directory as → Sources Root。同样在 src/main 下新建 resources 目录Mark Directory as → Resources Root。这两个目录分别放 Java 代码和配置文件是 Maven 的标准结构新手容易漏掉 resources 目录导致配置文件放错位置。3.3 在 pom.xml 里补上 SSM 需要的依赖打开 pom.xml在dependencies标签里加入 Spring、Spring MVC、MyBatis、数据库驱动、连接池、JSTL 等依赖。这里给一个最小可用的依赖清单版本号用稳定的不要追最新dependencies !-- Spring 核心 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version5.3.20/version /dependency !-- Spring MVC -- dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.3.20/version /dependency !-- MyBatis -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.9/version /dependency !-- MyBatis 与 Spring 整合 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.0.7/version /dependency !-- 数据库驱动这里以 MySQL 为例 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.29/version /dependency !-- 连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.9/version /dependency !-- JSTL 用于 JSP 页面 -- dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency !-- Servlet API作用域 provided -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency /dependencies加完之后点一下 IDEA 右上角的 Maven 刷新按钮等依赖下载完。如果下载慢可以在 Maven 的 settings.xml 里配一个国内镜像这里不展开。依赖报红是新手最常见的问题先检查 Maven 仓库路径和网络再检查版本号是否写错。注意javax.servlet-api的 scope 必须是 provided因为 Tomcat 运行时自带这个包如果你打成 compile 会导致冲突。4. 把三层配置串起来Spring、Spring MVC、MyBatis 各管什么4.1 web.xml整个 Web 项目的入口web.xml 放在 src/main/webapp/WEB-INF 下它是 Servlet 容器的配置文件。SSM 项目里web.xml 主要做两件事注册 Spring 的 ContextLoaderListener让 Spring 容器在 Web 应用启动时加载注册 Spring MVC 的 DispatcherServlet让它拦截所有请求。代码如下web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 !-- Spring 容器启动 -- context-param param-namecontextConfigLocation/param-name param-valueclasspath:applicationContext.xml/param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener !-- Spring MVC 前端控制器 -- servlet servlet-namedispatcher/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-namedispatcher/servlet-name url-pattern//url-pattern /servlet-mapping !-- 字符编码过滤器防止中文乱码 -- filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping /web-app这里的关键是contextConfigLocation指向的配置文件路径。classpath:表示从 resources 目录下找。ContextLoaderListener 加载的是父容器通常放 Service 和 Dao 的配置DispatcherServlet 加载的是子容器放 Controller 和视图解析器。两个容器是父子关系子容器能访问父容器的 Bean反过来不行。新手容易把两者搞混导致 Controller 里注入 Service 失败。4.2 applicationContext.xmlSpring 管 Service 和 Dao在 src/main/resources 下新建 applicationContext.xml内容如下beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd !-- 扫描 Service 层 -- context:component-scan base-packagecom.example.service/ !-- 加载数据库配置 -- context:property-placeholder locationclasspath:db.properties/ !-- 数据源 -- bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean !-- SqlSessionFactory -- bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property namemapperLocations valueclasspath:mapper/*.xml/ /bean !-- 扫描 Mapper 接口 -- bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.example.mapper/ /bean !-- 事务管理 -- bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean /beans这段配置做了四件事扫描 Service 包、读取数据库属性文件、创建 Druid 连接池、配置 MyBatis 的 SqlSessionFactory 和 Mapper 扫描。mapperLocations指向 resources/mapper 目录下的 XML 映射文件basePackage指向 Mapper 接口所在的包。新手常犯的错误是包名写错比如 Service 实际在com.example.service.impl下但只扫描了com.example.service导致 Bean 找不到。4.3 spring-mvc.xmlSpring MVC 管 Controller 和视图在 src/main/resources 下新建 spring-mvc.xmlbeans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:mvchttp://www.springframework.org/schema/mvc xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd !-- 只扫描 Controller -- context:component-scan base-packagecom.example.controller/ !-- 开启注解驱动 -- mvc:annotation-driven/ !-- 静态资源放行 -- mvc:default-servlet-handler/ !-- 视图解析器 -- bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/jsp// property namesuffix value.jsp/ /bean /beanscomponent-scan只扫描 Controller 包不要把 Service 也扫进来否则事务配置可能不生效。mvc:annotation-driven注册了处理 JSON、格式化日期等功能的默认组件。default-servlet-handler让静态资源css、js、图片不被 DispatcherServlet 拦截。视图解析器的 prefix 和 suffix 决定了 Controller 返回的字符串对应哪个 JSP 文件比如返回index就会找/WEB-INF/jsp/index.jsp。4.4 db.properties 和 MyBatis 映射文件在 resources 下新建 db.propertiesjdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/ssm_demo?useSSLfalseserverTimezoneUTCcharacterEncodingutf8 jdbc.usernameroot jdbc.password你的密码注意 MySQL 8 的驱动类是com.mysql.cj.jdbc.Driver不是旧的com.mysql.jdbc.Driver。URL 里加上serverTimezone和characterEncoding否则可能报时区错误或中文乱码。然后在 resources 下新建 mapper 目录放一个 UserMapper.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.mapper.UserMapper select idselectAll resultTypecom.example.entity.User SELECT * FROM user /select /mapper对应的 Mapper 接口放在com.example.mapper包下package com.example.mapper; import com.example.entity.User; import java.util.List; public interface UserMapper { ListUser selectAll(); }Service 层调用 MapperController 调用 Service这样三层就串起来了。新手写的时候注意 namespace 必须和接口全限定名一致id 必须和方法名一致否则启动时报“Invalid bound statement”。5. 避坑指南新手搭建 SSM 最容易翻车的五个地方5.1 启动报 404所有页面都找不到现象Tomcat 启动没报错但访问任何 URL 都是 404。 原因DispatcherServlet 的 url-pattern 配成了/*而不是/。/*会拦截 JSP 请求导致 JSP 也被当成 Controller 处理。 解决把 web.xml 里的url-pattern/*/url-pattern改成url-pattern//url-pattern。另外检查 Tomcat 的 Application context 是否设成了/如果设成了/ssm_demo访问时要加前缀。5.2 注入失败报 NoSuchBeanDefinitionException现象启动时提示找不到某个 Service 或 Mapper Bean。 原因包扫描路径没覆盖到或者 Mapper 接口没有和 XML 映射文件对应上。 解决检查 applicationContext.xml 里的base-package是否包含了 Service 实现类所在的包检查 MapperScannerConfigurer 的basePackage是否包含了 Mapper 接口所在的包检查 mapperLocations 的路径是否匹配 XML 文件的实际位置。5.3 中文乱码页面显示问号现象表单提交的中文在数据库里变成乱码或者页面显示乱码。 原因字符编码过滤器没配或者数据库连接 URL 没加 characterEncoding。 解决web.xml 里加上 CharacterEncodingFilter并设置 encoding 为 UTF-8db.properties 的 URL 里加上characterEncodingutf8JSP 页面顶部加上% page contentTypetext/html;charsetUTF-8 languagejava %。5.4 事务不生效插入数据后回滚失败现象Service 方法抛异常但数据库里的数据没有回滚。 原因Spring 的事务管理默认只对 RuntimeException 回滚如果抛的是 checked exception不会回滚另外如果 Service 类没有被 Spring 代理事务也不会生效。 解决在 Service 类或方法上加Transactional(rollbackFor Exception.class)确保 Service 类被 Spring 扫描到并且是通过接口注入的JDK 动态代理或者开启了 CGLIB 代理。5.5 Tomcat 启动慢或报内存溢出现象Tomcat 启动要很久或者直接报 OutOfMemoryError。 原因Maven 依赖重复或冲突或者 Tomcat 的 JVM 内存设置太小。 解决在 pom.xml 里用mvn dependency:tree检查冲突排除重复依赖在 IDEA 的 Tomcat 配置里VM options 加上-Xms512m -Xmx1024m如果项目不大检查是不是引入了不必要的依赖。6. 跑通之后下一步学什么从 SSM 到能写自己的业务6.1 先把这个 Demo 改成你自己的小项目跑通源码之后不要急着学新框架。先做一件事把表结构改掉换成你自己想做的业务。比如把 user 表改成 book 表字段改成书名、作者、价格然后改 Mapper XML、Service、Controller 和 JSP。这一步的目的是让你体验“改一处、动全身”的感觉理解分层的意义。我第一次改的时候忘了改 Mapper 的 namespace启动直接报错找了半小时才发现。从那以后我每次改包名或类名都强制走一遍“接口 → XML → Service → Controller → JSP”的检查链。6.2 补上前端和 RESTful 接口的缺口SSM 原生的 Controller 返回 JSP 页面但现在更多场景是前后端分离Controller 返回 JSON。你可以在现有项目里加一个ResponseBody的方法返回Map或实体类然后用浏览器或 Postman 访问看能不能拿到 JSON。这一步会逼你理解mvc:annotation-driven背后的消息转换器是怎么工作的。如果返回 JSON 时报 406通常是缺少 Jackson 依赖在 pom.xml 里加上jackson-databind即可。6.3 用 Spring Boot 重写一遍对比差异当你对 SSM 的配置流程熟悉之后用 Spring Boot 重写同一个业务。你会发现web.xml 没了取而代之的是SpringBootApplicationapplicationContext.xml 没了取而代之的是Configuration和BeanMyBatis 的配置变成了application.yml里的几行。这时候你就能真正理解 Spring Boot 的“约定优于配置”到底省了什么。下面是一个 Spring Boot 整合 MyBatis 的最小配置示例你可以对照 SSM 的 XML 看spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_demo?useSSLfalseserverTimezoneUTC username: root password: 你的密码 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.entity同样的功能SSM 需要三个 XML 文件加一个 web.xmlSpring Boot 只需要一个 yml。不是 Spring Boot 更“高级”而是它把配置自动化了。你先手写一遍 SSM再用 Spring Boot就不会被自动配置搞晕。6.4 学习路径建议按这个顺序走不容易断档如果你现在刚跑通 SSM接下来的学习顺序建议是先补 SQL 和数据库设计因为业务逻辑最终都落在表结构上然后学 Maven 的依赖管理和多模块因为真实项目不会只有一个模块接着学 Spring Boot 的自动配置原理但不要一上来就啃源码先看官方文档的“How it works”章节最后学 Spring Security 或 Shiro 做权限以及 Redis 做缓存。每一步都拿一个具体的小功能练手比如用户登录、商品列表、订单提交。不要只看视频不动手SSM 这种配置类的东西看十遍不如自己搭一遍。提示如果你在搭建过程中遇到版本冲突优先检查 JDK 版本和 Tomcat 版本这两个是新手翻车最多的地方。希望帮到你。本文还有配套的精品资源点击获取