تنويهالمؤلف ليس مبرمجًا ، لا يمكنه الترميز
أنا لست خبيرًا أو متخصصًا رائعًا لا في Kotlin ، ولا في Spring ، ولا في أي تقنية أخرى مستخدمة في هذه المقالة. أنا شاب جافا عادي قرر تجربة kotlin. كل شيء يتم في Sapsan على الركبة على الطريق مع techtrain
لمن
لمطوري جافا الذين سمعوا للتو عن كوتلن ، لكنهم لم يلمسوها بعد بأيديهم
من اجل ماذا
لإظهار أن kotlin يعمل بشكل جيد مع التمهيد الربيعي ، وبالاقتران مع DSL من حيث العمل مع html ، سيكون أكثر ملاءمة من النهج الكلاسيكي مع jsp.
تكوين التمهيد الربيع
كل شيء مختلف قليلاً هنا عن جافا
- إنشاء مشروع (kotlin)
- أضف jcenter المستودع ، الاعتماد على kotlin-stdlib و spring-boot-starter-web ، kotlin-maven-plugin
- تأكد من إنشاء حزمة للعمل ، وإلا سوف يسقط الربيع
- قم بإنشاء فئة تطبيق مفتوحة
- في التطبيق ، قم بإضافة الطريقة الرئيسية مع تشغيل الخط Application <Application> (* args)
- أضف جهاز تحكم HelloWorld الذي سيعيد تحية إلى العالم
كود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>
فصول 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 " " } }
أضف kotlinx.html
Kotlin لديه امتداد في شكل DSL للعمل المريح مع html. يسمح لك بخلط النهج التعريفي لـ html مع النهج الحتمي للغة مشتركة.
table {// thead{ tr { td { +"" //+ } td { +"" } } } for (person in PersonGenerator().generate()) { // for kotlin tr { td { +person.name } td { text(person.age) // "+" String } } } }
سيشكل هذا الرمز صفحة html تحتوي على لوحة بها أسماء الأشخاص وأعمارهم
كود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>
فصول 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) } } } } } } } }
أضف Css
لا يعرف Kotlinx.html عمليًا كيفية العمل مع css ، حيث يمكنك إضافة رابط إلى نمط جاهز أو إدراج نمط خاص بك باستخدام غير آمن. يصبح كل شيء أفضل بكثير إذا قمت بإضافة Aza-Kotlin-CSS - DSL مضيفا العمل مع 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" } }
العمل مع شبيبة يمر أيضا غير آمنة
الملخص
في رأيي ، تعد طريقة عرض الكتابة على DSL أكثر ملاءمة من JSP. لست بحاجة إلى الدخول أولاً إلى قاعدة البيانات ، ووضع نتيجة الحساب في كائن وسيط ، والذي سأقوم بعد ذلك بسحبه في jsp. يمكنني على الفور ملء ملف jsp الخاص بي من قاعدة كود المشروع بتجاوز طبقة التجريد التي لا أحتاجها. لسوء الحظ ، استخدمت jsp فقط في مشروع الحيوانات الأليفة الخاص بي ولا أتعامل مع الجبهة على الإطلاق. سأكون مهتماً بقراءة رأي المهنيين حول هذه القضية.
روابط مفيدة
مثال على الملصق الوردي الذي تم تطويره في مقالة
وثائق Kotlin
الوثائق التي تربط التمهيد الربيعي مع kotlin
وثائق Kotlinx.html
توثيق Aza-Kotlin-CSS