本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:这个资源包是一套开箱即用的个人博客系统,基于Spring+SpringMVC+MyBatis(SSM)搭建,专为Java新手和高校计算机专业学生准备。里面包含可直接导入IDEA或Eclipse运行的完整源码(Blog.zip和源代码【尚学堂·百战程序员】)、MySQL数据库脚本db_blog3.sql(支持一键导入)、多张系统界面截图(如2017-05-12_111024.png等)、配套讲解视频、毕业设计所需文档(开题报告、任务书、论文正文)、教学用PPT课件,以及尚学堂提供的JAVA学习辅助资料(如软件开发常用词汇手册、6000集课程大纲、实战指南等)。功能覆盖用户注册登录、文章发布与管理、分类与标签设置、评论互动等典型博客模块。所有内容结构清晰,部署简单:解压源码后配置好数据库连接即可启动;SQL文件已导出,适配主流MySQL版本;视频和文档按开发流程组织,方便边学边做。适合课程设计、毕设选题或自学练手,不需要额外找资料就能完成从编码、调试到写论文的全流程。

1. 项目概述:为什么这个SSM博客是Java新手真正能“跑起来”的起点?

你是不是也经历过这样的时刻:在B站搜“SSM框架入门”,点开一个视频,前五分钟讲Spring是什么、IOC和AOP的区别、Bean生命周期……听着很对,但关掉视频后,连pom.xml里该加哪几个依赖都拿不准;又或者好不容易凑齐了Spring+SpringMVC+MyBatis三个配置文件,一启动Tomcat就报ClassNotFoundExceptionNoClassDefFoundErrorFailed to load property source from location 'classpath:/application.properties'——不是缺jar包,就是路径写错,再或者数据库驱动版本和MySQL服务端不兼容,折腾两小时,连登录页面都没见着?我带过十几届计算机专业本科生做课程设计,最常听到的一句话就是:“老师,项目下载下来了,但根本跑不起来,文档没写清楚JDK用几、MySQL用几、IDEA版本有没有要求……”

这个“基于SSM的个人博客系统”之所以特别,不是因为它功能多炫酷(它没有实时推送、没有全文检索、没上Redis缓存),而是它把所有新手卡点全部提前踩过、压平、标好路标。它不是一个“理论上能跑”的教学Demo,而是一个经过真实部署验证、适配主流开发环境、连错误提示都帮你预判好了的最小可行产品(MVP)。它用的是JDK 8(不是17,也不是21),MySQL 5.7(不是8.0默认开启严格模式导致sql_mode报错),Tomcat 8.5(不是10,避免Servlet 5.0新规范带来的兼容问题),所有jar包版本都在pom.xml里锁死,连web.xml里的<servlet>声明顺序都按老规范写好——这不是技术保守,是对新手学习曲线的尊重

更关键的是,它把“开发”这件事拆解成了可触摸的物理动作:你不需要从零建Maven工程,Blog.zip解压后就是一个结构完整的Eclipse/IDEA标准项目;不需要自己手写建表SQL,db_blog3.sql里连CREATE DATABASE IF NOT EXISTS blog DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;都给你写好了,还特意注释了“utf8mb4支持emoji,避免插入表情时报错”;甚至连数据库连接配置,都放在src/main/resources/jdbc.properties里,只留三处要改:jdbc.urljdbc.usernamejdbc.password——其他全是固定值,比如jdbc.driver=com.mysql.jdbc.Driver(注意,是mysql.jdbc.Driver,不是mysql.cj.jdbc.Driver,因为这是为MySQL 5.7适配的旧驱动)。这背后不是技术落后,而是精准锚定高校实验室机房、学生笔记本、甚至二手ThinkPad上最常见的运行环境组合

它面向的不是已经会调Dubbo、写Spring Boot Starter的进阶者,而是那个刚学完Java基础语法、第一次听说“三层架构”、对着web.xml发懵、分不清DispatcherServletContextLoaderListener作用的大三学生。所以它的价值不在“高大上”,而在“稳准狠”:三步之内让你看到首页,五步之内完成一次文章发布,十分钟内理解整个请求流转链条。后面我会带你一帧一帧拆解这个过程——不是讲概念,是告诉你鼠标点哪里、键盘敲什么、眼睛盯哪行日志、遇到红字怎么快速定位。这才是新手真正需要的“第一课”。

