Using Thymeleaf 02:其他表达式、字面量、标签属性

Using Thymeleaf 02:其他表达式、字面量、标签属性

继续看Thymeleaf的表达式和字面量,模板引擎掌握好,渲染页面不发愁。

有了上一次的内容,最常用的${...}表达式就可以用起来了。这里再看一下其他几种表达式。

剩下的几种表达式

除了消息表达式暂时不涉及之外,看看剩下的几种表达式,也都比较常用和重要。

选择表达式*{...}

这个表达式与${...}的区别在于,${...}是直接从上下文中取属性,而*{...}是从一个特定的上下文中取属性,这个上下文就是th:object所在的标签内部,最常用的就是表单渲染:

<form action="" method="post" th:object="${animal}">
    <p th:text="*{username}">用户名</p>
    <p th:text="*{password}">密码</p>
</form>

这其中的th:text="*{username}"实际上相当于th:text="${animal.username}"。用来绑定表单非常方便。写这篇博客的时候,已经把新系统的用户注册功能编写完毕,其中就使用了这种表达式。

URL表达式@{...}

这个表达式搭配th:href来使用,用于动态生成URL。有如下几种用法:

  1. 可以用一个括号加在URL之后,其中可以放入一个或者多个键值对(用逗号隔开),用于生成URL参数,比如<p><a th:href="@{/account/login(error=${test})}">动态拼接的URL参数</a></p>,可以跳转到/account/login?error=testtext
  2. URL中的地址部分也可以使用变量拼接,比如<p><a th:href="@{${url}(error)}">动态拼接的URL参数</a></p>
  3. /开头的地址,会自动被拼接上服务器路径,对于Spring Boot来说,就是在application.properties中设置server.context-path=/xxx,就会自动拼接上/xxx的路径。
  4. 在路径最前边加上~,就不会以context-path添加到最前边,而是以服务器路径添加到前边,一般由于服务器路径就是域名,所以等于什么都不会添加。这种写法 可以保证就渲染~符号之后的路径,比如:@{~/path/to/something}

fragment表达式~{...}

这个在之前已经用过了,其中分为两部分,第一部分是模板名,然后两个冒号::,之后是模板中定义的fragment名称。在之前模板继承的地方已经用过了。

常量与默认值

最常使用到的就是一些常量,以及一些特殊的符号。

字面量

字面量之前学习过,这里再总结一下

  1. 字符串字面量用单引号'括起来。
  2. 数字字面量直接可以写数字
  3. 布尔值直接写true或者false。这里要注意的是如下两种情况:
  4. Null对象的字面量就是null
  5. 布尔值,数值,null本质上都是字符串,但没有加单引号,被解析成了其他类型。这三个本质上就是特殊的字面量符号(literal tokens)。对于仅仅由字母、数字、花括号、点、减号和下划线组成的字面量,可以不加单引号,常见于th:class=""中的类名。

字符串字面量拼接除了使用+,还可以使用|来包裹要拼接的字符串:

<p th:text="${testData} + ' ' + ${project}"></p>
<p th:text="|${testData} ${project}|"></p>

这两个渲染结果是一样的。

默认值

很多使用,如果取不到某个属性(即为null),希望可以显示一个默认值,这个时候就可以用到属于条件判断中的一种默认值表达式:

<p th:text="${exist}?: 'this does not exists'"></p>

这里如果existnull,就会渲染后边的默认值。

“什么都不干”运算符

这个运算符就是一个下划线_,其作用很类似之前的默认值运算符:

<p th:text="${exist}?:_">this does not exists</p>

这个渲染的效果与默认值完全相同,只不过是一种更明显的提示,即exist不存在也没有关系,这只是是一种设计上的考虑。

设置标签属性

这里的标签属性,就是指th:开头的一系列属性,除了特殊的一些用于控制(比如th:textth:utext)、循环,条件判断和fragment之外的属性,大部分都直接对应着一种HTML标签属性。

为一个HTML标签添加属性有两种方式:

  1. 为这个标签添加th:attr="key=value",其中的key是一个HTML原生标签属性,value为要设置的值。
  2. 直接使用HTML原生标签属性对应的th属性。

例如,为一个input标签添加value="owl"就有两种方式:

    <input type="text" th:attr="value='owl'">
    <input type="text" th:value="owl">

官网文档列出了所有属性标签。

除了标准的HTML标签之外,还支持任意自定义的标签,比如:

<div th:mycustom="saner">This is saner</div>

渲染出来的结果是:

<div mycustom="saner">This is saner</div>

可见灵活性非常高。

LICENSED UNDER CC BY-NC-SA 4.0
Comment