¿Cómo producir HTML válido con JSPX?(no XHTML)
html5 (2)
JSPX es perfectamente adecuado para producir HTML y XHTML.
Todo se reduce a la comprensión de la naturaleza XML de este lenguaje. JSPX es XML, mientras que HTML no lo es. Una de las implicaciones es que el analizador JSPX "minimiza" las etiquetas vacías porque XML no diferencia entre las etiquetas de cierre automático y las vacías. Esto causa los problemas de las etiquetas <script...>
y <div></div>
. Sin embargo, vale la pena tener en cuenta que, si bien los archivos JSPX deben ser XML válidos, la salida que producen no lo hace . Por lo tanto, es perfectamente correcto tener un archivo JSPX que produzca HTML (no solo XHTML). De hecho, puede usar JSPX para producir cualquier salida textual como CSV, CSS o JS, aunque sería bastante inconveniente.
Teniendo en cuenta lo anterior, la solución más limpia parece estar creando un taglib personalizado con etiquetas como htmlScript, htmlDiv, etc. Estas etiquetas podrían usarse así:
<html:div styleClass="foo" selfClosing="false">${message}<html:div>
Su salida HTML contendría la etiqueta de cierre, independientemente del contenido:
<div style="foo"></div>
<div style="foo">Hello</div>
Un taglib como este te permitiría crear páginas HTML con JSPX sin utilizar soluciones bastante feas.
La creación de páginas HTML parece ser una de las aplicaciones más comunes de JSPX. Es algo sorprendente que no haya una biblioteca HTML estándar. JSF tiene uno, pero si usa JSP limpio no lo ayudará. Puede haber una biblioteca de terceros llenando este vacío, pero no pude encontrar ninguno.
Si no desea codificar su propio taglib, un enfoque alternativo es usar CDATA:
<![CDATA[<script type="text/javascript" src="/js/jquery-1.4.4.min.js">]]>
o:
<![CDATA[<script type="text/javascript" src="/js/jquery-1.4.4.min.js"></script>]]>
Otras propuestas en las preguntas relacionadas fueron poner un comentario o vacío <jsp:text>
dentro de <script>
que arroja el mismo resultado:
<script type="text/javascript" src="/js/jquery-1.4.4.min.js"><!-- Prevent self-closing --></script>
(como señaló Ralph, lo anterior no funciona con WebSphere) o:
<script type="text/javascript" src="/js/jquery-1.4.4.min.js"><jsp:text></jsp:text></script>
CDATA también es útil en algunos otros casos. Uno de ellos es la impresión del doctype HTML5 ( <!DOCTYPE html>
). JSPX no le permitirá colocar la declaración DOCTYPE dentro de su documento porque no es un XML válido. JSPX también define la etiqueta jsp: output pero imprime el atributo SYSTEM incluso cuando está vacío. Una solución alternativa es ajustar el DOCTYPE en CDATA al comienzo de una página:
<![CDATA[<!DOCTYPE html>]]>
CDATA también se puede usar para encapsular JavaScript en línea. Si bien esto produce un error de análisis debido al signo "<":
<script type="text/javascript">
var x = 7 < 5;
</script>
esto funcionará bien:
<script type="text/javascript">
<![CDATA[
var x = 7 < 5;
]]>
</script>
Tenga en cuenta que CDATA en JSPX genera todo tal como está, pero aún evalúa expresiones EL. Por lo tanto, lo siguiente:
<![CDATA[
<jsp:expression>"asd " + "def"</jsp:expression>
${1 + 2}
]]>
produce:
<jsp:expression>"asd " + "def"</jsp:expression>
3
Espero que esto ayude :)
Al intentar crear una página HTML con JSPX, se enfrentarán las siguientes dificultades:
- JSPX minimiza las etiquetas que no queremos, por ejemplo
<div class="foo"></div>
convierte en<div class="foo"/>
que los navegadores interpretan de manera diferente - Las etiquetas JSPX deben estar cerradas, mientras que algunas etiquetas HTML deben permanecer sin cerrar, por ejemplo
<script...>
. El IE y Firefox no reconocen la etiqueta de cierre automático<script.../>
. - Especificar doctype HTML5 (
<!DOCTYPE html>
) - JavaScript en línea
Esta pregunta es una respuesta a algunos otros que todos se reducen al mismo problema. No pude encontrar una respuesta completa, así que estoy publicando el resultado de mis hallazgos.
Preguntas relacionadas:
La forma recomendada es:
<script type = "text / javascript">
// <! [CDATA [
//your javascript goes here
function myFuncy(){
if( a > b || a >= b && b && c){
X;
}
}
//]]>
</ script>