如何正确转义 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】:几种方式:
<c:out>
如果您不需要对其进行 XML 转义,则实际上没有必要:
<form id="search" action="<fmt:message key='$requestScope.search_url'/>">
<fmt:message>
有一个 var
属性,它将结果存储在页面上下文中:
<fmt:message key="$requestScope.search_url" var="search_url" />
<form id="search" action="$search_url">
对于<c:out>
是强制性的情况(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 标记中的三重嵌套引号的主要内容,如果未能解决你的问题,请参考以下文章