ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SpringBoot项目整合jetbrick-template

SpringBoot项目整合jetbrick-template

由于项目升级迁移,一些老的ssm项目需要迁移到springboot项目,其中涉及jetbrick-template的迁移整合;下面记录了迁移前后项目的结构,文件,配置对比和迁移所需要的步骤:

ssm项目对比springboot项目

传统SSM(Spring+SpringMVC+MyBatis) 是手动整合三大框架的经典 JavaEE 架构,SpringBoot是基于 SSM 的自动配置、开箱即用的快速开发框架,二者核心技术栈一致(都用 Spring 全家桶),但项目结构、配置文件、开发模式、部署方式却有不小差异;

核心定位与设计理念对比

维度传统 SSM 项目SpringBoot 项目
核心定位手动整合 Spring+SpringMVC+MyBatis,纯手动配置约定大于配置,自动整合 SSM,简化开发、快速搭建
设计理念全手动配置,灵活性高但繁琐自动配置 + 起步依赖,零 XML / 少 XML,开箱即用
适用场景老旧项目、需要极致自定义配置的项目新项目、微服务、快速迭代、云原生项目
核心优势配置完全可控,适配极特殊需求开发效率极高、无冗余配置、内置容器

项目目录结构对比

ssm:

ssm-project/
├── src/
│ └── main/
│ ├── java/ # 核心Java代码
│ │ └── com/xxx/
│ │ ├── controller/ # 控制层
│ │ ├── service/ # 业务层
│ │ ├── dao/ # 数据访问层
│ │ ├── entity/ # 实体类
│ │ └── config/ # 配置类(可选,大部分用XML)
│ ├── resources/ # 配置文件
│ │ ├── spring/ # Spring核心配置XML
│ │ ├── springmvc/ # SpringMVC配置XML
│ │ ├── mybatis/ # MyBatis配置XML
│ │ ├── jdbc.properties # 数据库连接配置
│ │ └── log4j.properties # 日志配置
│ └── webapp/ # WEB核心目录(SSM标志性目录)
│ ├── WEB-INF/
│ │ ├── web.xml # 核心部署描述符(必须配置)
│ │ └── lib/ # 依赖jar包(手动导入)
│ └── index.jsp # 页面文件
└── pom.xml # 手动导入所有依赖

springboot:

springboot-project/
├── src/
│ └── main/
│ ├── java/ # 核心Java代码(固定包扫描规则)
│ │ └── com/xxx/
│ │ ├── controller/ # 控制层
│ │ ├── service/ # 业务层
│ │ ├── mapper/ # DAO层(MyBatis)
│ │ ├── entity/ # 实体类
│ │ ├── config/ # 配置类(替代XML)
│ │ └── SpringbootApplication.java # 启动类(核心)
│ └── resources/ # 极简配置
│ ├── application.yml/application.properties # 唯一核心配置
│ ├── mapper/ # MyBatis映射文件(可选)
│ ├── static/ # 静态资源(js/css/img)
│ └── templates/ # 模板页面(Thymeleaf等)
└── pom.xml # 仅导入起步依赖

结构核心区别:

1.无 webapp 目录:SpringBoot 内置 Tomcat,彻底抛弃 WEB-INF/web.xml
2.必须有启动类:SSM 无启动类,靠容器加载;SpringBoot 通过main()方法启动
3.静态资源目录标准化:SpringBoot 固定static/templates,SSM 自定义
4.包扫描自动生效:SpringBoot 默认扫描启动类同级及子包,SSM 需手动配置

配置文件对比(最核心差异)

传统SSM有很多XML配置,SpringBoot是注解+单文件配置,几乎零XML。
1. 配置文件数量
传统 SSM:最少5+个XML配置文件
web.xml、applicationContext.xml、spring-mvc.xml、mybatis-config.xml、jdbc.properties
SpringBoot:1 个核心配置文件
application.yml / application.properties(90% 场景无需额外配置)
2. 核心配置对比
(1)web.xml 配置(SSM 必须,SpringBoot 彻底抛弃)
SSM 需要手动配置:前端控制器、监听器、编码过滤器、资源映射;
SpringBoot自动配置,无需一行 XML。
(2)框架整合配置
SSM:XML 中手动配置
数据源、SqlSessionFactory、Mapper 扫描、事务管理、MVC 视图解析器、包扫描;
SpringBoot:自动配置
导入mybatis-spring-boot-starter后,自动配置数据源、SqlSession、MVC、事务,只需在配置文件写数据库地址。
(3)配置文件格式
SSM:纯 XML + properties
SpringBoot:yml(推荐,层级清晰)/properties + 注解(@Configuration)

(4)配置示例(数据库连接)
SSM(XML+properties)
jdbc.properties
properties

jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=123456

applicationContext.xml(手动加载、手动配置数据源)
xml

<context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <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>

SpringBoot(单 yml 文件)
yaml

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test username: root password: 123456

无需创建 Bean,无需手动扫描,框架自动完成配置

依赖管理(Maven)对比

1. 传统 SSM
手动导入所有依赖:Spring 核心、SpringMVC、MyBatis、整合包、数据库驱动、连接池、日志、JSON 等;
必须手动管理版本兼容(比如 Spring5.x 搭配 MyBatis3.x),版本冲突会直接报错;
pom.xml 冗长,易漏包、错包。
2. SpringBoot
起步依赖(starter):导入一个spring-boot-starter-web,自动包含 Spring、SpringMVC、Tomcat、JSON 等所有依赖;
自动版本仲裁:父工程统一管理版本,绝对无版本冲突;
pom.xml 极简,只需导入业务相关依赖。