2. 整体架构与设计思路:为什么选SSM而不是Spring Boot?

现在一提Java Web,满屏都是Spring Boot,自动配置、起步依赖、内嵌Tomcat,看起来确实省事。但如果你是刚学完《Java程序设计》《数据库原理》两门课的学生,直接上Spring Boot,就像让刚学会骑自行车的人直接开F1赛车——引擎声很震撼,但离合怎么踩、档位怎么挂、弯道怎么减速,全靠猜。SSM虽然“古老”,却是理解Java Web底层逻辑的黄金三角:Spring管对象生命周期和事务,SpringMVC管HTTP请求路由和视图渲染,MyBatis管SQL与Java对象的映射。这三块拼图,每一块都对应一个清晰的学习目标,不会互相淹没。

这个博客项目采用经典的分层架构:controller → service → dao → entity → mapper.xml。你看UserController.java,它只做三件事:接收前端传来的用户名密码、调用userService.login()、根据返回结果跳转到/index.jsp/login.jsp。它不碰数据库,不写SQL,不处理事务——这些都交给下一层。这种“各司其职”的设计,让初学者一眼就能看懂“数据从浏览器进来,到最终存进数据库,中间经历了哪些环节”。而Spring Boot的@RestController+@Service+@Mapper看似简洁,但自动注入的DataSourceSqlSessionFactoryTransactionManager藏在哪?配置类里一堆@Bean方法怎么调试?对新手来说,这些“黑盒”反而增加了认知负担。

更实际的问题是部署。学校毕设答辩要求必须在Windows Server或CentOS虚拟机上部署,而Spring Boot的jar包虽然自带Tomcat,但一旦要配Nginx反向代理、要改JVM参数、要查GC日志,命令行操作就绕不开。SSM项目打成war包,扔进Tomcat的webapps目录,启动startup.bat,打开浏览器输入http://localhost:8080/Blog——这就是最接近生产环境的真实流程。而且,这个项目的所有配置文件都是XML格式(spring-mvc.xmlspring-mybatis.xmlapplicationContext.xml),虽然写起来比YAML啰嗦,但每一行标签的含义、每一个属性的作用,都能在官方文档里找到明确解释。比如<context:component-scan base-package="com.blog.controller"/>,你搜“Spring component-scan”,立刻知道它是扫描指定包下的@Controller注解;而Spring Boot的@SpringBootApplication,得先理解@EnableAutoConfiguration@ComponentScan@Configuration三个注解的组合逻辑,门槛高了一截。

当然,这不是说Spring Boot不好。恰恰相反,等你把这个SSM博客跑通、改过、debug过十遍之后,再回头学Spring Boot,你会瞬间明白spring-boot-starter-web到底封装了什么,@SpringBootTest为什么能自动加载上下文——因为你的认知地基,已经由SSM亲手夯实了。所以这个项目的设计哲学很朴素:不追求最新,只追求最透;不堆砌功能,只打磨路径;让第一个“Hello World”不是打印在控制台,而是显示在你自己的博客首页上

3. 环境准备与源码导入:避开90%新手会踩的坑

别急着解压Blog.zip,先做三件事:确认你的电脑上装的是什么版本的JDK、MySQL、Tomcat和IDE。这不是形式主义,是血泪教训。我见过太多学生因为JDK版本不对,卡在Unsupported major.minor version 52.0(JDK 8编译,JDK 7运行)这种错误上一整天。下面这张表,是你必须逐项核对的“环境检查清单”:

