为什么升级到 Struts 6.3.0.2 后,Struts 标签中的转义不起作用

问题描述 投票:0回答:1

如果我有如下的 Struts 2 标签

<s:optiontransferselect
   leftTitle="<strong>All system groups</strong>">
</s:optiontransferselect> 

结果应该是所有系统组,但它出现带有

escapeHTML
的强标签,我尝试将
struts.ui.escapeHtmlBody
设置为false但不起作用。

jsp struts2 escaping freemarker struts-tags
1个回答
1
投票

struts.ui.escapeHtmlBody
设置仅允许在标签正文中切换转义选项。例如,如果您使用嵌套标签并允许转义标签正文中使用的所有标签。它不允许关闭 Struts 标签属性的转义值。

Struts 标签的内容是使用 Freemarker 生成的。最新版本的 Struts 使用其自动转义 html 输出功能,该功能在 Freemarker 中默认启用。

禁用自动转义

对于单个插值,您可以使用

?no_esc
禁用自动转义:

TEMPLATE
<#-- Let's assume we have "HTML" output format by default. -->
${'<b>test</b>'}  <#-- prints: &lt;b&gt;test&lt;/b&gt; -->
${'<b>test</b>'?no_esc}  <#-- prints: <b>test</b> -->

您还可以使用 noautoesc 指令禁用整个部分的自动转义:

TEMPLATE
${'&'}  <#-- prints: &amp; -->
<#noautoesc>
  ${'&'}  <#-- prints: & -->
  ...
  ${'&'}  <#-- prints: & -->
</#noautoesc>
${'&'}  <#-- prints: &amp; -->

就像输出格式一样,这只适用于块内的部分(“着色”逻辑)。

也可以在 ftl 标头中禁用整个模板的自动转义。然后可以使用 autoesc 指令重新启用某个部分:

TEMPLATE
<#ftl autoesc=false>
${'&'}  <#-- prints: & -->
<#autoesc>
  ${'&'}  <#-- prints: &amp; -->
  ...
  ${'&'}  <#-- prints: &amp; -->
</#autoesc>
${'&'}  <#-- prints: & -->

当转义被禁用时,您还可以强制转义单个插值,使用

?esc
:

TEMPLATE
<#ftl autoesc=false>
${'&'}  <#-- prints: & -->
${'&'?esc}  <#-- prints: &amp; -->

当然,autoesc 和

?esc
也可以在
noautoesc
块内工作。


现在您可以欺骗 Freemarker 禁用单个值的自动转义

<s:optiontransferselect
  leftTitle="%{"'<strong>All system groups</strong>'?no_esc"}" /> 
 

另一个选项是使用自定义模板来自定义 html 输出,使用自定义 Freemarker 模板,您可以在其中关闭自动转义。有关它的更多信息,您可以在主题和模板中找到。

© www.soinside.com 2019 - 2024. All rights reserved.