1. 为什么选择SpringBoot搭建网页?
SpringBoot已经成为Java开发者构建Web应用的首选框架,这绝非偶然。作为一个长期使用传统Spring MVC的开发者,我第一次接触SpringBoot时的感受可以用"惊艳"来形容。传统Spring项目需要配置大量的XML文件,光是搭建基础环境就要耗费半天时间,而SpringBoot让这一切变得异常简单。
SpringBoot的核心优势在于"约定优于配置"的理念。它内嵌了Tomcat服务器(默认版本是9.x),这意味着我们不再需要单独部署WAR包到外部Tomcat。我清楚地记得第一次用SpringBoot启动项目时,看到控制台输出"Tomcat started on port(s): 8080"时的惊喜——整个过程不到5分钟。
提示:内嵌Tomcat的版本可以通过pom.xml中的
<tomcat.version>属性修改,但建议保持默认,除非有特殊兼容性需求。
2. 环境准备与项目创建
2.1 开发工具选择
我强烈推荐使用IntelliJ IDEA Ultimate版(社区版也支持基础功能),配合以下环境:
- JDK 1.8或11(长期支持版本)
- Maven 3.6.3+
- SpringBoot 2.7.x(当前稳定版)
在IDEA中创建项目时,我习惯使用Spring Initializr(可直接在IDEA内置访问)。这里有个小技巧:如果网络连接Initializr不稳定,可以尝试使用阿里云的镜像服务(https://start.aliyun.com)。
2.2 关键依赖选择
创建项目时,必须勾选这两个starter:
- Spring Web:包含Spring MVC和嵌入式Tomcat
- Thymeleaf(可选):轻量级模板引擎,比JSP更现代
我的pom.xml通常会包含这些基础依赖:
xml复制<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
注意:devtools不是必须的,但它提供的热部署功能能极大提升开发效率。实际使用中,修改HTML/Java文件后按Ctrl+F9即可立即看到变化,无需重启服务。
3. 项目结构设计与核心代码
3.1 标准的Maven目录结构
一个规范的SpringBoot项目应该保持这样的结构:
code复制src/
├── main/
│ ├── java/
│ │ └── com/example/demo/
│ │ ├── DemoApplication.java # 启动类
│ │ ├── controller/ # 控制器
│ │ ├── service/ # 业务逻辑
│ │ └── model/ # 数据模型
│ └── resources/
│ ├── static/ # 静态资源(JS/CSS/图片)
│ ├── templates/ # 模板文件(Thymeleaf)
│ └── application.properties
3.2 编写第一个控制器
下面是一个完整的控制器示例,展示如何处理不同类型的请求:
java复制@Controller
public class HomeController {
// 处理GET请求
@GetMapping("/")
public String home(Model model) {
model.addAttribute("message", "欢迎来到SpringBoot世界!");
return "index"; // 对应templates/index.html
}
// 处理POST请求并接收参数
@PostMapping("/greet")
public String greet(@RequestParam String name, Model model) {
model.addAttribute("greeting", "你好, " + name + "!");
return "result";
}
// 返回JSON数据
@GetMapping("/api/data")
@ResponseBody
public Map<String, Object> getData() {
return Map.of("status", "success", "timestamp", System.currentTimeMillis());
}
}
3.3 Thymeleaf模板示例
在resources/templates/index.html中:
html复制<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>SpringBoot示例</title>
<link rel="stylesheet" th:href="@{/css/style.css}">
</head>
<body>
<h1 th:text="${message}">默认消息</h1>
<form action="/greet" method="post">
<input type="text" name="name" placeholder="输入你的名字">
<button type="submit">提交</button>
</form>
<script th:src="@{/js/main.js}"></script>
</body>
</html>
4. 配置与调优技巧
4.1 关键配置项
在application.properties中,我通常会设置这些参数:
properties复制# 服务器端口
server.port=8080
# Thymeleaf配置
spring.thymeleaf.cache=false # 开发时关闭缓存
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
# 静态资源路径(默认已包含这些)
spring.resources.static-locations=classpath:/static/,classpath:/public/
# 文件上传限制
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
4.2 开发效率提升技巧
-
热部署配置:
在IDEA中开启自动编译:- Settings → Build → Compiler → 勾选"Build project automatically"
- 按Ctrl+Shift+A,搜索"Registry",找到并勾选
compiler.automake.allow.when.app.running
-
Lombok集成(强烈推荐):
添加依赖后,可以大幅减少样板代码:xml复制<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>然后就可以这样写实体类:
java复制@Data @NoArgsConstructor @AllArgsConstructor public class User { private Long id; private String username; private String email; } -
接口测试技巧:
使用Postman或直接在浏览器地址栏测试:http://localhost:8080/http://localhost:8080/api/data
5. 常见问题与解决方案
5.1 启动时报端口冲突
如果看到Web server failed to start. Port 8080 was already in use,有三种解决方案:
- 终止占用8080端口的进程(如之前的SpringBoot实例)
- 修改
server.port为其他值(如9090) - 使用命令行参数覆盖配置:
java -jar your-app.jar --server.port=9090
5.2 静态资源无法加载
确保:
- 资源文件放在
src/main/resources/static/目录下 - 引用路径正确,例如:
html复制<!-- 正确 --> <link href="/css/style.css" rel="stylesheet"> <!-- Thymeleaf写法更推荐 --> <link th:href="@{/css/style.css}" rel="stylesheet">
5.3 模板引擎不生效
检查:
- 是否添加了正确的starter依赖
- 模板文件是否放在
templates/目录下 - 控制器返回的视图名称是否与模板文件名一致(不含后缀)
- 是否错误使用了
@RestController(它会直接返回字符串而不是视图)
6. 项目打包与部署
6.1 打包为可执行JAR
使用Maven命令:
bash复制mvn clean package
生成的jar包位于target/目录下,运行方式:
bash复制java -jar your-app.jar
6.2 生产环境建议配置
-
开启Gzip压缩(在application.properties中):
properties复制server.compression.enabled=true server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json -
配置连接池(如HikariCP):
properties复制spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.connection-timeout=30000 -
添加健康检查端点:
properties复制management.endpoints.web.exposure.include=health,info management.endpoint.health.show-details=always
7. 进阶扩展方向
当基础功能跑通后,可以考虑这些扩展:
- 用户认证:集成Spring Security
- 数据库访问:添加Spring Data JPA或MyBatis
- API文档:集成Swagger或SpringDoc OpenAPI
- 前端分离:改用Vue/React作为前端框架
- 缓存优化:集成Redis或Caffeine
我在实际项目中发现,SpringBoot与Vue的配合特别高效。可以通过vue-cli创建前端项目,然后配置代理将API请求转发到SpringBoot后端(开发模式下),生产环境则打包静态文件到SpringBoot的static目录。
