有了上一次的内容,最常用的${...}表达式就可以用起来了。这里再看一下其他几种表达式。
剩下的几种表达式
除了消息表达式暂时不涉及之外,看看剩下的几种表达式,也都比较常用和重要。
选择表达式*{...}
这个表达式与${...}的区别在于,${...}是直接从上下文中取属性,而*{...}是从一个特定的上下文中取属性,这个上下文就是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。有如下几种用法:
- 可以用一个括号加在
URL之后,其中可以放入一个或者多个键值对(用逗号隔开),用于生成URL参数,比如<p><a th:href="@{/account/login(error=${test})}">动态拼接的URL参数</a></p>,可以跳转到/account/login?error=testtext。 URL中的地址部分也可以使用变量拼接,比如<p><a th:href="@{${url}(error)}">动态拼接的URL参数</a></p>。- 以
/开头的地址,会自动被拼接上服务器路径,对于Spring Boot来说,就是在application.properties中设置server.context-path=/xxx,就会自动拼接上/xxx的路径。 - 在路径最前边加上
~,就不会以context-path添加到最前边,而是以服务器路径添加到前边,一般由于服务器路径就是域名,所以等于什么都不会添加。这种写法 可以保证就渲染~符号之后的路径,比如:@{~/path/to/something}
fragment表达式~{...}
这个在之前已经用过了,其中分为两部分,第一部分是模板名,然后两个冒号::,之后是模板中定义的fragment名称。在之前模板继承的地方已经用过了。
常量与默认值
最常使用到的就是一些常量,以及一些特殊的符号。
字面量
字面量之前学习过,这里再总结一下
- 字符串字面量用单引号
'括起来。 - 数字字面量直接可以写数字
- 布尔值直接写
true或者false。这里要注意的是如下两种情况: Null对象的字面量就是null- 布尔值,数值,
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>
这里如果exist是null,就会渲染后边的默认值。
“什么都不干”运算符
这个运算符就是一个下划线_,其作用很类似之前的默认值运算符:
<p th:text="${exist}?:_">this does not exists</p>
这个渲染的效果与默认值完全相同,只不过是一种更明显的提示,即exist不存在也没有关系,这只是是一种设计上的考虑。
设置标签属性
这里的标签属性,就是指th:开头的一系列属性,除了特殊的一些用于控制(比如th:text,th:utext)、循环,条件判断和fragment之外的属性,大部分都直接对应着一种HTML标签属性。
为一个HTML标签添加属性有两种方式:
- 为这个标签添加
th:attr="key=value",其中的key是一个HTML原生标签属性,value为要设置的值。 - 直接使用
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>
可见灵活性非常高。