五、Spring Boot 与 Web 开发
1. 简介
Spring Boot 是基于 Spring Framework 开发的一个框架,旨在简化配置,快速构建应用。它内嵌 Tomcat 等 servlet 容器,支持 RESTful API 开发,处理静态资源,以及集成视图层技术如 Thymeleaf 和 Freemarker。
2. Spring MVC 集成
Spring MVC 是 Spring Framework 中用于构建 Web 应用的核心组件。Spring Boot 通过自动配置和内置 Servlet 容器,显著简化了 Spring MVC 的配置和使用流程。以下是关于 Spring MVC 在 Spring Boot 中的集成的详细讲解。
2.1. 内嵌 Servlet 容器
Spring Boot 内置了多种 Servlet 容器,包括 Tomcat、Jetty 和 Undertow,允许开发者无需外部容器即可运行 Web 应用。
1. 内置 Tomcat
Tomcat 是 Spring Boot 的默认内嵌 Servlet 容器。通过在 pom.xml
中添加 spring-boot-starter-web
依赖,应用会自动配置 Tomcat 容器。
示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 切换到 Jetty 或 Undertow
如果需要使用其他 Servlet 容器,可以通过修改 pom.xml
文件,排除默认的 Tomcat 依赖,并添加所需容器的依赖。
示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
</dependency>
3. 启动应用
通过主应用类的 @SpringBootApplication
注解和 SpringApplication.run()
方法,启动应用时,内嵌的 Servlet 容器会自动启动并运行。
示例:
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
2.2. 默认配置
Spring Boot 提供了丰富的默认配置,简化了 Spring MVC 的使用。
1. 自动配置 DispatcherServlet
Spring Boot 自动配置 DispatcherServlet
,并将其映射到 /
路径,处理所有 HTTP 请求。这种默认配置无需手动设置,减少了开发者的工作量。
2.默认的视图配置
Spring Boot 默认支持基于 @RestController
的 RESTful API 开发,返回 JSON 数据。对于需要视图层的应用,可以通过配置视图解析器(如 Thymeleaf 或 Freemarker)来实现。
3. 静态资源处理
默认情况下,Spring Boot 可以处理位于 src/main/resources/static
目录下的静态资源文件,如 HTML、CSS、JavaScript 和图片。这些资源可以通过相应的 URL 访问,无需额外配置。
2.3. 启用 Spring MVC
要使用 Spring MVC 的完整功能,需要在项目中添加相应的依赖并进行配置。
1. 添加 Spring MVC 依赖
通过在 pom.xml
中添加 spring-boot-starter-web
依赖,启用 Spring MVC 功能。这个依赖包含了 Spring MVC 及其相关组件,如 DispatcherServlet
和视图解析器。
示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 创建 Spring MVC 控制器
使用 @Controller
和 @RequestMapping
注解创建控制器,处理 HTTP 请求并返回视图或数据。
示例:
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public String getAllUsers(Model model) {
List<User> users = userService.getAllUsers();
model.addAttribute("users", users);
return "users";
}
}
3. 配置视图解析器
在 application.properties
文件中配置视图解析器,指定视图的前缀和后缀。
示例:
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
2.4. 自定义配置
Spring Boot 允许开发者自定义 Spring MVC 的配置,以满足特定需求。
1. 使用 WebMvcConfigurer
通过实现 WebMvcConfigurer
接口,自定义 MVC 配置,如资源处理和默认 servlet。
示例:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}
}
2. 配置 DispatcherServlet
在 application.properties
中配置 DispatcherServlet
的映射路径,自定义其处理请求的范围。
示例:
spring.mvc.servlet.path=/api
2.5. 高级功能
1. 国际化
通过 MessageSource
和 LocaleResolver
实现国际化,使应用支持多语言。
示例:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasename("messages");
return source;
}
2. 拦截器
通过 HandlerInterceptor
实现拦截功能,执行请求前后的逻辑。
示例:
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Before handling the request");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("After handling the request");
}
}
3. 异常处理
通过 @ExceptionHandler
和 @ControllerAdvice
处理全局异常,统一返回错误响应。
示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ResponseEntity<?