Kotlin整合Vertx开发Web应用

码界逸云
• 阅读 5001

今天我们尝试Kotlin整合Vertx,并决定建立一个非常简单的Web应用程序,使用Kotlin和Vertx作为编程语言进行编码构建。

生成项目


  • 打开控制台窗口执行以下代码进行生成一个maven项目
mvn archetype:generate -DgroupId=com.edurt.kvi -DartifactId=kotlin-vertx-integration -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0.0 -DinteractiveMode=false
  • 修改pom.xml增加java和kotlin的支持
<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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.edurt.kvi</groupId>
    <artifactId>kotlin-vertx-integration</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>

    <name>kotlin-vertx-integration</name>
    <description>Kotlin Vertx Integration is a open source kotlin vertx integration example.</description>

    <!-- properties -->
    <properties>
        <!-- dependency -->
        <dependency.kotlin.version>1.2.71</dependency.kotlin.version>
        <dependency.vertx.ersion>3.4.1</dependency.vertx.ersion>
        <!-- plugin -->
        <plugin.maven.compiler.version>3.3</plugin.maven.compiler.version>
        <plugin.maven.javadoc.version>2.10.4</plugin.maven.javadoc.version>
        <plugin.maven.kotlin.version>1.2.71</plugin.maven.kotlin.version>
        <!-- environment -->
        <environment.compile.java.version>1.8</environment.compile.java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <jvmTarget>1.8</jvmTarget>
    </properties>

    <!-- dependencys -->
    <dependencies>
        <!-- kotlin -->
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-jdk8</artifactId>
            <version>${dependency.kotlin.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-reflect</artifactId>
            <version>${dependency.kotlin.version}</version>
        </dependency>
        <!-- vertx -->
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-core</artifactId>
            <version>${dependency.vertx.ersion}</version>
        </dependency>
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-web</artifactId>
            <version>${dependency.vertx.ersion}</version>
        </dependency>
    </dependencies>

    <!-- prerequisites -->
    <prerequisites>
        <maven>3.5.0</maven>
    </prerequisites>

    <!-- build -->
    <build>
        <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
        <plugins>
            <plugin>
                <artifactId>kotlin-maven-plugin</artifactId>
                <groupId>org.jetbrains.kotlin</groupId>
                <configuration>
                    <args>
                        <arg>-Xjsr305=strict</arg>
                    </args>
                    <compilerPlugins>
                        <plugin>spring</plugin>
                        <plugin>jpa</plugin>
                        <plugin>all-open</plugin>
                    </compilerPlugins>
                    <pluginOptions>
                        <option>all-open:annotation=javax.persistence.Entity</option>
                    </pluginOptions>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-allopen</artifactId>
                        <version>${plugin.maven.kotlin.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-noarg</artifactId>
                        <version>${plugin.maven.kotlin.version}</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>kapt</id>
                        <goals>
                            <goal>kapt</goal>
                        </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>src/main/kotlin</sourceDir>
                            </sourceDirs>
                            <annotationProcessorPaths>
                                <annotationProcessorPath>
                                    <groupId>org.springframework.boot</groupId>
                                    <artifactId>spring-boot-configuration-processor</artifactId>
                                    <version>${project.parent.version}</version>
                                </annotationProcessorPath>
                            </annotationProcessorPaths>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${plugin.maven.compiler.version}</version>
                <configuration>
                    <source>${environment.compile.java.version}</source>
                    <target>${environment.compile.java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>${plugin.maven.javadoc.version}</version>
                <configuration>
                    <aggregate>true</aggregate>
                    <!-- custom tags -->
                    <tags>
                        <tag>
                            <name>Description</name>
                            <placement>test</placement>
                            <head>description</head>
                        </tag>
                    </tags>
                    <!-- close jdoclint check document -->
                    <additionalparam>-Xdoclint:none</additionalparam>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

添加Vertx实例


  • 创建CoreVerticle类文件
package com.edurt.kvi.core

import io.vertx.core.AbstractVerticle
import io.vertx.core.Future
import io.vertx.core.Handler
import io.vertx.ext.web.Router
import io.vertx.ext.web.RoutingContext

class CoreVerticle : AbstractVerticle() {

    override fun start(startFuture: Future<Void>?) {
        val router = createRouter()
        val port = config().getInteger("http.port", 8080)
        vertx.createHttpServer()
                .requestHandler { router.accept(it) }
                .listen(port) { result ->
                    if (result.succeeded()) {
                        startFuture?.complete()
                    } else {
                        startFuture?.fail(result.cause())
                    }
                }
    }

    private fun createRouter() = Router.router(vertx).apply {
        get("/").handler(handlerRoot)
    }

    /**
     * create router instance
     */
    val handlerRoot = Handler<RoutingContext> { req ->
        req.response().end("Hello Kotlin Vertx Integration!")
    }

}
  • 设置启动类
package com.edurt.kvi

import com.edurt.kvi.core.CoreVerticle
import io.vertx.core.Vertx

class KotlinVertxIntegration

fun main(args: Array<String>) {
    val vertx = Vertx.vertx()
    vertx.deployVerticle(CoreVerticle::class.java.name)
}

以上操作在vertx.deployVerticle阶段执行了部署Verticle的操作,即部署CoreVerticle。

Kotlin整合Vertx开发Web应用

增加页面渲染功能


  • 修改pom.xml文件增加页面依赖
<dependency.slf4j.version>1.7.25</dependency.slf4j.version>

<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web-templ-thymeleaf</artifactId>
    <version>${dependency.vertx.ersion}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${dependency.slf4j.version}</version>
</dependency>
  • 增加页面渲染文件
package com.edurt.kvi.router

import io.vertx.ext.web.Router
import io.vertx.ext.web.RoutingContext
import io.vertx.ext.web.templ.ThymeleafTemplateEngine
import org.thymeleaf.templatemode.TemplateMode

class HomeViewRouter

fun index(r: Router) {
    val engine = ThymeleafTemplateEngine.create().setMode(TemplateMode.HTML)
    r.get("/index.html").handler { c ->
        render(c, engine, "templates/index.html")
    }
}

fun render(c: RoutingContext, engine: ThymeleafTemplateEngine, templ: String) {
    engine.render(c, templ) { res ->
        if (res.succeeded()) {
            c.response().end(res.result())
        } else {
            c.fail(res.cause())
        }
    }
}
  • 在templates/index.html目录下创建页面文件
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Kotlin Vertx Integration</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>

<body>
<p>Welcome To Kotlin Vertx Integration!</p>
</body>
</html>
  • 修改CoreVerticle增加页面跳转
package com.edurt.kvi.core

import com.edurt.kvi.router.index
import io.vertx.core.AbstractVerticle
import io.vertx.core.Future
import io.vertx.core.Handler
import io.vertx.core.Vertx
import io.vertx.core.http.HttpServerResponse
import io.vertx.ext.web.Router
import io.vertx.ext.web.RoutingContext

class CoreVerticle : AbstractVerticle() {

    override fun start() {
        val router = createRouter(vertx)

        // go to index page
        index(router)

        vertx.createHttpServer().requestHandler { handler -> router.accept(handler) }.listen(8080)

//        val port = config().getInteger("http.port", 8080)
//        vertx.createHttpServer()
//                .requestHandler { router.accept(it) }
//                .listen(port) { result ->
//                    if (result.succeeded()) {
//                        startFuture?.complete()
//                    } else {
//                        startFuture?.fail(result.cause())
//                    }
//                }
    }

    private fun createRouter() = Router.router(vertx).apply {
        get("/").handler(handlerRoot)
    }

    /**
     * create router instance
     */
    val handlerRoot = Handler<RoutingContext> { req ->
        req.response().end("Hello Kotlin Vertx Integration!")
    }

    fun createRouter(v: Vertx): Router {
        var router = Router.router(v)
        router.route("/").handler { c -> c.response().end("Hello Kotlin Vertx Integration!") }
        router.route("/index").handler { c -> c.response().html().end("Hello Kotlin Vertx Integration Page!") }
        return router
    }

    fun HttpServerResponse.html(): HttpServerResponse {
        return this.putHeader("content-type", "text/html")
    }

}

Kotlin整合Vertx开发Web应用

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
vertx web处体验+maven打包
pom.xml<?xmlversion"1.0"encoding"UTF8"?<projectxsi:schemaLocation"http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven4.0.0.xsd"xml
Stella981 Stella981
3年前
Kotlin学习笔记
1概述这篇文章首先会介绍Kotlin的特点,接着介绍Kotlin与Java的语法比较。2Kotlin特点一门现代化的编程语言可开发跨平台应用,web,Socket,安卓,js,NativeApp等静态编程语言,性能基本与原声Java相当100%兼容Java(说是兼容但实际上
Stella981 Stella981
3年前
Better Kotlin
本文由 南尘 授权转载发布第59次推文贺贺转眼间使用Kotlin已经有两个月了,时间不长,我也算搭上了Google宣布Kotlin作为官方支持语言的一波末班车。可能大家早已从纯Java开发Android转为了混合使用开发甚至是Kotlin开发,那你转向Kotlin的初衷又是什么呢?对于我,很简单,
Stella981 Stella981
3年前
Kotlin Primer·第五章·函数与闭包
国内目前已经有几家公司开始大规模使用Kotlin开发,沪江就是其中一个。本文来自沪江工程师之手,且看他怎么认识Kotlin,欢迎大家关注他的博客——http://kymjs.com/,也欢迎大家关注Kotlin中文博客http://www.kotliner.cn/函数与闭包的特性可以算是Kotlin语言最大的特性了
Stella981 Stella981
3年前
Spring Boot 与 Kotlin 上传文件
如果我们做一个小型的web站,而且刚好选择的kotlin和SpringBoot技术栈,那么上传文件的必不可少了,当然,如果你做一个中大型的web站,那建议你使用云存储,能省不少事情。这篇文章就介绍怎么使用kotlin和SpringBoot上传文件构建工程如果对于构建工程还不是很熟悉的可以参考《我的第一个Kotlin应用》
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Kotlin代码检查在美团的探索与实践
背景Kotlin有着诸多的特性,比如空指针安全、方法扩展、支持函数式编程、丰富的语法糖等。这些特性使得Kotlin的代码比Java简洁优雅许多,提高了代码的可读性和可维护性,节省了开发时间,提高了开发效率。这也是我们团队转向Kotlin的原因,但是在实际的使用过程中,我们发现看似写法简单的Kotlin代码,可能隐藏着不容忽视的额外开销。本文剖析了K
待兔 待兔
1年前
Kotlin扩展函数本质到底是什么?
Kotlin扩展函数本质到底是什么?先说点题外话。不知道各位朋友,你们的项目中,有没有用kotlin,但是安卓领域,新项目,几乎都是用kotlin写了。也许后端spring那一套,估计有很多老项目还是java,个人一点粗浅的看法,kotlin用过之后,是真