专栏首页全栈架构Spring Boot 与 kotlin 使用Thymeleaf模板引擎渲染web视图

Spring Boot 与 kotlin 使用Thymeleaf模板引擎渲染web视图

在《使用Spring Boot和Kotlin创建RESTfull API》一文中,我们完成了一个简单的RESTful 服务,体验了Spring Boot 与 kotlin结合的神力,但是往往我们也需要web的支持,那么本篇就在上一个文章的基础上介绍Spring Boot 与 kotlin 使用Thymeleaf模板引擎渲染web视图。

静态资源访问

在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源,使用Spring Boot 与 kotlin如何去支持这些静态资源?,很简单。

默认配置

Spring Boot默认提供静态资源目录位置需置于 classpath下,目录名需符合如下规则:

/static
/public
/resources
/META-INF/resources

例如:我们可以在src/main/resources/目录下创建static文件夹,在该位置放置一个图片文件 rubg.jpg。启动程序后,尝试访问http://localhost:8080/ruby.jpg。如能显示图片,配置成功。

渲染Web页面

之前通过 @RestController处理请求,返回的内容为json对象。如果需要渲染 html页面,要如何实现呢?

模板引擎

SpringBoot推荐的模板引擎下,我们可以很快的上手开发动态网站。

SpringBoot提供了默认配置的模板引擎主要有以下几种:

Thymeleaf
FreeMarker
Groovy
Mustache

当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为: src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在后续各模板引擎的配置属性中查询并修改。

Thymeleaf

Thymeleaf是一个 XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于Apache License 2.0许可,由Daniel Fernández创建,该作者还是Java加密库Jasypt的作者。

Thymeleaf提供了一个用于整合 SpringMVC的可选模块,在应用开发中,你可以使用Thymeleaf来完全代替JSP或其他模板引擎,如FreeMarker等。Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型)上执行预先制定好的逻辑。

示例模板:

<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head lang="en">
    <meta charset="UTF-8" />
    <title>quanke.name</title>
</head>
<body>
<h1 th:text="${host}">Hello World</h1>
</body>
</html>

可以看到Thymeleaf主要以属性的方式加入到html标签中,浏览器在解析html时,当检查到没有的属性时候会忽略,所以Thymeleaf的模板可以通过浏览器直接打开展现,这样非常有利于前后端的分离。

在Spring Boot中使用Thymeleaf,只需要引入下面依赖,并在默认的模板路径 src/main/resources/templates下编写模板文件即可完成。

compile "org.springframework.boot:spring-boot-starter-thymeleaf:$spring_boot_version"

完整的 build.gradle

group 'name.quanke.kotlin'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.2.10'
    ext.spring_boot_version = '1.5.4.RELEASE'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version")

//        Kotlin整合SpringBoot的默认无参构造函数,默认把所有的类设置open类插件
        classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlin_version")
        classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version")
    }
}

apply plugin: 'kotlin'
apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin
apply plugin: 'org.springframework.boot'

jar {
    baseName = 'chapter11-5-1-service'
    version = '0.1.0'
}
repositories {
    mavenCentral()
}


dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    compile "org.springframework.boot:spring-boot-starter-web:$spring_boot_version"
    compile "org.springframework.boot:spring-boot-starter-thymeleaf:$spring_boot_version"
//    compile "com.fasterxml.jackson.module:jackson-module-kotlin:$kotlin_version"
    testCompile "org.springframework.boot:spring-boot-starter-test:$spring_boot_version"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"

}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

举个例子:通过Thymeleaf渲染一个页面。

import org.springframework.stereotype.Controller
import org.springframework.ui.ModelMap
import org.springframework.web.bind.annotation.RequestMapping

/**
 * Created by http://quanke.name on 2018/1/10.
 */
@Controller
class HelloController {

    @RequestMapping("/")
    fun index(map: ModelMap): String {
//        / 加入一个属性,用来在模板中读取
        map.addAttribute("host", "http://quanke.name")
        // return模板文件的名称,对应src/main/resources/templates/index.html
        return "index"
    }


}

默认在 src/main/resources/templates目录下增加 index.html文件

<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head lang="en">
    <meta charset="UTF-8" />
    <title>quanke.name</title>
</head>
<body>
<h1 th:text="${host}">Hello World</h1>
</body>
</html>

增加使用 kotlin语言实现的 SpringBoot启动方法:

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication


/**
 * Created by http://quanke.name on 2018/1/9.
 */

