Sitio de una sola página en Kotlin y SpringBoot sin usar JSP

Descargo de responsabilidad

El autor no es programador, no puede codificar
No soy un gurú ni un especialista genial ni en Kotlin, ni en Spring, ni en ninguna otra tecnología utilizada en este artículo. Soy un joven Java normal que decidió probar Kotlin. Todo se hace en el Sapsan en la rodilla en la carretera con techtrain


Para quien


Para los desarrolladores de Java que acaban de enterarse de Kotlin, pero que aún no lo han tocado con sus manos


Para que


Para demostrar que kotlin funciona bien con el arranque de primavera, y en combinación con DSL en términos de trabajo con html, será más conveniente que el enfoque clásico con jsp.


Configuración para arranque de primavera


Aquí, todo no es muy diferente de Java


  1. Crear proyecto (kotlin)
  2. Agregue el repositorio jcenter, dependencia de kotlin-stdlib y spring-boot-starter-web, kotlin-maven-plugin
  3. Asegúrese de crear un paquete para trabajar, de lo contrario la primavera caerá
  4. Crear una clase de aplicación abierta
  5. En la aplicación, agregue el método principal con la línea runApplication <Application> (* args)
  6. Agregue un controlador HelloWorld que devolverá un saludo al mundo

Código
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>habr-sample</artifactId> <version>1.0-SNAPSHOT</version> <repositories> <repository> <id>jcenter</id> <name>jcenter</name> <url>https://jcenter.bintray.com</url> </repository> </repositories> <build> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>RELEASE</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> <configuration> <jvmTarget>1.8</jvmTarget> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>RELEASE</version> </dependency> </dependencies> </project> 

Clases
 package example import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication @SpringBootApplication open class Application fun main(args: Array<String>) { runApplication<Application>(*args) } 

 package example import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.ResponseBody @Controller class HelloWorld{ @RequestMapping("/") @ResponseBody fun mainPage(): String { return " " } } 

Añadir kotlinx.html


Kotlin tiene una extensión en forma de DSL para un trabajo conveniente con html. Le permite mezclar el enfoque declarativo de html con el enfoque imperativo de un lenguaje común.


 table {//  thead{ tr { td { +"" //+     } td { +"" } } } for (person in PersonGenerator().generate()) { // for  kotlin tr { td { +person.name } td { text(person.age) // "+"     String } } } } 

Este código formará una página html en la que habrá una placa con los nombres de las personas y su edad.


Resultado


Código
pom.xml
 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>habr-sample</artifactId> <version>1.0-SNAPSHOT</version> <repositories> <repository> <id>jcenter</id> <name>jcenter</name> <url>https://jcenter.bintray.com</url> </repository> </repositories> <build> <plugins> <plugin> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-maven-plugin</artifactId> <version>RELEASE</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> <configuration> <jvmTarget>1.8</jvmTarget> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib-jdk8</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-html-jvm</artifactId> <version>RELEASE</version> </dependency> </dependencies> </project> 

Clases
 package example data class Person(val name: String,var age: Int) 

 package example import java.util.* import kotlin.collections.ArrayList class PersonGenerator{ private val nameList = arrayOf("", "", "", "", "", ""); fun generate(): List<Person> { val random = Random() val personList = ArrayList<Person>() for (i in 1..15) { personList.add(Person(nameList.get(random.nextInt(nameList.size)), random.nextInt(30) + 18)) } return personList; } } 

 package example import kotlinx.html.* import kotlinx.html.stream.createHTML import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.ResponseBody @Controller class HelloWorld { @RequestMapping("/") @ResponseBody fun mainPage(): String { return createHTML() .html { body { table { thead() { tr { td { +"" } td { +"" } } } val personList= PersonGenerator().generate() for (person in personList ) { tr { td { +person.name } td { text(person.age) } } } } } } } } 

Añadir CSS


Kotlinx.html prácticamente no sabe cómo trabajar con CSS, con él puede agregar un enlace a un estilo ya terminado o insertar el suyo usando inseguro. Todo se vuelve mucho mejor si agrega Aza-Kotlin-CSS - DSL agregando trabajo con css


 head { //  bootstrap styleLink("https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css") styleLink("https://cdn.datatables.net/1.10.19/css/dataTables.bootstrap4.min.css") //   style("text/css") { unsafe {//   unsafe kotlinx.html raw( Stylesheet { //     Aza-Kotlin-CSS table and td and th { color = 0xFC0Fc0 } }.render() ) } } meta { charset = "utf-8" } } 

Resultado


Trabajar con js también pasa por inseguro


Resumen


En mi opinión, escribir vista en DSL es más conveniente que en JSP. No es necesario que primero vaya a la base de datos, coloque el resultado del cálculo en un objeto intermedio, que luego extraeré en jsp. Puedo llenar mi jsp inmediatamente desde la base del código del proyecto sin pasar por la capa de abstracción que no necesito. Desafortunadamente, usé jsp solo en mi proyecto de mascota y no trato con el frente en absoluto. Me interesaría leer la opinión de profesionales sobre este tema.


Enlaces utiles


Un ejemplo de una etiqueta rosa desarrollada en un artículo.
Documentación de Kotlin
Documentación que conecta la bota de resorte a kotlin
Documentación de Kotlinx.html
Documentación Aza-Kotlin-CSS

Source: https://habr.com/ru/post/es422083/


All Articles