有了上一次的内容,最常用的${...}
表达式就可以用起来了。这里再看一下其他几种表达式。
剩下的几种表达式
除了消息表达式暂时不涉及之外,看看剩下的几种表达式,也都比较常用和重要。
选择表达式*{...}
这个表达式与${...}
的区别在于,${...}
是直接从上下文中取属性,而*{...}
是从一个特定的上下文中取属性,这个上下文就是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>
可见灵活性非常高。