由于其重要性,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 将被指定为@{~/path/to/something} 这样。