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

ZZ *_*der 9 java quotes jsp tomcat jsp-tags

我们刚刚升级了Tomcat,而较新的Tomcat不喜欢标签中的嵌套引号,因此我们必须在单引号和双引号之间切换.例如,

我们曾经有过,

<form id="search" action="<fmt:message key="search.url"/>">
Run Code Online (Sandbox Code Playgroud)

现在我们可以改成它,

<form id="search" action="<fmt:message key='search.url'/>">
Run Code Online (Sandbox Code Playgroud)

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

<form id="search" action="<fmt:message key='<c:out value="${requestScope.search_url}"/>'/>">
Run Code Online (Sandbox Code Playgroud)

上面的标记不能编译.

D. *_*ski 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  
Run Code Online (Sandbox Code Playgroud)


Bal*_*usC 5

几种方式:

  1. <c:out> 如果你不需要XML转义它实际上是没有必要的:

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

    <fmt:message key="${requestScope.search_url}" var="search_url" />
    <form id="search" action="${search_url}">
    
    Run Code Online (Sandbox Code Playgroud)
  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}">
    
    Run Code Online (Sandbox Code Playgroud)


Ric*_*ler 1

我还没有尝试过这个,但是在Java的其他地方你可以转义嵌套引号,然后转义双嵌套引号的\:

<form id="search" action="<fmt:message key=\"<c:out
    value=\\\"${requestScope.search_url}\\\"/>\"/>">
Run Code Online (Sandbox Code Playgroud)

编辑:由于它是一个属性,上面的方法可能不起作用,但类似的方法可能适用于单引号:

<form id="search" action="<fmt:message key='<c:out
    value=\'${requestScope.search_url}\'/>'/>">
Run Code Online (Sandbox Code Playgroud)

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