Spring Boot 整合 Web 开发全攻略
在 Web 开发中,Spring Boot 凭借其“约定大于配置”的思想,极大简化了传统 Spring 项目的繁琐配置。本文基于 Spring Boot 对 Web 开发的整合特性,详细讲解如何在 Spring Boot 中注册 Web 组件(Servlet、Filter、Listener)、管理静态资源以及使用 JSP 和 Thymeleaf 模板引擎,帮助开发者快速搭建 Web 应用。
一、Spring Boot 整合 Web 开发的优势
传统 Spring 项目开发 Web 应用时,需要在 web.xml
中手动配置 Servlet、Filter、Listener 等组件,还需处理依赖冲突、容器整合等问题。而 Spring Boot 通过以下特性简化了 Web 开发:
- 自动配置:默认整合 Tomcat 作为嵌入式容器,无需手动部署 WAR 包,直接以 JAR 包形式运行。
- 组件注册简化:通过注解或配置类即可注册 Web 组件,无需编写 XML 配置。
- 静态资源管理:内置静态资源目录,无需额外配置即可访问 CSS、JS、图片等资源。
- 模板引擎支持:推荐使用 Thymeleaf 作为动态页面模板,同时也支持 JSP(需额外配置)。
二、Web 核心组件注册
Web 组件(Servlet、Filter、Listener)是 Web 应用的基础,Spring Boot 提供了两种注册方式:注解扫描和配置类注册。
1. 注解扫描方式(推荐)
通过 @WebServlet
、@WebFilter
、@WebListener
注解标记组件,并在启动类添加 @ServletComponentScan
开启扫描,即可自动注册组件。
示例 1:注册 Servlet
// 定义 Servlet
@WebServlet("/first") // 映射访问路径
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println("First Servlet 执行...");
resp.getWriter().write("Hello Servlet");
}
}
示例 2:注册 Filter
// 定义 Filter
@WebFilter(urlPatterns = "/first") // 拦截路径
public class FirstFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("进入 First Filter");
chain.doFilter(request, response); // 放行请求
System.out.println("离开 First Filter");
}
}
示例 3:注册 Listener
// 定义 Listener
@WebListener
public class FirstListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Servlet 容器初始化完成...");
}
}
启动类开启扫描
@SpringBootApplication
@ServletComponentScan // 扫描 Web 组件注解
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
2. 配置类注册方式
若需动态配置组件(如动态指定路径、初始化参数),可通过配置类手动注册组件。
示例:配置类注册 Servlet
@Configuration
public class ServletConfig {
@Bean
public ServletRegistrationBean<SecondServlet> getServletRegistrationBean() {
// 注册 Servlet 实例
ServletRegistrationBean<SecondServlet> bean = new ServletRegistrationBean<>(new SecondServlet());
bean.addUrlMappings("/second"); // 设置访问路径
bean.setLoadOnStartup(1); // 启动优先级
return bean;
}
}
// 定义 Servlet(无需注解)
public class SecondServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.getWriter().write("Hello Second Servlet");
}
}
同理,可通过 FilterRegistrationBean
注册 Filter,ServletListenerRegistrationBean
注册 Listener,用法与 Servlet 注册类似。
三、静态资源管理
Spring Boot 对静态资源(CSS、JS、图片等)有默认的目录约定,无需额外配置即可访问。
1. 默认静态资源目录
Spring Boot 会自动扫描以下目录中的静态资源:
classpath:/static/
(推荐)classpath:/public/
classpath:/resources/
classpath:/META-INF/resources/
例如,在 src/main/resources/static/css/
下放置 style.css
,可通过 http://localhost:8080/css/style.css
直接访问。
2. 自定义静态资源目录
若需修改静态资源目录,可在配置文件中自定义:
# application.yml
spring:
web:
resources:
static-locations: classpath:/suibian/, classpath:/static/
# 自定义目录为 /suibian/,同时保留默认 /static/
⚠️ 注意:自定义目录会覆盖默认配置,若需保留默认目录需手动添加。
四、动态页面开发
Spring Boot 推荐使用 Thymeleaf 作为模板引擎,同时也支持 JSP(需额外配置)。
1. 使用 Thymeleaf(推荐)
Thymeleaf 是一款基于 HTML 的模板引擎,支持静态预览(无需启动服务器即可查看页面结构),与 Spring Boot 无缝整合。
步骤 1:添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
步骤 2:创建模板文件
在 src/main/resources/templates/
目录下创建 index.html
:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"> <!-- 引入 Thymeleaf 命名空间 -->
<head>
<title>Thymeleaf 示例</title>
</head>
<body>
<h1 th:text="${msg}">默认文本</h1> <!-- 动态替换文本 -->
</body>
</html>
步骤 3:编写控制器跳转
@Controller
public class PageController {
@GetMapping("/show")
public String showPage(Model model) {
model.addAttribute("msg", "Hello Thymeleaf"); // 传递数据到页面
return "index"; // 跳转至 templates/index.html
}
}
2. 使用 JSP(不推荐)
Spring Boot 对 JSP 支持有限,需手动配置 JSP 引擎和目录。
步骤 1:添加 JSP 依赖
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
步骤 2:创建 webapp 目录
在 src/main/
下创建 webapp/WEB-INF/jsp/
目录,放置 JSP 文件(如 myJsp.jsp
)。
步骤 3:配置视图解析器
# application.yml
spring:
mvc:
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
步骤 4:控制器跳转
@Controller
public class JspController {
@GetMapping("/jsp")
public String showJsp() {
return "myJsp"; // 跳转至 webapp/WEB-INF/jsp/myJsp.jsp
}
}
五、常见问题与解决方案
静态资源访问 404?
- 检查资源是否放在默认目录(
static
、public
等)或自定义目录中。 - 确认资源路径是否正确(如
http://localhost:8080/img/logo.png
对应static/img/logo.png
)。
- 检查资源是否放在默认目录(
Thymeleaf 模板无法解析?
- 检查模板文件是否在
templates
目录下。 - 确认控制器返回的视图名与模板文件名一致(不含
.html
后缀)。
- 检查模板文件是否在
JSP 页面无法访问?
- 确保已添加
tomcat-embed-jasper
依赖。 - 检查
webapp
目录是否被标记为 Web 资源目录(IDEA 中右键目录 →Mark Directory as
→Web Resource Directory
)。
- 确保已添加
总结
Spring Boot 整合 Web 开发通过自动配置和简化的组件注册方式,大幅降低了开发难度。本文介绍了 Web 组件注册(注解扫描与配置类两种方式)、静态资源管理(默认目录与自定义配置)以及动态页面开发(Thymeleaf 与 JSP),覆盖了 Web 开发的核心场景。
实际开发中,推荐使用 Thymeleaf 作为模板引擎,配合注解方式注册组件,既能享受静态预览的便捷,又能减少配置工作量。