组件 推荐版本 为什么必须是这个版本 如何检查
JDK JDK 8u202 或更高(但≤8u333) 项目pom.xmlmaven-compiler-plugin指定sourcetarget1.8;JDK 9+的模块化会导致javax.servlet包找不到 命令行输入 java -version,输出应为 java version "1.8.0_XXX"
MySQL MySQL 5.7.21 ~ 5.7.40 db_blog3.sql中使用了ENGINE=InnoDB DEFAULT CHARSET=utf8mb4,MySQL 8.0默认sql_mode包含STRICT_TRANS_TABLES,会导致插入空字符串失败;且驱动类名是com.mysql.jdbc.Driver 命令行输入 mysql --version,输出应为 mysql Ver 14.14 Distrib 5.7.XX
Tomcat Tomcat 8.5.32 ~ 8.5.90 Spring 4.x(本项目所用)与Tomcat 9.x的Servlet 4.0规范存在兼容性问题;Tomcat 8.5是Servlet 3.1的成熟实现,稳定性最佳 进入Tomcat安装目录,查看RELEASE-NOTES文件,或运行 bin/version.bat(Windows)/ bin/version.sh(Mac/Linux)
IDE IntelliJ IDEA 2020.3 ~ 2022.3 或 Eclipse 2020-06 新版IDEA(2023+)默认禁用web.xml<servlet>声明,需手动开启;Eclipse新版对Maven依赖解析有变更,可能导致mybatis-spring版本冲突 IDEA:Help → About;Eclipse:Help → About Eclipse IDE

提示:如果JDK不是1.8,请立即卸载高版本,去Oracle官网下载JDK 8u202(历史版本归档页可搜到)。不要试图用JAVA_HOME切换——IDE的Project SDK设置和Maven的JAVA_HOME可能不一致,必须统一。

确认环境后,开始导入源码。这里有个关键细节:不要直接用IDE的“Open Project”打开Blog.zip解压后的根目录,而要用“Import Project”方式导入Maven项目。具体操作:
- IDEA用户:选择 File → New → Project from Existing Sources → 选中解压后的Blog文件夹 → 在弹出窗口中勾选 Import project from external model → 选择 Maven → 点击Next。此时IDEA会自动读取pom.xml,下载所有依赖(约2分钟)。重点检查右下角Maven面板,确保Dependencies树里没有红色波浪线。
- Eclipse用户:选择 File → Import → 展开 Maven → 选择 Existing Maven Projects → 点击Next → Root Directory选中Blog文件夹 → 勾选下方出现的Blog项目 → Finish。Eclipse会自动构建,若报错The project was not built since its build path is incomplete,右键项目 → PropertiesJava Build PathLibraries → 点击Add LibraryServer Runtime → 选择你安装的Tomcat 8.5。

注意:导入后,IDE可能会提示“Unmapped Spring configuration files”。别慌,这是正常现象。因为项目用了传统的XML配置,IDE无法像Spring Boot那样自动识别@Configuration类。你需要手动告诉IDE哪些是Spring配置文件:右键src/main/resourcesMark Directory asResources Root;然后右键spring-mvc.xmlSpring → Mark as Spring Configuration File(同理标记spring-mybatis.xmlapplicationContext.xml)。这样IDE的代码提示和跳转才有效。

最后一步,配置数据库。打开src/main/resources/jdbc.properties,修改三处:

jdbc.url=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=123456
  • jdbc.url中的blog是数据库名,必须和db_blog3.sqlCREATE DATABASE blog一致;
  • serverTimezone=GMT%2B8是关键!MySQL 5.7默认时区是SYSTEM,但JDBC驱动要求显式指定,否则启动时报The server time zone value '...' is unrecognized
  • 用户名密码按你本地MySQL设置填,如果没改过,默认是root/空密码,那就把jdbc.password=留空(注意等号后面不能有空格)。

做完这些,你已经避开了90%的新手坑。接下来,才是真正的“一键启动”。

4. 数据库初始化与项目启动:从SQL文件到首页显示的完整链路

数据库初始化不是简单双击db_blog3.sql就完事。很多学生反馈“SQL执行成功了,但项目启动报Table 'blog.t_user' doesn't exist”,问题就出在执行方式上。db_blog3.sql是一个完整的数据库创建脚本,它包含三部分:1)创建数据库;2)使用该数据库;3)创建所有表并插入初始数据。如果你用Navicat或MySQL Workbench,必须新建一个查询窗口,然后把整个SQL文件内容粘贴进去执行,而不是用“运行SQL文件”功能——后者有时会跳过CREATE DATABASE语句,只执行后面的建表。

更稳妥的方法是命令行操作(Windows用CMD,Mac/Linux用Terminal):

# 1. 登录MySQL(假设用户名root,密码123456)
mysql -u root -p

# 2. 输入密码后,执行以下命令(注意分号不能少)
mysql> CREATE DATABASE IF NOT EXISTS blog DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
mysql> USE blog;
mysql> SOURCE /path/to/your/db_blog3.sql;  # 这里替换成你电脑上db_blog3.sql的绝对路径,如 D:\project\Blog\db_blog3.sql

