2026-07-10 13:56 网站建设 0 条评论

博客全新上线!基于 Java/Spring + Thymeleaf 编写

前言

之前这个博客一直都是放在 WordPress 上的。WordPress 全能、完善,的确是个好程序。——我一向喜欢臃肿的程序。直到后来一次,我又打开了 MyAdmin,才发现数据库里乱得一批,post 表里还有一堆 {unknown} 的孤立垃圾数据,而我甚至不知道它们是怎么产生的。于是乎,点了一下 LSCache 插件中的“清理数据库”,结果把我的草稿全都删除了。

到这里,自己造轮子就有两个原因了:

  1. 臃肿还是轻量真无所谓,但这数据库实在太脏了吧?
  2. 不仅脏,还打扫不干净。试着清理,反而还因为一个本应当无害的操作丢了数据。这样的大黑箱用起来我是真的害怕。

所以,我就开始学 Java 了。

记得当时是把各个编程语言比对了一番的。不选择 Python 单纯是因为之前学过一点 PY 只不过后来断掉了进度,想要重新开个头,所以选择了 Java。

学 Java 倒是有个小半年了,不过由于高中学业占用时间比较多(平常一周也就放一天的假),这一年下来其实也就学完了 JavaSE 外加 JavaWeb(SpringBoot、SQL)的入门罢了。

按理说我还得先把 Sping 全家桶学一遍。不过好在现在 AI 这么发达,实际上,SpringBoot 入完门就足以靠 VibeCoding 做项目了。而且按理说,能理清 controller,service/impl,dto,entity 等层的功能与关系,就足以 Vibe 出一个可维护的项目。

然后,就有了现在这个博客。

技术栈

总览

  • 后端框架:SpringBoot
  • 安全框架:SpringSecurity
  • 持久层:Spring Data JPA / Hibernate
  • MVC 层:JavaWeb
  • 数据库:MySQL 8
  • 模板引擎:Thymeleaf

SSR or CSR?

在服务端渲染(SSR)和前后端分离的架构(也就是 CSR)之间,我犹豫了一下。按理说,前后端分离的架构速度只会特别快,因为整个 HTML 的骨架不包含任何动态内容。但如果我选择 SSR 的话,我还得学习 React、Vue 等一系列新技术,显然具有一定学习成本。

而 SSR 架构就不需要担心什么难度问题(然而代价都是极慢的响应时间。一张 HTML 几乎需要 300ms 的时间生成),我这里使用了 Thymeleaf 作为模板渲染引擎。

Thymeleaf

Thymeleaf 是一个现代服务器端的 Java 模板引擎,主要用于生成 HTML 网页。

它最突出的特点是 “自然模板”:模板文件本身是标准的 HTML,可以直接在浏览器中打开并正确显示(显示的是示例数据或静态占位内容),而无需启动服务器。这是因为 Thymeleaf 通过额外的自定义属性(如 th:text、th:each)来标注动态部分,这些属性在浏览器中会被忽略,只有经过服务器处理后才会被替换成真实数据。

例如,页脚的备案号是动态获取的:

<span th:text="${theme.footerIcp != null and !#strings.isEmpty(theme.footerIcp) ? theme.footerIcp : '浙ICP备2026002806号-1'}">浙ICP备2026002806号-1</span>

其中,th:text 的值是一个三元条件表达式:

条件 ? 为真时的值 : 为假时的值

也就是上文提到的 Thymeleaf 的“自然模板”理念:

可以直接在浏览器中打开这个 HTML 文件,看到一个完整的备案号展示效果(使用默认值);而一旦放到服务器上运行,Thymeleaf 就会根据实际配置动态替换为真实备案号,保留相同的外观。

特点

MarkDown 编辑文章

本来想做成类似 Wp 那样区块的形式存储文章,不过再造一个区块化编辑器的学习成本又高了,而且通用性兼容性也低。所以选择数据库直接存储 MD 格式的文本。

没有引入啥编辑器,文章编辑页面是直接塞了一个 textarea 元素,Entity 直接存 MD 文本。

至于前台的 HTML 渲染,则是服务端调用 CommonMark 工具,将 MD 转换为 HTML 文本再塞给 Thymeleaf 模板文件里的插值表达式渲染。

鸣谢名单

DeepSeek-v4-pro

GPT-5.4

GPT-5.5

评论

欢迎留下你的看法

0
暂无评论
评论区加载中...