开发学院

您的位置:首页>教程>正文

教程正文

Thymeleaf 3.0教程:4 标准表达式语法(2)

4.3选择表达式(星号语法)

  变量表达式不仅可以写成${...},但也作为*{...}。

  但是有一个重要的区别:星号语法评估选定对象上的表达式,而不是整个上下文上的表达式。也就是说,只要没有选定的对象,美元和星号语法就完全一样。

  什么是选定对象?使用th:object属性的表达式的结果。让我们在用户资料(userprofile.html)页面中使用一个:

 <div th:object="${session.user}">
    <p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
    <p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
    <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
  </div>

  这完全等同于:

<div>
  <p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p>
  <p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
  <p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p>
</div>

  当然,美元和星号语法可以混合使用:

<div th:object="${session.user}">
  <p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
  <p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
  <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>

  当对象选择到位时,所选对象也将作为#object expression变量对美元表达式可用:

<div th:object="${session.user}">
  <p>Name: <span th:text="${#object.firstName}">Sebastian</span>.</p>
  <p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
  <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>

  如上所述,如果没有执行对象选择,美元和星号语法是等价的。

<div>
  <p>Name: <span th:text="*{session.user.name}">Sebastian</span>.</p>
  <p>Surname: <span th:text="*{session.user.surname}">Pepper</span>.</p>
  <p>Nationality: <span th:text="*{session.user.nationality}">Saturn</span>.</p>
</div>

4.4 链接地址

  由于它们的重要性,URL在网络应用程序模板中是一流的公民,Thymeleaf标准方言有一种特殊的语法,即@语法:@{...}

  有不同类型的网址:

  绝对地址: http://www.thymeleaf.org

  相对网址,可以是:

  相对页面: user/login.html

  上下文相关的: /itemdetails?id=3 (context name in server will be added automatically)

  相对于服务器: ~/billing/processInvoice (allows calling URLs in another context (= application) in the same server.

  协议相关网址: //code.jquery.com/jquery-2.0.3.min.js

  这些表达式的真正处理以及它们到将要输出的URLs的转换是通过在所使用的ITemplateEngine对象中注册的org.thymeleaf.linkbuilder.ILinkBuilder接口的实现来完成的。

  默认情况下,此接口的单个实现是在org.thymeleaf.linkbuilder.StandardLinkBuilder类中注册的,这对于离线(非网络)和基于Servlet应用程序接口的网络场景都足够了。其他场景(如与非ServletAPI网络框架的集成)可能需要链接生成器接口的特定实现。

 让我们使用这个新语法,th:href属性:

<!-- Will produce 'http://localhost:8080/gtvg/order/details?orderId=3' (plus rewriting) -->
<a href="details.html" 
   th:href="@{http://localhost:8080/gtvg/order/details(orderId=${o.id})}">view</a>

<!-- Will produce '/gtvg/order/details?orderId=3' (plus rewriting) -->
<a href="details.html" th:href="@{/order/details(orderId=${o.id})}">view</a>

<!-- Will produce '/gtvg/order/3/details' (plus rewriting) -->
<a href="details.html" th:href="@{/order/{orderId}/details(orderId=${o.id})}">view</a>

  这里需要注意的一些事情:

  th:href是一个修饰符属性,处理后,它将计算要使用的链接网址,并将该值设置为<a>标签的href属性。

  我们被允许为网址参数使用表达式(如您在orderId=${o.id})中所见。所需的网址参数编码操作也将自动执行。

  如果需要几个参数,这些参数将用逗号分隔: @{/order/process(execId=${execId},execType='FAST')}

  网址路径中也允许使用变量模板:@{/order/{orderId}/details(orderId=${orderId})}.

  以/(例如:/order/details)开头的相对URLs将自动以应用程序上下文名称作为前缀。

  如果cookies未启用或未知,可能会在相对URLs中添加一个";jsessionid=..." 后缀,以便保留会话。。这被称为网址重写,百里香叶允许您通过对网址使用Servlet API中的response.encodeURL(...)机制来插入自定义的rewriting过滤器。

  th:href属性允许我们在模板中有一个工作的静态href属性,这样我们的模板链接在直接为原型目的打开时仍然可以被浏览器导航。

  如同消息语法(#{...}),网址基础也可以是评估另一个表达式的结果:

<a th:href="@{${url}(orderId=${o.id})}">view</a>
<a th:href="@{'/details/'+${user.login}(orderId=${o.id})}">view</a>

  我们主页的菜单

  既然我们知道了如何创建链接网址,那么在主页上为网站的其他页面添加一个菜单怎么样?

<p>Please select an option</p>
<ol>
  <li><a href="product/list.html" th:href="@{/product/list}">Product List</a></li>
  <li><a href="order/list.html" th:href="@{/order/list}">Order List</a></li>
  <li><a href="subscribe.html" th:href="@{/subscribe}">Subscribe to our Newsletter</a></li>
  <li><a href="userprofile.html" th:href="@{/userprofile}">See User Profile</a></li>
</ol>

服务器根相对URLs

  服务器可以使用额外的语法来创建服务器根相关(而不是上下文根相关)URLs,以便链接到同一服务器中的不同上下文。这些URLs将被指定为@{~/path/to/something}

根相对URLs

4.5 片段

  片段表达式是表示标记片段并在模板中移动它们的简单方法。这允许我们复制它们,将它们作为参数传递给其他模板,等等。

  最常见的用途是使用th:insert或th:replace进行片段插入(更多信息请参见后面的章节):

<div th:insert="~{commons :: main}">...</div>

  但是它们可以在任何地方使用,就像任何其他变量一样:

<div th:with="frag=~{footer :: #main/text()}">
  <p th:insert="${frag}">
</div>

  在本教程的后面,有一整节专门讨论模板布局,包括对片段表达式的更深入的解释。