news 2026/10/21 3:07:42

零基础SSM框架实战:IDEA 2021从零搭建JavaWeb项目

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础SSM框架实战:IDEA 2021从零搭建JavaWeb项目

简介:这份源码资源面向Java Web初学者与需要从零搭建SSM框架的开发者,基于IDEA2021、Tomcat9.0与MySQL8.0.25环境,完整演示Spring+SpringMVC+MyBatis的整合过程,帮助读者解决框架配置繁琐、依赖冲突、环境搭建无从下手等常见问题。压缩包共105个文件,约22.34MB,其中52个jar为框架与数据库驱动依赖,28个xml涵盖Spring、MyBatis及Web配置,另有10个class、5个java源码、4个jsp页面与3个properties配置,结构清晰,便于对照学习。目前已有3136人学习下载,适合作为入门练手或课程设计参考。通过该源码,读者可掌握SSM各层职责划分、配置文件编写、数据库连接与事务管理,并借助BookController、BookService、BookDao等示例理解典型CRUD流程,快速跑通一个可运行的JavaWeb项目,为后续进阶开发打下基础。

1. 零基础也能懂:SSM 到底是什么,为什么值得你花时间

如果你刚打开 IDEA,面对满屏的英文菜单和一堆配置文件,心里想的是“我连 Java 基础都还没捂热,怎么就要搭框架了”——别慌,这个反应太正常了。SSM 不是什么高深莫测的黑科技,它只是三个 Java 开发中常用工具的首字母缩写:Spring、Spring MVC、MyBatis。你可以把它想象成开一家小餐馆:Spring 是后厨总管,负责协调所有食材和厨具;Spring MVC 是前台服务员,负责接收顾客点单并端菜上桌;MyBatis 是采购员,专门负责跟仓库(数据库)打交道,把需要的食材精准取回来。这三个角色各司其职,合在一起就是一套能跑通“浏览器请求→后台处理→数据库读写→返回结果”完整流程的经典组合。

那为什么零基础也要学它?因为它是理解 Java Web 开发脉络的一把钥匙。很多看起来复杂的企业级项目,剥开外壳,核心骨架往往就是 SSM 这个模式。你不需要一开始就深挖 Spring 的 IOC 底层原理,也不用背 MyBatis 的所有标签,先跟着走一遍“从零搭起来、能跑通一个查询”的过程,比看十篇理论文章都管用。这份资源就是带你走这条路的——用 IDEA 2021 作为工具,把 SSM 框架从空文件夹开始,一步步搭出可运行的源码。适合谁?适合刚学完 Java 基础语法、知道什么是类和方法、但对“框架”两个字还有点发怵的 JavaWeb 新手。

2. 动手前的准备:把环境理顺,别让工具拖后腿

2.1 为什么 IDEA 2021 是新手友好的起点

很多人一上来就问“哪个版本最好”,其实对于入门来说,版本稳定比版本新更重要。IDEA 2021 在 Java Web 开发支持上已经非常成熟,对 Maven 的集成、Tomcat 的配置都有很直观的图形界面,不需要你手动敲一堆命令。我第一次学的时候用的是更老的版本,光配一个 Tomcat 就折腾了一下午,后来换成 2021 版,发现它把很多容易出错的环节都做了可视化提示。你只需要去官网下载 Ultimate 版(社区版对 Web 支持有限),安装时一路下一步就行。安装完成后,先别急着建项目,打开设置检查两件事:一是 Maven 的路径是否指向你本地已安装的 Maven,二是 JDK 是否配置为 1.8 或以上。这两项在File → Settings → Build, Execution, Deployment里都能找到。

提示:如果你电脑上还没装 JDK 和 Maven,建议先装 JDK 1.8,再装 Maven 3.6 以上版本。安装路径里不要带中文和空格,这是血泪经验,后面出各种奇怪的报错往往就是路径惹的祸。

2.2 创建第一个 Maven 项目:把骨架立起来

