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

10

我们刚刚升级了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}"/>'/>">

上述标签无法编译。
4个回答

5
如果您不想为了升级tomcat而更新所有的jsp,请将系统属性 "org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING" 设置为false。
最简单的方法是编辑catalina.sh并将以下内容添加到JAVA_OPTS:
-Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false  

这是我们现在所做的。但我们确实想将我们的JSP更改为符合标准。 - ZZ Coder

5

有几种方法:

  1. <c:out> is actually not necessary if you don't need to XML-escape it:

    <form id="search" action="<fmt:message key='${requestScope.search_url}'/>">
    
  2. <fmt:message> has a var attribute which stores the result in page context:

    <fmt:message key="${requestScope.search_url}" var="search_url" />
    <form id="search" action="${search_url}">
    
  3. For the case <c:out> is mandatory (XML escaping and so on, I however question the value of XML escaping for message keys), it has a var attribute as well:

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

3

您可能早已解决了这个问题,但如果其他人遇到此问题:

这不是由于嵌套引号,而是由于嵌套标签导致编译失败。您不能在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表达式或带有已知前缀的已知 jsp标记之外的任何内容都被视为任意字节。

如上所述,您应该使用c:out标签的var属性,从而消除对c:set标签的需求。 - Dieter Hubau

1

我没有尝试过这个,但在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}\'/>'/>">

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接