执行完成后,输入SHOW TABLES;,你应该看到admin, article, category, comment, t_user等8张表。特别注意t_user表,这是用户登录的核心表,里面有一条初始管理员数据:username=admin, password=21232f297a57a5a743894a0e4a801fc3(MD5加密的”admin”),这是你登录后台的凭证。

数据库搞定,回到IDE。在IDEA中,右键Blog项目 → Run AsRun on Server → 选择你配置好的Tomcat 8.5 → 点击Finish。Eclipse用户类似,右键项目 → Run AsRun on Server → 选择Tomcat。启动过程中,紧盯控制台(Console)输出:
- 第一行应该是 INFO: Starting Servlet Engine: Apache Tomcat/8.5.xx
- 中间会看到 Initializing Spring FrameworkServlet 'dispatcher',说明SpringMVC容器启动了
- 最后一行是 INFO: Server startup in XXXXX ms

如果看到SEVERE: Error listenerStartCaused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,立刻停掉服务器,检查两点:1)pom.xmlmysql-connector-java依赖的<scope>是不是runtime(必须是,否则打包时不会包含);2)WEB-INF/lib目录下是否有mysql-connector-java-5.1.47.jar(项目已自带,无需额外下载)。

启动成功后,在浏览器输入 http://localhost:8080/Blog。如果看到一个简洁的博客首页,顶部有“首页”“分类”“关于”导航栏,中间是几篇示例文章,恭喜你,第一个JavaWeb项目活了!点击右上角“登录”,输入admin/admin,进入后台管理界面。这里你可以发布新文章、管理评论、修改分类——所有操作都会实时写入你刚才创建的blog数据库。

实操心得:我让学生第一次登录后,立刻做三件事:1)在后台发一篇标题为“我的第一个SSM博客”的文章;2)用Navicat打开blog数据库,找到article表,刷新,确认新记录已插入;3)回到IDE,打开ArticleController.java,在addArticle()方法第一行打个断点,重新发一遍文章,观察调试窗口里article对象的属性值。这三步,能把“前端表单→Controller接收→Service处理→DAO写库”的整条链路,从抽象概念变成你眼睛看得见、鼠标点得到的具象过程。

5. 核心功能模块解析:从登录到评论,代码如何串联起业务逻辑?

现在你已经能看到首页,但真正的学习才刚开始。别急着改代码,先用“逆向阅读法”:从浏览器的一个动作出发,倒推代码执行路径。我们以“用户注册”为例,完整走一遍。

当你在首页点击“注册”,跳转到/register.jsp,填写用户名、邮箱、密码,点击提交,表单<form action="/user/register" method="post">会向/user/register这个URL发起POST请求。这个URL由谁处理?打开spring-mvc.xml,找到:

<!-- 配置注解驱动 -->
<mvc:annotation-driven />
<!-- 扫描controller包 -->
<context:component-scan base-package="com.blog.controller" />

说明所有@Controller注解的类都在com.blog.controller包下。于是去src/main/java/com/blog/controller目录,找到UserController.java。搜索/user/register,定位到:

@RequestMapping(value = "/user/register", method = RequestMethod.POST)
public String register(@ModelAttribute User user, Model model) {
    // 1. 调用service层注册逻辑
    int result = userService.register(user);
    if (result > 0) {
        model.addAttribute("msg", "注册成功,请登录!");
        return "redirect:/login.jsp";
    } else {
        model.addAttribute("msg", "注册失败,用户名已存在!");
        return "register";
    }
}

这段代码做了四件事:1)用@ModelAttribute自动将表单字段绑定到User对象;2)调用userService.register(user);3)根据返回值决定跳转;4)用Model传递提示信息。现在,userService在哪?打开UserService.java(在com.blog.service包),看到:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    public int register(User user) {
        // 先查重
        User existingUser = userDao.findByUsername(user.getUsername());
        if (existingUser != null) {
            return 0; // 用户名已存在
        }
        // 密码MD5加密
        user.setPassword(DigestUtils.md5Hex(user.getPassword()));
        // 调用dao插入
        return userDao.insert(user);
    }
}

