Skip to content

5.1 设置任意属性的值

假设我们的网站发布了一份新闻通讯(newsletter),并且希望用户能够订阅它,因此我们创建了一个 /WEB-INF/templates/subscribe.html 模板,其中包含一个表单:

html
<form action="subscribe.html">
  <fieldset>
    <input type="text" name="email" />
    <input type="submit" value="Subscribe!" />
  </fieldset>
</form>

与 Thymeleaf 的理念一致,这个模板一开始更像是一个静态原型,而不是一个 Web 应用的模板。首先,表单中的 action 属性静态地指向模板文件本身,没有为 URL 重写留下空间;其次,提交按钮的 value 属性显示的是英文文本,但我们希望它能够支持国际化。

这时就可以使用 th:attr 属性,它能够修改所在标签的任意属性值:

html
<form action="subscribe.html" th:attr="action=@{/subscribe}">
  <fieldset>
    <input type="text" name="email" />
    <input type="submit" value="Subscribe!" th:attr="value=#{subscribe.submit}"/>
  </fieldset>
</form>

其原理非常简单:th:attr 接受一个表达式,该表达式为某个属性赋值。在创建了相应的控制器和消息文件后,这个模板处理后的结果将是:

html
<form action="/gtvg/subscribe">
  <fieldset>
    <input type="text" name="email" />
    <input type="submit" value="¡Suscríbe!"/>
  </fieldset>
</form>

除了新的属性值之外,你还可以看到应用上下文名称(gtvg)已经自动添加到 URL 前面,变成了 /gtvg/subscribe,这一点在前一章已经解释过。

但如果我们希望同时设置多个属性呢?XML 规则不允许在一个标签中重复设置同一个属性,因此 th:attr 支持使用逗号分隔的多个赋值表达式,例如:

html
<img src="../../images/gtvglogo.png" 
     th:attr="src=@{/images/gtvglogo.png},title=#{logo},alt=#{logo}" />

在存在相应消息文件的情况下,这段代码将输出:

html
<img src="/gtgv/images/gtvglogo.png" title="Logo de Good Thymes" alt="Logo de Good Thymes" />