打开 IDEA,选择File → New → Project,左侧选 Maven,勾选Create from archetype,然后从列表里找到org.apache.maven.archetypes:maven-archetype-webapp。这个模板会帮你生成一个标准的 Web 项目目录结构,省去手动建文件夹的麻烦。填好 GroupId(比如com.example)和 ArtifactId(比如ssm-demo),一路 Next 到 Finish。项目创建好后,你会看到src/main/webapp目录下有一个index.jsp,这说明 Web 骨架已经就位。

接下来打开项目根目录下的pom.xml文件,这是 Maven 的“配料表”,所有依赖都写在这里。把下面这段代码粘贴到<dependencies>标签内:

<!-- Spring 核心依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.20</version> </dependency> <!-- Spring MVC 依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.20</version> </dependency> <!-- MyBatis 依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!-- MyBatis 与 Spring 整合包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <!-- 数据库驱动,这里以 MySQL 为例 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency>

这段配置的意思是:告诉 Maven 去中央仓库下载 Spring、Spring MVC、MyBatis 以及它们之间的粘合剂。版本号我选了比较稳定的组合,你直接照抄即可。粘贴后 IDEA 右上角会弹出一个 Maven 图标,点一下刷新,它就会自动下载这些 jar 包。如果下载速度慢,可以在pom.xml里加一段阿里云镜像配置,这个网上搜“Maven 阿里云镜像”就有现成的,复制到<mirrors>标签里就行。

2.3 配置 Tomcat:让项目能跑在浏览器里

代码写完了总得有个地方运行,Tomcat 就是那个“容器”。在 IDEA 右上角点击Add Configuration,点左上角+号,选择Tomcat Server → Local。在Server标签页里,Application server处点击Configure,找到你本地解压的 Tomcat 目录。然后切换到Deployment标签页,点+号选Artifact,把ssm-demo:war exploded加进去。最后把Application context设成/,这样访问时就不用加一长串前缀。

注意:Tomcat 版本建议选 8.5 或 9.0,和 JDK 1.8 搭配最稳。如果启动时报ClassNotFoundException,八成是依赖没下载全,回到 Maven 面板点一下刷新,或者删掉本地仓库里对应的文件夹重新下载。

3. 三层结构逐个搭:从数据库到页面的完整链路

3.1 先建数据库和表:数据得有地方放

SSM 里的 MyBatis 负责跟数据库打交道,所以我们先得有个数据库。打开你的 MySQL 客户端,执行下面这段 SQL:

CREATE DATABASE ssm_demo DEFAULT CHARACTER SET utf8mb4; USE ssm_demo; CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, age INT ); INSERT INTO user (username, age) VALUES ('张三', 20), ('李四', 25);

这里建了一个最简单的user表,只有 id、username、age 三个字段,并插入了两条测试数据。为什么要用utf8mb4?因为万一以后要存表情符号或者生僻字,utf8可能会乱码,一步到位省得后面改。表建好后,回到 IDEA,在src/main/resources目录下新建一个jdbc.properties文件,写入数据库连接信息:

jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm_demo?useSSL=false&serverTimezone=UTC jdbc.username=root jdbc.password=你的密码

注意jdbc.url里的serverTimezone=UTC不能少,否则 MySQL 8 会报时区错误。用户名和密码换成你自己的。

3.2 写实体类和 Mapper:让 Java 对象和表对应起来

在src/main/java下新建包com.example.entity,创建一个User类:

