2009-08-06 39 views
9

Acabamos de actualizar Tomcat y al nuevo Tomcat no le gustan las comillas anidadas en la etiqueta, por lo que debemos alternar entre comillas simples y dobles. Por ejemplo,Cómo escapar correctamente las comillas anidadas triples en las etiquetas JSP

Solíamos tener,

<form id="search" action="<fmt:message key="search.url"/>"> 

Ahora podemos cambiarlo a,

<form id="search" action="<fmt:message key='search.url'/>"> 

¿Qué debo hacer si las citas son triplemente anidados como este,

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

La etiqueta anterior no se compila.

Respuesta

1

no ha intentado esto, pero en otros lugares en Java que sólo puede escapar de las comillas anidadas, y luego escapar de la \ para las comillas dobles-anidada:

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

Edit: Como se trata de un atributo, el anterior, probablemente no va a funcionar, pero un enfoque similar podría funcionar con comillas simples:

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

También puede utilizar una llamada a un método y tienen que devolver la cadena de formato ...

5

Si no lo hace quiero actualizar todas las jsp: s solo para la actualización de tomcat, establezca la propiedad del sistema "org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING" en falso.

La manera más fácil a esto es mediante la edición de catalina.sh y añadiendo lo siguiente a JAVA_OPTS:

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

Eso es lo que hacemos ahora. Pero queremos cambiar nuestro JSP para que cumpla. –

3

Usted probablemente mucho tiempo que soluciona este problema, pero en caso de cualquier otra persona ejecuta a través de esto:

Eso no se compila no por las comillas anidadas, sino por las etiquetas anidadas. No puede usar c: out dentro del atributo de la etiqueta fmt: message. Sin embargo, se puede conseguir que funcione mediante el establecimiento de una variable temporal:

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

También, llamando a su ejemplo "triple" anidados entre comillas es engañosa. Los caracteres de comillas dobles que rodean el valor del atributo de acción de su etiqueta de formulario NO se comportan como comillas desde el punto de vista del motor jsp. Cualquier cosa que esté fuera de una expresión EL de $ {...}, o fuera de una conocida etiqueta jsp con un prefijo conocido se trata como bytes arbitrarios.

+0

Como se mencionó anteriormente, debe usar el atributo var de la etiqueta c: out, eliminando la necesidad de esa etiqueta c: set. –

5

varias maneras:

  1. <c:out> en realidad no es necesario si no es necesario XML-escapar de ella:

    <form id="search" action="<fmt:message key='${requestScope.search_url}'/>"> 
    
  2. <fmt:message> tiene un atributo var que almacena el resultado en la página contexto:

    <fmt:message key="${requestScope.search_url}" var="search_url" /> 
    <form id="search" action="${search_url}"> 
    
  3. Para el caso <c:out> es obligatoria (XML escapar y así sucesivamente, que sin embargo cuestionar el valor de XML escapar de claves de mensaje), que tiene un atributo var así:

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