Найти в Дзене

Настройка Spring MVC с помощью Kotlin

Оглавление

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