9

我们刚刚升级了 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

4 回答 4

5

如果您不想更新所有 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  
于 2009-08-06T22:48:46.217 回答
5

几种方式:

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

    <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}">
    
于 2010-09-13T19:29:37.547 回答
3

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

这不会编译不是因为嵌套的引号,而是因为嵌套的标签。您不能在 fmt:message 标签的属性中使用 ac: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 标记之外的任何内容都被视为任意字节。

于 2010-09-13T19:05:02.010 回答
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}\'/>'/>">

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

于 2009-08-06T21:05:31.590 回答