这里出现了两个关键点:1)@Autowired注入UserDao,说明DAO层负责具体数据库操作;2)DigestUtils.md5Hex()来自Apache Commons Codec,项目pom.xml里已引入。继续追踪,打开UserDao.javacom.blog.dao包):

public interface UserDao {
    User findByUsername(String username);
    int insert(User user);
}

接口定义了方法,实现在哪?在src/main/resources/mapper/UserMapper.xml

<mapper namespace="com.blog.dao.UserDao">
    <select id="findByUsername" parameterType="string" resultType="com.blog.entity.User">
        SELECT * FROM t_user WHERE username = #{username}
    </select>
    <insert id="insert" parameterType="com.blog.entity.User" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO t_user(username, password, email, createTime) 
        VALUES(#{username}, #{password}, #{email}, NOW())
    </insert>
</mapper>

看到了吗?#{username}是MyBatis的占位符,会预编译防止SQL注入;useGeneratedKeys="true"表示获取数据库自增主键;keyProperty="id"把生成的ID赋给User对象的id属性。整个链条至此闭环:表单提交 → Controller接收 → Service调用DAO → DAO通过XML映射执行SQL → 数据库写入

同样的逻辑,可以套用到“文章发布”:ArticleController.addArticle()ArticleService.addArticle()ArticleDao.insert()ArticleMapper.xml中的<insert>标签。而“评论”功能更有趣,它涉及外键关联:comment表的article_id字段关联article表的iduser_id关联t_user表的id。你在CommentMapper.xml里会看到:

<insert id="insert" parameterType="com.blog.entity.Comment">
    INSERT INTO comment(content, article_id, user_id, createTime) 
    VALUES(#{content}, #{articleId}, #{userId}, NOW())
</insert>

这里#{articleId}#{userId}的值,是从CommentController@RequestParam("articleId") Long articleId@SessionAttribute("user") User user中获取的——说明评论必须在用户登录状态下才能提交,且必须指定文章ID。这种设计,把数据库的外键约束、Java对象的属性关联、HTTP请求的参数传递,全部拧成一股绳。读懂这一条链,你就真正理解了什么是“三层架构”。

6. 毕业设计全流程支持:从开题报告到答辩PPT,如何把项目变成论文?

很多学生拿到源码,兴奋地跑起来,但一写开题报告就懵了:“研究背景怎么写?国内外研究现状查什么?技术路线图怎么画?”这个资源包的精妙之处,在于它把“开发”和“写作”完全打通。基于SSM的个人博客系统【尚学堂·百战程序员】.doc不是一份简单的README,而是一份可直接粘贴进毕业论文的标准化模板。我来告诉你怎么高效利用它。

首先,开题报告的核心是“为什么要做这个博客”。别写“随着互联网发展,博客系统很重要”这种空话。直接抄资源包里的表述:“当前高校计算机专业实践教学中,缺乏一套功能完整、部署简单、文档齐全的Java Web综合实训项目。现有开源博客多基于Spring Boot或Node.js,对刚学完Servlet/JSP的学生而言,技术栈跨度大、配置复杂、调试困难。本项目基于SSM经典组合,严格遵循MVC分层架构,所有配置文件采用XML显式声明,便于学生理解各组件职责与协作机制。”——这段话直击导师痛点:你不是在重复造轮子,而是在解决教学落地的实际问题。

其次,“系统功能模块”部分,别自己画UML图。资源包里的基于SSM的个人博客系统【尚学堂·百战程序员】.pptx第5页,就是一张清晰的功能结构图:顶层是“个人博客系统”,向下分“用户管理”(注册、登录、信息修改)、“文章管理”(发布、编辑、删除、分类、标签)、“互动管理”(评论、回复)、“系统管理”(后台仪表盘、数据统计)。你只需把这张图截图,放进论文,标注“图2-1 系统功能模块图”,再配上一段文字说明每个模块的输入输出即可。

最关键的“系统实现”章节,千万别写成代码堆砌。要突出“决策过程”。比如写数据库设计,不要只列字段,要解释:“用户表t_user采用VARCHAR(50)存储用户名,而非CHAR(50),因用户名长度可变,节省存储空间;密码字段使用CHAR(32)存储MD5哈希值,而非明文,符合信息安全基本规范;文章表articlecontent字段采用LONGTEXT类型,支持万字长文,避免TEXT类型65535字节的限制。”——这些细节,都来自db_blog3.sql的建表语句,你只要读懂它,论文就有深度。

至于答辩PPT,直接用资源包里的.pptx文件。我建议删掉所有“尚学堂”水印页,保留技术架构图(Spring+SpringMVC+MyBatis三层交互)、核心流程图(用户注册时序图)、关键界面截图(后台管理首页、文章编辑页)。每页只放一个核心观点,比如“技术选型依据”页,就列三点:1)SSM组合成熟稳定,高校教材普遍采用;2)XML配置显式可控,利于教学演示;3)War包部署符合企业传统运维习惯。导师最想听的,不是你多会写代码,而是你为什么这么选、是否考虑过其他方案、有没有意识到局限性

