Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确转义JSP标记中的三重嵌套引号_Java_Jsp_Tomcat_Quotes_Jsp Tags - Fatal编程技术网

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

Java 如何正确转义JSP标记中的三重嵌套引号,java,jsp,tomcat,quotes,jsp-tags,Java,Jsp,Tomcat,Quotes,Jsp Tags,我们刚刚升级了Tomcat,而较新的Tomcat不喜欢标记中的嵌套引号,因此我们必须在单引号和双引号之间交替使用。比如说, 我们过去有 现在我们可以把它改成 如果引号是三重嵌套的,我该怎么办 上面的标记无法编译。我没有尝试过,但是在Java的其他地方,您可以只转义嵌套引号,然后转义双嵌套引号的\: <form id="search" action="<fmt:message key=\"<c:out value=\\\"${requestScope.sear

我们刚刚升级了Tomcat,而较新的Tomcat不喜欢标记中的嵌套引号,因此我们必须在单引号和双引号之间交替使用。比如说,

我们过去有


现在我们可以把它改成


如果引号是三重嵌套的,我该怎么办



上面的标记无法编译。

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


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

如果您不想只为tomcat升级更新所有jsp:s,请将系统属性设置为false

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

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

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

这不会编译,不是因为嵌套的引号,而是因为嵌套的标记。不能在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标记之外的内容都被视为任意字节。

有几种方法:

  • 如果您不需要对其进行XML转义,
    实际上是不必要的:

    
    
  • 具有一个
    var
    属性,该属性将结果存储在页面上下文中:

    
    
  • 对于
    是强制的情况(XML转义等等,但是我对消息键的XML转义的值表示怀疑),它还有一个
    var
    属性:

    
    

  • 这就是我们现在所做的。但是我们确实希望将JSP更改为兼容的。如上所述,您应该使用c:out标记的var属性,从而消除对c:set标记的需要。