如何设置包含Thymeleaf&符号的URL?

时间:2015-04-06 01:11:17

标签: java spring thymeleaf

我有类似的东西:

Locale defaultLocale = Locale.getDefault();
final Context ctx = new Context(defaultLocale);
String url = getHost() + "/page?someId=" + some.getId() + "&someParam=" + Boolean.TRUE;
ctx.setVariable("url", url);

final String htmlContent = templateEngine.process("theHtmlPage", ctx);

但是,当我查看生成的HTML以打印url时,它会在网址中显示&amp而不是&

有什么建议吗?

我尝试使用反引号来逃避Java代码中的&符号,但它也打印了那些。环顾四周,但没有找到相关的内容。还尝试了&

更新:好的,这不会破坏链接,但是如果没有它,Spring似乎没有将参数“someParam”解析为真。

渲染标记:

<span th:utext="${url}"></span>

输出:

<span>http://localhost:8080/page?someId=1&amp;someParam=true</span>

3 个答案:

答案 0 :(得分:3)

为了避免这种问题,而不是&#39;&#39;&#39;符号,您可以使用该符号的UTF代码,例如在使用UTF-8的情况下,

答案 1 :(得分:2)

Thymeleaf had a recent issue with encoding escapes,已在2.1.4中修复。

答案 2 :(得分:1)

最好使用专用的thymeleaf link url syntax

如果你想用两个参数构造和url并将其设置为href属性,你可以这样做:

<a th:href="@{page(param1 = ${param1}, param2 = ${param2})}">link</a>

生成的html将是:

<a href="page?param1=val1&amp;param2=val2">link</a>

,浏览器会请求:

page?param1=val1&param2=val2

===编辑===

为了回答dopatraman的downvote,我刚刚(再次)测试了我的答案,它运作良好。

在我的回答中,用作参数分隔符的&符是由thymeleaf自动添加的。这个添加的&符号由百万美元 html实体编码,存储在html中

如果你在param1或param2中有另一个&符号,那么这个&符号应该是在百万富翁模板中 html实体编码。但它会在生成的html中显示百分比

实施例(用百里香叶2.1.5.RELEASE测试):

param1的值为abcparam2的值为12&3

在thymeleaf模板中,所有的&符必须编码为html实体,我们有:

<a th:href="@{page(param1 = ${'abc'}, param2 =${'12&amp;3'})}">link</a>

在生成的html中,用作参数分隔符的&符号被编码为html实体,param2值中的&符号由百分之百码编码:

<a href="page?param1=abc&amp;param2=12%263">link</a>

当您点击链接时,浏览器将解码html实体编码但不解码百分比编码,并且地址栏中的网址将为:

<a href="page?param1=abc&amp;param2=12%263">link</a>

使用wireshark检查,我们从HTTP请求中获取:

GET /page?param1=abc&param2=12%263