注意:论文里提到的所有技术名词,务必和资源包文档保持一致。比如写“MyBatis框架”,不要写成“Mybatis”;写“Tomcat 8.5”,不要写成“Tomcat服务器”。术语统一,是学术规范的第一步。

7. 常见问题与排查技巧实录:那些文档没写,但你一定会遇到的坑

即使按前面步骤操作,实战中仍会冒出各种“意料之外”的问题。我把带学生做毕设三年积累的高频问题,整理成这张速查表。这些问题,99%的官方文档都不会提,但你一定会撞上。

问题现象 根本原因 快速解决方法 预防技巧
启动Tomcat后,浏览器访问http://localhost:8080/Blog显示404 项目未正确部署到Tomcat的webapps目录,或上下文路径(Context Path)不是/Blog IDEA:右键项目 → Open Module SettingsFacetsWeb → 检查Web resource directory是否指向src/main/webappDeployment Descriptors是否指向src/main/webapp/WEB-INF/web.xml;然后Artifacts里确认输出路径是Blog.war 每次新建项目,第一时间检查Project Structure里的Web Facet配置,养成习惯
登录时输入正确账号密码,却提示“用户名或密码错误” UserDao.findByUsername()方法返回null,但数据库里明明有数据 检查UserMapper.xml<select>标签的resultType是否写错,比如写成com.blog.entity.UserEntity(不存在的类),导致MyBatis无法映射,返回null;或检查jdbc.propertiesjdbc.url末尾是否少了?useUnicode=true&characterEncoding=utf8,导致中文条件查询失效 UserDaoTest.java里写单元测试,单独调用findByUsername("admin"),看是否返回非null对象
发布文章后,前台首页看不到新文章,但后台管理列表里有 ArticleController.list()方法中,查询条件写错了,比如article.setStatus(1)(1代表已发布),但数据库里新文章的status字段是NULL0 打开db_blog3.sql,查找INSERT INTO article语句,确认初始数据的status值;然后检查ArticleMapper.xml<select>标签的WHERE条件,是否漏写了AND status = 1 在Navicat里直接执行SELECT * FROM article WHERE status = 1,验证SQL逻辑是否符合预期
上传头像或文章图片时,提示“文件上传失败”或空白页 spring-mvc.xmlCommonsMultipartResolvermaxUploadSize设得太小(默认102400字节=100KB),而一张手机照片往往2MB 打开spring-mvc.xml,找到<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">,添加属性:<property name="maxUploadSize" value="10485760" />(10MB) 开发阶段,把maxUploadSize设为10485760,上线前再根据需求调整
修改了web.xmlspring-mvc.xml,重启Tomcat后配置不生效 IDE的热部署(Hot Swap)未触发,或Tomcat缓存了旧的class文件 强制清理:IDEA → BuildClean and Rebuild Project;然后关闭Tomcat,删除Tomcat安装目录/work/Catalina/localhost/Blog整个文件夹;再重启 养成习惯:每次修改XML配置,必做“Clean Project + 删除work目录”两步

实操心得:我教学生一个终极排查法——日志即真理。当遇到任何异常,第一反应不是百度错误信息,而是打开IDEA底部的Run窗口,把整个启动日志复制出来,用Ctrl+F搜索关键词:ERRORExceptionCaused by。比如看到Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao',说明问题出在DAO层注入失败,立刻去检查UserDao接口有没有被@Mapper注解(本项目用XML,所以不用),以及spring-mybatis.xml<mapper>标签的basePackage是否包含com.blog.dao。日志里每一行,都是代码执行的足迹,顺着它走,没有找不到的bug。