运行与部署方式对比

维度传统 SSMSpringBoot
运行方式必须依赖外部 Tomcat,打包成 war 包放到 webapps 下内置 Tomcat/Jetty,直接运行启动类 main 方法
打包格式war 包jar 包(内置容器,直接 java -jar 运行)
端口配置外部 Tomcat 的 server.xml 配置application.yml 直接写 server.port
部署难度繁琐,需安装配置 Tomcat极简,服务器有 Java 环境即可一键运行
微服务支持不支持,需手动改造天然支持微服务(SpringCloud)

注解使用对比

核心注解一致,但 SpringBoot简化了注解:

功能传统 SSMSpringBoot
启动加载无,靠 web.xml@SpringBootApplication(三合一)
包扫描<context:component-scan>自动扫描,无需注解
配置类@Configuration+XML@Configuration
控制层@Controller@Controller/@RestController
事务@Transactional完全一致
MyBatis 映射@Mapper+ XML 配置@Mapper/@MapperScan(自动配置)

@SpringBootApplication=@Configuration+@ComponentScan+@EnableAutoConfiguration

核心差异速记

  1. 结构:SSM 有webapp/WEB-INF/web.xml,SpringBoot 无,用启动类 + 扁平化结构;
  2. 配置:SSM 是 XML 配置地狱,SpringBoot 只用application.yml+ 注解;
  3. 依赖:SSM 手动导包管版本,SpringBoot 用starter 起步依赖自动管理;
  4. 运行:SSM 依赖外部 Tomcat,SpringBoot 内置容器,直接 jar 包运行;
  5. 本质:SpringBoot 不是新框架,是SSM 的自动化简化工具,核心技术完全一致

ssm项目迁移jetbrick-template到springboot项目

1.添加依赖

jetbrick-template没有提供spring starter适配

<dependency> <groupId>com.github.subchen</groupId> <artifactId>jetbrick-template-springmvc</artifactId> <version>2.1.8</version> </dependency>

2.添加configuration配置类

由于jetbrick-template没有提供spring starter适配,不支持自动配置,所以添加配置类:这个类的作用是通知spring,我用的是jetbrick模版,帮我集成进mvc;

具体实现步骤:

1.创建注册视图解析器(让 Controller 返回字符串时,知道去渲染 Jetbrick 模板);

2.同时还创建 JetEngine(让 Spring 启动模板引擎);

package com.sd.managesystem.config; import jetbrick.template.web.springmvc.JetTemplateViewResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; @Configuration public class JetbrickConfig { @Bean public JetTemplateViewResolver jetTemplateViewResolver() { JetTemplateViewResolver resolver = new JetTemplateViewResolver(); // 必须空! resolver.setPrefix(""); resolver.setSuffix(""); resolver.setContentType("text/html; charset=UTF-8"); resolver.setOrder(Ordered.HIGHEST_PRECEDENCE); return resolver; } }

3.添加配置属性文件

jetbrick-template.properties:放在启动类所在的模块;这个属性文件相当于jetbrick引擎的说明书, 引擎怎么运行、去哪里找模板、怎么编译、怎么输出页面。

#每次访问页面,都重新编译模板;生产环境需配置为none compile.strategy = always #使用类的静态方法时需要配置 jetx.import.classes=com.sd.managesystem.* #使用jetbrick自定义标签、自定义函数、全局方法时需要配置 jetx.autoscan.packages=com.sd.managesystem jetx.trim.directive.comments=true jetx.trim.directive.whitespaces=true jetx.trim.directive.comments.prefix=<!-- jetx.trim.directive.comments.suffix=--> jetx.trim.leading.whitespaces=true jetx.template.suffix=.html jetx.template.loaders = $templates jetx.input.encoding=utf-8 jetx.output.encoding=utf-8 # 模板放在 classpath:/templates/ $templates = jetbrick.template.loader.ClasspathResourceLoader $templates.root = /templates/ # SpringBoot 开发开启热加载 $templates.reloadable = true

4.写html文件

resource/templates/路径下写hello.html文件

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>${title}</title> </head> <body> <h1>${title}</h1> <p>当前时间:${now}</p> <h3>用户列表</h3> <ul> #for(user : users) <li>ID:${user.id} 姓名:${user.name}</li> <li>ID:${user.id} 姓名:${User.getName()}</li> #end </ul> </body> </html>

5.写controller类

package com.sd.managesystem.controller; import com.sd.managesystem.vo.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; @Controller public class HelloController { @GetMapping("/hello") public String index(Model model) { model.addAttribute("title", "Spring Boot 集成 Jetbrick 成功"); model.addAttribute("now", LocalDateTime.now()); List<User> userList = Arrays.asList( new User(1, "张三"), new User(2, "李四"), new User(3, "王五") ); model.addAttribute("users", userList); return "hello"; } }

运行代码,访问http://localhost:8080/hello

引入jetbrick-template:
jetbrick默认只在根路径(classpath:/)找配置文件,也就是项目的src/main/resources/;
如果放在了/resources/profile下;则需要在application.yml配置文件中指定路径:
jetbrick:
template:
config-location: classpath:profile/jetbrick-template.properties

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进