Thymeleaf 教程

URL 链接

由于其重要性,URL 在 Web 应用模板中是一个非常重要的功能,Thymeleaf 标准方言对其有一个特殊的语法,即 @ 语法,@{...} 表达式。

不同类型的 URL:

  • 绝对 URL:http://www.hxstrive.com

  • 相对 URL,可以是:

    • 相对页面:user/login.html

    • 上下文相关:/itemdetails?id=3(将自动添加服务器中的上下文名称)

    • 服务器相关:~/billing/processInvoice(允许在同一服务器的另一个上下文(=application)中调用URLs。

    • 协议相关URL://code.jquery.com/jquery-2.0.3.min.js

对这些表达式的真正处理以及将其转换为将被输出的 URL,是由 org.thymeleaf.linkbuilder.ILinkBuilder 接口的实现完成的,这些实现被注册到正在使用的 ITemplateEngine 对象。

默认情况下,org.thymeleaf.linkbuilder.StandardLinkBuilder 类注册了这个接口的单一实现,这对于离线(非web)和基于 Servlet API 的 wev 场景都足够了。其他场景(如:与非 Servlet API 的 Web 框架集成)可能需要链接生成器接口的特定实现。

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

<!-- 将生成‘http://localhost:8080/gtvg/order/details?orderId=3’(加上重写) -->
<a href="details.html" 
   th:href="@{http://localhost:8080/gtvg/order/details(orderId=${o.id})}">view</a>

<!-- 将生成‘/gtwg/Order/Details?orderID=3’(加上重写) -->
<a href="details.html" th:href="@{/order/details(orderId=${o.id})}">view</a>

<!-- 将生成‘/gtvg/order/3/details’(加上重写) -->
<a href="details.html" th:href="@{/order/{orderId}/details(orderId=${o.id})}">view</a>

这里是一些需要注意事项:

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

  • 我们允许对 URL 参数使用表达式(正如你在 orderId=${o.id} 中看到的那样),所需的 URL 参数编码操作也将被自动执行。

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

  • URL 路径中也允许使用变量模板,如:@{/order/{orderId}/details(orderId=${orderId})}。

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

  • 如果没有启用 cookie,或者还不知道这一点,可以在相对的 URL 上添加 ";jsessionid=..." 后缀,这样就可以保留会话。这被称为 URL 重写,Thymeleaf 允许你通过使用 Servlet API 中的 response.encodeURL(..) 机制为每个 URL 插入自己的重写过滤器。

  • th:href 属性允许我们在模板中(可选择)有一个有效的静态 href 属性,这样我们的模板链接,在原型设计中直接打开时仍然可以被浏览器浏览。

与消息语法(#{...})一样,基础 URL 也可以是另一个表达式的计算结果:

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

上面代码中,第一个 <a> 标签 URL 的基础值为 ${url} 表达式的计算结果。

主页菜单

现在我们知道了如何创建链接 URL,那么在我们的主页上为网站的一些其他页面添加一个小菜单?如下:

<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>

服务器根相对URL

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

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号