8. 从练手到进阶:如何基于这个SSM博客做个性化扩展?

这个博客不是终点,而是你Java Web能力的“训练场”。当它稳稳跑起来后,下一步就是动手改造,把别人的项目,变成你自己的作品。我推荐三个由浅入深的扩展方向,每个都能写进简历,也能成为答辩亮点。

方向一:增强用户体验(前端微调)
目标:让博客看起来不像“教学Demo”。
- 添加富文本编辑器:替换article/edit.jsp里的<textarea>。下载wangEditor(轻量级,无jQuery依赖),解压后把dist目录放入WebContent/static/wangEditor,在JSP里引入CSS和JS,初始化编辑器,并把<textarea id="content">改成<div id="editor"></div>。关键是要把编辑器内容同步到表单提交:$("#submitBtn").click(function(){ $("#content").val(wangEditor.txt.html()); });。这样,你就能加粗、插入图片、设置字体了。
- 实现文章搜索:在首页加一个搜索框<input type="text" id="searchKey" placeholder="搜索文章标题...">,用Ajax调用/article/search?keyword=xxx。后端ArticleController.search()方法,用MyBatis的<where>动态SQL拼接:<where><if test="keyword != null and keyword != ''">title LIKE CONCAT('%', #{keyword}, '%')</if></where>。搜索功能虽小,但涉及前后端联调、动态SQL、Ajax异步,是绝佳的练手项目。

方向二:深化业务逻辑(后端增强)
目标:理解真实项目中的数据一致性。
- 添加文章阅读量统计:在article表加read_count INT DEFAULT 0字段;ArticleController.detail()方法里,查询文章后,执行articleService.updateReadCount(article.getId())ArticleServiceImpl.updateReadCount()里用UPDATE article SET read_count = read_count + 1 WHERE id = #{id}。注意:这里要用@Transactional保证更新原子性,避免并发时阅读量少计。
- 实现评论审核机制:给comment表加status TINYINT DEFAULT 0(0待审核,1已发布);后台管理页增加“评论审核”菜单,调用CommentService.audit(id, status);前台CommentController.list()查询时,WHERE条件加上AND status = 1。这个改动,让你第一次接触“状态机”思维。

方向三:接轨现代开发(架构演进)
目标:为未来Spring Boot铺路。
- 抽取公共配置:把jdbc.propertieslog4j.properties里的内容,迁移到application.yml(需引入spring-boot-configuration-processor依赖),体验YAML的层级优势。
- API化改造:把ArticleController.list()的返回值从String(视图名)改为@ResponseBody ResponseEntity<List<Article>>,前端用Vue或React调用/api/articles接口。这一步,就把MVC架构,自然过渡到前后端分离。

最后分享一个小技巧:每次扩展前,先用Git打一个标签。比如跑通初始版本后,执行git tag v1.0-initial;加完富文本,打git tag v1.1-wangEditor。这样,万一改崩了,一句git checkout v1.0-initial就能秒回安全状态。Git不是高级工程师的专利,是每个认真写代码的人,必备的安全带。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:这个资源包是一套开箱即用的个人博客系统,基于Spring+SpringMVC+MyBatis(SSM)搭建,专为Java新手和高校计算机专业学生准备。里面包含可直接导入IDEA或Eclipse运行的完整源码(Blog.zip和源代码【尚学堂·百战程序员】)、MySQL数据库脚本db_blog3.sql(支持一键导入)、多张系统界面截图(如2017-05-12_111024.png等)、配套讲解视频、毕业设计所需文档(开题报告、任务书、论文正文)、教学用PPT课件,以及尚学堂提供的JAVA学习辅助资料(如软件开发常用词汇手册、6000集课程大纲、实战指南等)。功能覆盖用户注册登录、文章发布与管理、分类与标签设置、评论互动等典型博客模块。所有内容结构清晰,部署简单:解压源码后配置好数据库连接即可启动;SQL文件已导出,适配主流MySQL版本;视频和文档按开发流程组织,方便边学边做。适合课程设计、毕设选题或自学练手,不需要额外找资料就能完成从编码、调试到写论文的全流程。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

更多推荐