1. Обзор
В этом кратком руководстве мы рассмотрим, что нужно для создания простого проекта Spring MVC на языке Kotlin.
2. Мастер своего дела
Для конфигурации Maven нам нужно добавить следующие зависимости от Kotlin:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk</artifactId>
<version>1.8.22</version>
</dependency>
Нам также нужно добавить следующие Spring зависимости:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Чтобы скомпилировать наш код, нам нужно указать наш исходный каталог и настроить плагин Kotlin Maven в разделе сборки нашего pom.xml:
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>1.8.22</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
3. Веб-ресурсы
По умолчанию Spring Boot автоматически применяет веб-конфигурацию. Все, что нам нужно сделать, это разместить наши веб-ресурсы в нужных местах.
3.1. Статические ресурсы
Соответствующие статические ресурсы, такие как HTML, CSS, javascript и файлы изображений, расположены по 4 путям, и Spring будет искать их один за другим в таком порядке:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
Давайте создадим файл с именем index.html и поместим его в каталог src/main/resources/static:
<html>
<head>Home</head>
<body>
<h1>This is the body of the index view</h1>
</body>
</html>
3.2. Ресурсы шаблона
Мы можем интегрировать следующие шаблонизаторы в Spring Boot, просто добавив зависимость от maven:
- FreeMarker
- Groovy
- Thymeleaf
- Mustache
В нашем случае мы используем Thymeleaf, добавив следующую зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
По умолчанию для шаблонов используется путь к классу:/templates/. Теперь мы создаем файл с именем welcom.html и помещаем его в каталог src/main/resources/templates:
<html>
<head>Welcome</head>
<body>
<h1>This is the body of the welcome view</h1>
</body>
</html>
Ресурсы в каталоге шаблонов по умолчанию невидимы. При посещении мы получим сообщение об ошибке 404 http://localhost:8080/welcome.html. Нам нужно создать контроллер или добавить конфигурацию контроллера просмотра для страницы приветствия. Вот как настроить ее с помощью конфигурации аннотаций:
@Configuration
open class ApplicationWebConfig : WebMvcConfigurer {
override fun addViewControllers(registry: ViewControllerRegistry) {
registry.addViewController("/welcome").setViewName("welcome");
}
}
После запуска проекта мы сможем перейти на страницу приветствия по адресу http://localhost:8080/welcome.
4. Конфигурация Spring MVC без загрузки Spring Boot
Прежде чем интегрировать Spring Boot в наше приложение, нам нужно использовать либо конфигурацию аннотаций Kotlin, либо конфигурацию XML. И нам нужно использовать зависимость origin maven для Thymeleaf:
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring6</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
4.1. Конфигурация Kotlin
Настройка аннотаций довольно проста. Мы настраиваем контроллеры представлений, средство распознавания шаблонов и модуль разработки шаблонов. После этого мы можем использовать их для настройки средства распознавания представлений:
@EnableWebMvc
@Configuration
open class ApplicationWebConfig : WebMvcConfigurerAdapter(), ApplicationContextAware {
private var applicationContext: ApplicationContext? = null
override fun setApplicationContext(applicationContext: ApplicationContext?) {
this.applicationContext = applicationContext
}
override fun addViewControllers(registry: ViewControllerRegistry?) {
registry.addViewController("/welcome").setViewName("welcome");
}
@Bean
open fun templateResolver(): SpringResourceTemplateResolver {
return SpringResourceTemplateResolver()
.apply { prefix = "/WEB-INF/view/" }
.apply { suffix = ".html"}
.apply { templateMode = TemplateMode.HTML }
.apply { setApplicationContext(applicationContext) }
}
@Bean
open fun templateEngine(): SpringTemplateEngine {
return SpringTemplateEngine()
.apply { setTemplateResolver(templateResolver()) }
}
@Bean
open fun viewResolver(): ThymeleafViewResolver {
return ThymeleafViewResolver()
.apply { templateEngine = templateEngine() }
.apply { order = 1 }
}
}
Далее, Давайте создадим класс ServletInitializer. Класс должен расширить AbstractAnnotationConfigDispatcherservletinitializer. Это замена для традиционной конфигурации web.xml:
class ApplicationWebInitializer: AbstractAnnotationConfigDispatcherServletInitializer() {
override fun getRootConfigClasses(): Array<Class<*>>? {
return null
}
override fun getServletMappings(): Array<String> {
return arrayOf("/")
}
override fun getServletConfigClasses(): Array<Class<*>> {
return arrayOf(ApplicationWebConfig::class.java)
}
}
4.2. Конфигурация XML
Эквивалентом XML для класса ApplicationWebConfig является:
<beans xmlns="...">
<context:component-scan base-package="com.baeldung.kotlin.mvc" />
<mvc:view-controller path="/welcome.html" view-name="welcome"/>
<mvc:annotation-driven />
<bean id="templateResolver"
class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML" />
</bean>
<bean id="templateEngine"
class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
</bean>
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
<property name="templateEngine" ref="templateEngine" />
<property name="order" value="1" />
</bean>
</beans>
В этом случае мы должны указать настройки web.xml а также:
<web-app xmlns=...>
<display-name>Spring Kotlin MVC Application</display-name>
<servlet>
<servlet-name>spring-web-mvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-web-config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring-web-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
5. Заключение
В этой статье мы добавим поддержку Spring MVC и создадим простое HTML-представление на основе приложения Spring Boot с помощью Kotlin.
Оригинал статьи: https://www.baeldung.com/kotlin/spring-mvc-kotlin