@SpringBootApplication
class Application

fun main(args: Array<String>) {
    SpringApplication.run(Application::class.java, *args)
}

如上页面,直接打开html页面展现Hello World,但是启动程序后,访问http://localhost:8080/,则是展示Controller中host的值:http://quanke.name,做到了不破坏HTML自身内容的数据逻辑分离。

更多 Thymeleaf的页面语法,还请访问Thymeleaf的官方文档查询使用。

Thymeleaf的默认参数配置

如有需要修改默认配置的时候,只需复制下面要修改的属性到 application.yml中,并修改成需要的值,如修改模板文件的扩展名,修改默认的模板路径等。

# Enable template caching.
spring.thymeleaf.cache=true 
# Check that the templates location exists.
spring.thymeleaf.check-template-location=true 
# Content-Type value.
spring.thymeleaf.content-type=text/html 
# Enable MVC Thymeleaf view resolution.
spring.thymeleaf.enabled=true 
# Template encoding.
spring.thymeleaf.encoding=UTF-8 
# Comma-separated list of view names that should be excluded from resolution.
spring.thymeleaf.excluded-view-names= 
# Template mode to be applied to templates. See also StandardTemplateModeHandlers.
spring.thymeleaf.mode=HTML5 
# Prefix that gets prepended to view names when building a URL.
spring.thymeleaf.prefix=classpath:/templates/ 
# Suffix that gets appended to view names when building a URL.
# spring.thymeleaf.suffix=.html  
# spring.thymeleaf.template-resolver-order= 
# Order of the template resolver in the chain. 
# spring.thymeleaf.view-names= 
# Comma-separated list of view names that can be resolved.

测试环境或者开发环境避免出现不可预期问题一般设置: spring.thymeleaf.cache=true

支持JSP的配置

Spring Boot并不建议使用,如果需要,参考此工程:JSP支持

总的来说 Kotlin 对于 SpringBoot 的支持非常好,只需要把Java语言的 SpringBoot使用,翻译成 kotlin就可以。

本文分享自微信公众号 - 全栈架构(keatingr),作者:全科

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot 与 Kotlin 使用MongoDB数据库

    下面就来简单介绍一下 MongoDB,并且通过一个例子来介绍 SpringBoot中对 MongoDB访问的配置和使用。

    全科
  • Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL

    之前介绍了一些Web层的例子,包括构建RESTful API、使用Thymeleaf模板引擎渲染Web视图,但是这些内容还不足以构建一个动态的应用。通常我们做A...

    全科
  • Spring Boot 与 Kotlin 验证web表单信息

    在做web开发的时候,我们需要验证表单,确认用户提交的信息是安全的,比如用户名不能超过多少位,密码不能少于多少位等等。

    全科
  • 基于 Next.js 和云开发 CMS 的内容型网站应用实战开发

    董沅鑫,云开发 CloudBase 团队研发工程师,侧重于前端工程化、node 服务开发,业余时间出没在 xin-tan.com。

    腾讯云开发TCB
  • 技术宅打造全能美剧播放器

    1:前言 看到有同仁发《权力的游戏》自动追剧脚本,老衲也来凑个热闹… 移动端最好的播放器非云播君莫属了,极速而方便,高清而无码,可惜最近资源被和谐,每次有美剧更...

    FB客服
  • 聊聊rocketmq的AllocateMessageQueueAveragelyByCircle

    本文主要研究一下rocketmq的AllocateMessageQueueAveragelyByCircle

    codecraft
  • 测试面试题集-Python编程题(1)

    使用while循环实现输出2 - 3 + 4 - 5 + 6 ... + 100 的和。

    ITester软件测试小栈
  • INTERVAL分区升级了,你知道吗?!

    辑手记: Oracle 11g新增的INTERVAL分区使得手工给RANGE分区添加新分区的工作变得异常简单,这也使得INTERVAL分区成为RANGE分区的最...

    数据和云
  • Android Studio注意事项

    Question-one:有时候从 Github 上拷贝人家的工程,运行会出现各种依赖包、版本包问题,比如buildToolsVersion某一个版本不存在,需...

    AlicFeng
  • Windows Server 2012 Server Core中安装活动目录

    在Windows Sever 2012中,我们可以自由的切换Server Core和GUI图形界面,相信在今后会有更多的服务我们会运行在Server Core当...

    李珣

扫码关注云+社区

领取腾讯云代金券