kotlinx.html是可在 Web 应用程序中用于构建 HTML 的 DSL。 它可以作为传统模板系统(例如JSP、FreeMarker等)的替代品。
kotlinx. html 分别提供了kotlinx-html-jvm 和 kotlinx-html-js库的DSL , 用于在 JVM 和浏览器 (或其他 javascript 引擎) 中直接使用 Kotlin 代码来构建 html, 直接解放了原有的 HTML 标签式的前端代码。这样,我们 也可以使用 Kotlin来先传统意义上的 HTML 页面了。 Kotlin Web 编程将会更加简单纯净。
提示: 更多关于kotlinx.html的相关内容可以参考它的 Github 地址 :https://github.com/Kotlin/kotlinx.html
要使用 kotlinx.html 首先添加依赖
dependencies {
def kotlinx_html_version = "0.6.3"
compile "org.jetbrains.kotlinx:kotlinx-html-jvm:${kotlinx_html_version}"
compile "org.jetbrains.kotlinx:kotlinx-html-js:${kotlinx_html_version}"
...
}
kotlinx.html 最新版本发布在 https://jcenter.bintray.com/ 仓库上,所以我们添加一下仓库的配置
repositories {
maven { url 'https://jitpack.io' }
mavenCentral()
jcenter() // https://jcenter.bintray.com/ 仓库
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
我们来写一个极简百度首页示例。这个页面界面如下图所示
![](data:image/png;base64,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)
前端 HTML 代码:
<!DOCTYPE html>
<html lang=zh-CN>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name=viewport content="width=device-width,initial-scale=1">
<title>百度一下</title>
<link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<link href="dsl.css" rel="stylesheet">
<script src="dsl.js"></script>
</head>
<body>
<div class="container">
<div class="ipad center">
![](http://upload-images.jianshu.io/upload_images/1233356-49a0fecdc8bfa9cf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
</div>
<form class="form">
<input id="wd" class="form-control ipad">
<button id="baiduBtn" type="submit" class="btn btn-primary form-control ipad">百度一下</button>
</form>
</div>
</body>
</html>
其中,dsl.css文件内容如下
.ipad {
margin: 10px
}
.center {
text-align: center;
}
dsl.js 文件内容如下
$(function () {
$('#baiduBtn').on('click', function () {
var wd = $('#wd').val()
window.open("https://www.baidu.com/s?wd=" + wd)
})
})
上面我们是通常使用的 HTML+JS+CSS 的方式来写前端页面的方法。现在我们把 HTML 部分的代码用Kotlin 的 DSL kotlinx.html 来重新实现一遍。
我们首先新建 Kotlin + Spring Boot 工程,然后直接来写 Kotlin 视图类HelloDSLView,代码如下:
package com.easy.kotlin.chapter14_kotlin_dsl.view
import kotlinx.html.*
import kotlinx.html.stream.createHTML
import org.springframework.stereotype.Service
@Service
class HelloDSLView {
fun html(): String {
return createHTML().html {
head {
meta {
charset = "utf-8"
httpEquiv = "X-UA-Compatible"
content = "IE=edge"
}
title("百度一下")
link {
href = "https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css"
rel = "stylesheet"
}
script {
src = "https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"
}
link {
href = "dsl.css"
rel = "stylesheet"
}
script {
src = "dsl.js"
}
}
body {
div(classes = "container") {
div(classes = "ipad center") {
img {
src = "https://www.baidu.com/img/bd_logo1.png"
width = "270"
height = "129"
}
}
form(classes = "form") {
input(InputType.text, classes = "form-control ipad") {
id = "wd"
}
button(classes = "btn btn-primary form-control ipad") {
id = "baiduBtn"
type = ButtonType.submit
text("百度一下")
}
}
}
}
}
}
}
相比之下,我们使用 DSL 的风格要比原生 HTML 要简洁优雅。关键是,我们的这个 HTML 是用 Kotlin 写的,这也就意味着,我们的 HTML 代码不再是简单的静态的前端代码了。我们完全可以直接使用后端的接口返回数据来给 HTML 元素赋值,我们也完全具备了(当然是完全超越了)诸如 JSP、Freemarker 这样的视图模板引擎的各种判断、循环等的语法功能,因为我们直接使用的是一门强大的编程语言 Kotlin 来写的 HTML 代码 。
然后,我们就可以直接在控制器层的代码里直接调用我们的 Kotlin 视图代码了:
@Controller
class HelloDSLController {
@Autowired
var helloDSLView: HelloDSLView? = null
@GetMapping("hello")
fun helloDSL(model: Model): ModelAndView {
model.addAttribute("hello", helloDSLView?.html())
return ModelAndView("hello")
}
}
为了简单起见,我们借用一下 Freemarker 来做视图解析引擎,但是它只负责原封不动地来传输我们的 Kotlin 视图代码。hello.ftl 代码如下:
${hello}
我们的源码目录如下
── src
├── main
│ ├── java
│ ├── kotlin
│ │ └── com
│ │ └── easy
│ │ └── kotlin
│ │ └── chapter14_kotlin_dsl
│ │ ├── Chapter14KotlinDslApplication.kt
│ │ ├── controller
│ │ │ └── HelloDSLController.kt
│ │ └── view
│ │ └── HelloDSLView.kt
│ └── resources
│ ├── application.properties
│ ├── banner.txt
│ ├── static
│ │ ├── dsl.css
│ │ ├── dsl.js
│ │ └── hello.html
│ └── templates
│ └── hello.ftl
└── test
├── java
├── kotlin
│ └── com
│ └── easy
│ └── kotlin
│ └── chapter14_kotlin_dsl
│ └── Chapter14KotlinDslApplicationTests.kt
└── resources
然后,启动运行 SpringBoot 应用,浏览器访问 http://127.0.0.1:8888/hello , 我们可以看到如下输出界面:
![](data:image/png;base64,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)
这就是 DSL 的精妙之处。我们后面可以尝试使用 kotlinx.html 来写Kotlin 语言的前端代码了。在做 Web 开发的时候,我们通常是使用 HTML + 模板引擎(Velocity、JSP、Freemarker 等)来集成前后端的代码,这让我们有时候感到很尴尬,要学习模板引擎的语法,还得应对 前端HTML代码中凌乱的模板引擎标签、变量等片段代码。
使用 Kotlin DSL 来写 HTML 代码的情况将完全不一样了,我们将重拾前后端集成编码的乐趣(不再是模板引擎套前端 HTML,各种奇怪的 #、<#>、${} 模板语言标签),我们直接把 更加优雅简单的 DSL 风格的HTML 代码搬到了后端,同时HTML中的元素将直接跟后端的数据无缝交互,而完成这些的只是 Kotlin(当然,相应领域的 DSL 基本语义模型还是要学习一下)。
提示:本节项目源码:https://github.com/EasyKotlin/chapter14_kotlin_dsl