Как правильно экранировать тройные вложенные кавычки в тегах JSP - PullRequest
9 голосов
/ 07 августа 2009

Мы только что обновили 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 ]

5 голосов
/ 13 сентября 2010

Несколько способов:

  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}">
    
5 голосов
/ 07 августа 2009

Если вы не хотите обновлять все свои 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  
3 голосов
/ 13 сентября 2010

Вы, вероятно, давно решили эту проблему, но на случай, если кто-то еще столкнется с этим:

Это не компилируется не из-за вложенных кавычек, а из-за вложенных тегов. Вы не можете использовать c: out внутри атрибута тега fmt: message. Однако вы можете заставить его работать, установив временную переменную:

<c:set var="foo"><c:out value="${requestScope.search_url}"/></c:set>
<form id="search" action="<fmt:message key='${foo}'/>">

Кроме того, называть ваш пример «тройными» вложенными цитатами вводит в заблуждение. Символы двойной кавычки, окружающие значение атрибута action вашего тега формы, НЕ ведут себя как кавычки с точки зрения движка jsp. Все, что находится вне выражения $ {...} EL или вне известного jsp тега с известным префиксом, рассматривается как произвольные байты.

1 голос
/ 07 августа 2009

Я не пробовал этого, но в других местах 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}\'/>'/>">

Либо используйте вызов метода и верните отформатированную строку ...

...