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

时间:2009-08-06 20:54:03

标签: java jsp tomcat quotes jsp-tags

我们刚刚升级了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 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

有几种方法:

    如果你不需要对它进行XML转义,
  1. <c:out>实际上是不必要的:

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

    <fmt:message key="${requestScope.search_url}" var="search_url" />
    <form id="search" action="${search_url}">
    
  3. 对于案例<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 :(得分: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标记之外的已知前缀都被视为任意字节。

答案 3 :(得分: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}\'/>'/>">

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