【问题标题】:How to properly escape triple nested quotes in JSP tags如何正确转义 JSP 标记中的三重嵌套引号
【发布时间】: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}"/>'/>">

上面的标签不能编译。

【问题讨论】:

    标签: java jsp tomcat quotes jsp-tags


    【解决方案1】:

    几种方式:

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

      <form id="search" action="<fmt:message key='${requestScope.search_url}'/>">
      
    2. &lt;fmt:message&gt; 有一个 var 属性,它将结果存储在页面上下文中:

      <fmt:message key="${requestScope.search_url}" var="search_url" />
      <form id="search" action="${search_url}">
      
    3. 对于&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}\'/>'/>">
      

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

      【讨论】:

        猜你喜欢
        • 2022-01-27
        • 2015-05-29
        • 2011-02-09
        • 2017-09-19
        • 2014-02-05
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多