如何正确转义 JSP 标记中的三重嵌套引号

Posted

技术标签:

【中文标题】如何正确转义 JSP 标记中的三重嵌套引号【英文标题】:How to properly escape triple nested quotes in JSP tags 【发布时间】:2010-11-17 12:03:45 【问题描述】:

我们刚刚升级了 Tomcat,而新的 Tomcat 不喜欢标签中的嵌套引号,所以我们必须在单引号和双引号之间交替使用。例如,

我们曾经有过,

<form id="search" action="<fmt:message key="search.url"/>">

现在我们可以把它改成,

<form id="search" action="<fmt:message key='search.url'/>">

如果引号像这样三重嵌套怎么办,

<form id="search" action="<fmt:message key='<c:out value="$requestScope.search_url"/>'/>">

上面的标签不能编译。

【问题讨论】:

【参考方案1】:

几种方式:

    &lt;c:out&gt; 如果您不需要对其进行 XML 转义,则实际上没有必要:

    <form id="search" action="<fmt:message key='$requestScope.search_url'/>">
    

    &lt;fmt:message&gt; 有一个 var 属性,它将结果存储在页面上下文中:

    <fmt:message key="$requestScope.search_url" var="search_url" />
    <form id="search" action="$search_url">
    

    对于&lt;c:out&gt; 是强制性的情况(XML 转义等,但我质疑消息键的XML 转义值),它也有一个var 属性:

    <c:out value"$requestScope.search_url" var="search_url" />
    <fmt:message key="$search_url" var="search_url" />
    <form id="search" action="$search_url">
    

【讨论】:

【参考方案2】:

你可能早就解决了这个问题,但万一其他人遇到这个问题:

这不会编译不是因为嵌套的引号,而是因为嵌套的标签。您不能在 fmt:message 标记的属性中使用 c:out。但是,您可以通过设置一个临时变量来使其工作:

<c:set var="foo"><c:out value="$requestScope.search_url"/></c:set>
<form id="search" action="<fmt:message key='$foo'/>">

此外,将您的示例称为“三重”嵌套引号具有误导性。从 jsp 引擎的角度来看,围绕表单标签的 action 属性值的双引号字符的行为与引号不同。 $... EL 表达式之外的任何内容,或带有 known 前缀的 known jsp 标记之外的任何内容都被视为任意字节。

【讨论】:

如上所述,您应该使用 c:out 标签的 var 属性,而无需使用该 c:set 标签。【参考方案3】:

如果您不想更新所有 jsp:s 只是为了升级 tomcat,请将系统属性 "org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING" 设置为 false。

最简单的方法是编辑 catalina.sh 并将以下内容添加到 JAVA_OPTS:

-Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false  

【讨论】:

这就是我们现在所做的。但我们确实想更改我们的 JSP 以使其符合要求。【参考方案4】:

我没有尝试过,但在 Java 的其他地方,您可以转义嵌套引号,然后转义 \ 以获得双引号:

<form id="search" action="<fmt:message key=\"<c:out
    value=\\\"$requestScope.search_url\\\"/>\"/>">

编辑:由于它是一个属性,上面的方法可能不起作用,但类似的方法可能适用于单引号:

<form id="search" action="<fmt:message key='<c:out
    value=\'$requestScope.search_url\'/>'/>">

或者,使用方法调用并让它返回格式化的字符串...

【讨论】:

以上是关于如何正确转义 JSP 标记中的三重嵌套引号的主要内容,如果未能解决你的问题,请参考以下文章

递增循环是 R 中三重嵌套循环的正确方式

如何访问嵌套 JSP 标记文件中的父属性?

如何将命令参数中的引号转义到 sh -c? [复制]

使用/解析远程变量时如何正确转义单引号? [复制]

如何转义结尾带有引号的字符串

如何在类似 PostgreSQL 的查询中正确转义双引号?