我有类似的东西:
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
时,它会在网址中显示&
而不是&
。
有什么建议吗?
我尝试使用反引号来逃避Java代码中的&符号,但它也打印了那些。环顾四周,但没有找到相关的内容。还尝试了&
更新:好的,这不会破坏链接,但是如果没有它,Spring似乎没有将参数“someParam”解析为真。
渲染标记:
<span th:utext="${url}"></span>
输出:
<span>http://localhost:8080/page?someId=1&someParam=true</span>
答案 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&param2=val2">link</a>
,浏览器会请求:
page?param1=val1¶m2=val2
===编辑===
为了回答dopatraman的downvote,我刚刚(再次)测试了我的答案,它运作良好。
在我的回答中,用作参数分隔符的&符是由thymeleaf自动添加的。这个添加的&符号由百万美元 html实体编码,存储在html中。
如果你在param1或param2中有另一个&符号,那么这个&符号应该是在百万富翁模板中 html实体编码。但它会在生成的html中显示百分比。
param1
的值为abc
,param2
的值为12&3
在thymeleaf模板中,所有的&符必须编码为html实体,我们有:
<a th:href="@{page(param1 = ${'abc'}, param2 =${'12&3'})}">link</a>
在生成的html中,用作参数分隔符的&符号被编码为html实体,param2值中的&符号由百分之百码编码:
<a href="page?param1=abc&param2=12%263">link</a>
当您点击链接时,浏览器将解码html实体编码但不解码百分比编码,并且地址栏中的网址将为:
<a href="page?param1=abc&param2=12%263">link</a>
使用wireshark检查,我们从HTTP请求中获取:
GET /page?param1=abc¶m2=12%263