SpringMVC开发指南:从配置到测试的全面实践
立即解锁
发布时间: 2025-08-19 02:30:32 阅读量: 2 订阅数: 17 

Spring 6与Kotlin:深入指南
### Spring MVC 开发指南:从配置到测试的全面实践
#### 1. Spring MVC 配置
要在 Web 应用程序中启用 Spring MVC,需要进行一些初始配置,特别是针对 Web 部署描述符 `web.xml`。从 Spring 3.1 开始,在 Servlet 3.0 Web 容器中支持基于代码的配置,这为 `web.xml` 中的 XML 配置提供了替代方案。
配置 Spring MVC 对 Web 应用程序的支持,需要对 Web 部署描述符执行以下配置:
- 配置根 `WebApplicationContext`
- 配置 Spring MVC 所需的 Servlet 过滤器
- 配置应用程序内的调度 Servlet
在 Spring 中有多种实现方式,最简单的方法是扩展 `AbstractAnnotationConfigDispatcherServletInitializer`,示例代码如下:
```kotlin
package com.apress.prospring6.fourteen
import org.springframework.web.filter.CharacterEncodingFilter
import org.springframework.web.filter.HiddenHttpMethodFilter
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer
import jakarta.servlet.Filter
import java.nio.charset.StandardCharsets
class WebInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
override fun getRootConfigClasses(): Array<Class<*>> {
return arrayOf(BasicDataSourceCfg::class.java, TransactionCfg::class.java)
}
override fun getServletConfigClasses(): Array<Class<*>> {
return arrayOf(WebConfig::class.java)
}
override fun getServletMappings(): Array<String> {
return arrayOf("/")
}
override fun getServletFilters(): Array<Filter> {
val cef = CharacterEncodingFilter().apply {
encoding = StandardCharsets.UTF_8.name()
setForceEncoding(true)
}
return arrayOf(HiddenHttpMethodFilter(), cef)
}
}
```
在上述示例中,使用 `AbstractAnnotationConfigDispatcherServletInitializer` 类,是因为它包含了使用基于 Kotlin 的 Spring 配置来配置 Spring Web 应用程序所需方法的具体实现。
以下是重写的方法及其作用:
- `getRootConfigClasses()`:将使用此方法返回的配置类创建一个 `AnnotationConfigWebApplicationContext` 类型的根应用程序上下文。
- `getServletConfigClasses()`:将使用此方法返回的配置类创建一个 `AnnotationConfigWebApplicationContext` 类型的 Web 应用程序上下文。
- `getServletMappings()`:此方法返回的字符串数组指定了 `DispatcherServlet` 的映射(上下文)。
- `getServletFilters()`:此方法返回一个 `jakarta.servlet.Filter` 实现的数组,这些过滤器将应用于每个请求。
常见的 Spring MVC Servlet 过滤器如下表所示:
| 过滤器类全名 | 描述 |
| --- | --- |
| `org.springframework.web.filter.CharacterEncodingFilter` | 用于指定请求的字符编码 |
| `org.springframework.web.filter.HiddenHttpMethodFilter` | 为除 GET 和 POST 之外的 HTTP 方法(如 PUT)提供支持 |
#### 2. 创建第一个 Spring MVC 视图
在服务层和 Spring MVC 配置就绪后,我们可以开始实现第一个视图。这里将实现一个简单的视图,用于显示 `SINGER` 表中保存的所有歌手。
使用 Thymeleaf 来设计 HTML 页面,它是一个现代的服务器端 Java 模板引擎,适用于 Web 和独立环境,并且与 Spring 应用程序集成良好。要将 Thymeleaf 与 Spring Web 应用程序集成,需要将 Thymeleaf 库添加到类路径中。以下是项目的依赖:
- `jakarta.servlet-api` 库:是 Jakarta 项目的一部分,包含开发 Web 应用程序所需的所有接口、类和方法。版本 6.0.0 适用于与 Apache Tomcat 10 兼容的 Web 应用程序。
- `spring-webmvc`:包含开发 Spring Web 应用程序所需的所有接口和类。Spring Web MVC 基于 Servlet API 构建,是 Spring 框架的一部分。版本 6.x 与 Jakarta EE 9 兼容。
- `thymeleaf-spring6`:提供将 Thymeleaf 与 Spring 集成的所有接口和类。
#### 3. 配置 DispatcherServlet
下一步是配置 `DispatcherServlet`,通过创建一个配置类来定义 Spring Web 应用程序所需的所有基础设施 Bean。以下是基于 Kotlin 配置的类示例:
```kotlin
package com.apress.prospring6.fourteen
import org.springframework.context.annotation.Description
import org.springframework.web.servlet.DispatcherServlet
import org.springframework.web.servlet.ViewResolver
import org.springframework.web.servlet.config.annotation.*
import org.thymeleaf.extras.java8time.dialect.Java8TimeDialect
import org.thymeleaf.spring6.SpringTemplateEngine
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver
import org.thymeleaf.spring6.view.ThymeleafViewResolver
import org.thymeleaf.templatemode.TemplateMode
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = ["com.apress.prospring6.fourteen"])
open class WebConfig : WebMvcConfigurer, ApplicationContextAware {
private var applicationContext: ApplicationContext? = null
@Throws(BeansException::class)
override fun setApplicationContext(applicationContext: ApplicationContext) {
this.applicationContext = applicationContext
}
@Bean
open fun templateResolver() =
SpringResourceTemplateResolver().apply {
setApplicationContext(applicationContext!!)
prefix = "/WEB-INF/views/"
suffix = ".html"
templateMode = TemplateMode.HTML
isCacheable = false
}
@Bean
@Description("Thymeleaf Template Engine")
open fun templateEngine() = SpringTemplateEngine().apply {
addDialect(Java8TimeDialect())
setTemplateResolver(templateResolver())
setTemplateEngineMessageSource(messageSource())
enableSpringELCompiler = true
}
@Bean
@Description("Thymeleaf View Resolver")
open fun viewResolver() = ThymeleafViewResolver().apply {
templateEngine = templateEngine()
order = 1
}
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
super.addResourceHandlers(registry)
registry.addResourceHandler("/image
```
0
0
复制全文