package com.example.entity; public class User { private Integer id; private String username; private Integer age; // 省略 getter 和 setter 方法,IDEA 里按 Alt+Insert 可以自动生成 }

这个类就是数据库表的“镜像”,表里有什么字段,类里就有什么属性。接着在com.example.mapper包下创建UserMapper接口:

package com.example.mapper; import com.example.entity.User; import java.util.List; public interface UserMapper { List<User> findAll(); }

然后在src/main/resources下新建mapper文件夹,创建UserMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mapper.UserMapper"> <select id="findAll" resultType="com.example.entity.User"> SELECT * FROM user </select> </mapper>

namespace必须和接口的全限定名一模一样,id必须和接口里的方法名一模一样,这是 MyBatis 的硬性约定,写错了启动就报BindingException。resultType告诉 MyBatis 把查询结果封装成User对象。

3.3 配 Spring 和 Spring MVC:把三层串起来

在src/main/resources下创建applicationContext.xml,这是 Spring 的总配置文件:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://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-package="com.example.service"/> <!-- 加载数据库配置 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <!-- 扫描 Mapper 接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper"/> </bean> </beans>

这段配置做了四件事:扫描 service 包、读取数据库配置、创建数据源、把 MyBatis 的 Mapper 接口和 XML 关联起来。接着创建spring-mvc.xml:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://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-package="com.example.controller"/> <!-- 开启注解驱动 --> <mvc:annotation-driven/> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>

<mvc:annotation-driven/>是让@RequestMapping这类注解生效的关键,少了它你的 Controller 就收不到请求。视图解析器的作用是:Controller 返回一个字符串"userList",Spring MVC 自动帮你拼成/WEB-INF/views/userList.jsp。

最后在web.xml里把 Spring 和 Spring MVC 的配置加载进去:

<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

ContextLoaderListener负责启动 Spring 容器,DispatcherServlet负责拦截所有请求并交给 Spring MVC 处理。到这里,配置文件就全部写完了。

3.4 写 Service 和 Controller:让请求真正跑通

在com.example.service包下创建UserService类:

package com.example.service; import com.example.entity.User; import com.example.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getAllUsers() { return userMapper.findAll(); } }

@Service把这个类交给 Spring 管理,@Autowired自动把 Mapper 注入进来,不需要你手动 new。然后在com.example.controller包下创建UserController:

package com.example.controller; import com.example.entity.User; import com.example.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; @Controller public class UserController { @Autowired private UserService userService; @RequestMapping("/users") public String list(Model model) { List<User> users = userService.getAllUsers(); model.addAttribute("users", users); return "userList"; } }

@RequestMapping("/users")表示当浏览器访问/users时执行这个方法。Model是 Spring MVC 提供的“传菜盘”,把数据从后台传到页面。最后在WEB-INF/views下创建userList.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head><title>用户列表</title></head> <body> <h2>用户列表</h2> <table border="1"> <tr><th>ID</th><th>用户名</th><th>年龄</th></tr> <c:forEach items="${users}" var="u"> <tr> <td>${u.id}</td> <td>${u.username}</td> <td>${u.age}</td> </tr> </c:forEach> </table> </body> </html>

启动 Tomcat,浏览器输入http://localhost:8080/users,如果看到张三和李四的信息整整齐齐列在表格里,恭喜你,SSM 的完整链路已经跑通了。

4. 新手避坑指南:这五个地方最容易翻车

4.1 现象:启动报NoClassDefFoundError或ClassNotFoundException

原因:Maven 依赖没有下载完整,或者 IDEA 没有把依赖包部署到 Tomcat 的WEB-INF/lib下。解决:打开右侧 Maven 面板,点刷新按钮重新下载;然后进File → Project Structure → Artifacts,确认ssm-demo:war exploded的WEB-INF/lib里包含了所有依赖。如果还是不行,删掉本地仓库里org/springframework文件夹重新下载。

4.2 现象:访问页面报 404,Tomcat 日志里没有任何 Controller 映射信息

原因:spring-mvc.xml没有被加载,或者DispatcherServlet的url-pattern配错了。解决:检查web.xml里contextConfigLocation的值是不是classpath:spring-mvc.xml,以及<url-pattern>是不是/。另外确认spring-mvc.xml里的component-scan包名和你的 Controller 实际包名一致。

4.3 现象:MyBatis 报Invalid bound statement (not found)

原因:Mapper 接口和 XML 文件没有对应上。解决:检查三个地方——XML 的namespace是否等于接口全限定名、id是否等于方法名、mapperLocations路径是否写对。还有一个隐蔽点:如果 XML 放在src/main/java下,Maven 默认不会打包,必须放在src/main/resources下。

4.4 现象:数据库连接报Access denied或Unknown database

原因:jdbc.properties里的用户名、密码、数据库名写错了,或者 MySQL 服务没启动。解决:先用命令行mysql -u root -p确认能登录,再核对配置文件。注意 MySQL 8 的驱动类名是com.mysql.cj.jdbc.Driver,不是老的com.mysql.jdbc.Driver。

4.5 现象:页面显示中文乱码

原因:JSP 页面编码、数据库编码、Tomcat 编码三者不一致。解决:JSP 头部加上<%@ page contentType="text/html;charset=UTF-8" %>,数据库建表时用utf8mb4,Tomcat 的server.xml里 Connector 标签加上URIEncoding="UTF-8"。三处都对齐,乱码基本就消失了。

5. 下一步怎么走:从跑通到写顺的学习路径

第一个例子跑通之后,你可能会有点兴奋,也可能有点茫然——接下来该干什么?我的建议是别急着去啃 Spring 源码,先把这套 SSM 的“手感”练出来。具体来说,按这个顺序走:第一周,把现有的user表加一个字段,比如email,然后从实体类、Mapper XML、Service、Controller 到 JSP 全部改一遍,让新字段能在页面上显示出来。这个练习能帮你把整条链路刻进肌肉记忆里。第二周,试着加一个“新增用户”的功能,需要写一个带参数的 Mapper 方法、一个处理 POST 请求的 Controller 方法,以及一个表单页面。这时候你会遇到参数绑定、请求方式、页面跳转这些新问题,每一个都是真实的进步。

第三周开始,可以接触一些进阶但依然入门级的内容。比如把applicationContext.xml里的数据源换成 Druid 连接池,体验一下“配置换一下,性能好一点”的感觉;或者给 Controller 加一个@ResponseBody注解,返回 JSON 数据而不是 JSP 页面,这是前后端分离的雏形。下面这张表可以帮你理清每个阶段的目标和检验标准:

阶段目标检验标准
第一周熟练修改现有链路新增字段后页面能正确显示
第二周独立完成增删改查能不看教程写出新增和删除功能
第三周接触整合与优化换成 Druid 后项目正常启动
第四周理解分层思想能画出请求从浏览器到数据库的流向图

提示:每一周结束时,把代码提交到 Git 仓库,哪怕只有你一个人看。这样万一改崩了,还能回退到上一个能跑的版本,比到处找“后悔药”强得多。

最后说一个我自己的教训。刚开始学 SSM 的时候,我总想着把配置文件写得“高级”一点,今天加个拦截器,明天换个视图解析器,结果项目三天两头起不来,排查问题的时间比写代码还多。后来我强迫自己定了一条规矩:每引入一个新东西,必须先把当前版本完整跑通并提交,再动下一处。从那以后我每次搭环境都强制走一遍“先跑通、再优化”的流程,翻车次数少了一大半。希望这个习惯也能帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 3:07:14

五款AI编程工具实测:谁最能将需求落地为可用代码?

我先把话撂在前头&#xff1a;现在聊“Vibe Coding”的人很多&#xff0c;但大多数人聊偏了。大家比的是“谁一次生成的代码多”“谁能从零给你立起一个项目”&#xff0c;可真到了需求落地的节骨眼上——你拿着一条真实业务需求&#xff0c;让它接进一套成熟系统&#xff0c;跑…

作者头像 李华
网站建设 2026/10/21 3:06:30

用AI写教材如何做到低查重?一套可落地的原创内容生成流程

用AI写教材这事&#xff0c;我试过很多次&#xff0c;翻车的坑一个没落下。最离谱的一次&#xff0c;让AI一口气生成了三万一章的讲义&#xff0c;看起来信息量巨大&#xff0c;结果往查重系统里一放&#xff0c;重复率百分之四十几&#xff0c;而且结构完全是流水账——概念堆…

作者头像 李华
网站建设 2026/10/21 3:06:29

游戏开发全攻略:从概念到发布的完整链路与实践指南

做过游戏的朋友可能都遇到过这种情况&#xff1a;脑子里火花四溅&#xff0c;灵感一大堆&#xff0c;可真要动起手来&#xff0c;从玩法概念到第一个可玩Demo之间的这段距离&#xff0c;比想象中长得多。“游戏开发”这个领域最迷人的地方&#xff0c;恰恰也在这里——它不是某…

作者头像 李华