Question

Essayer d'utiliser JSPX et en cours d'exécution dans un étrange problème. Texte intérieur jsp: Le texte est censé ne pas être soumis à la suppression des espaces, selon la documentation JSP, mais quand j'ai un jsp: élément de texte par des espaces au début d'un fichier TagX, lorsqu'il est utilisé dans les vues JSPX, le leader des espaces disparaît.

Je l'ai fait un peu de recherche sur Google, mais ne peut pas trouver ce qui cause ce à supprimer. Je l'ai vérifié que le même jsp. Instances de texte inclus directement dans la vue JSPX fonctionne correctement, mais mis dans un fichier séparé TagX amène à être perdu

est sous Jetty 6.1.19 et 6.1.22 en utilisant JSP 2.1 bibliothèques.

EDIT : suit Quelques exemples de code. Notez que les espaces avant et arrière dans les balises <jsp:text> sont supprimés. A en juger par la documentation JSP je peux voir, les espaces à l'intérieur de ceux-ci devraient être conservés.

WEB-INF / tabs / nameValuePair.tagx:

<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page">
<jsp:directive.attribute name="name" type="java.lang.String" required="true"/>
<jsp:directive.attribute name="value" type="java.lang.String" required="true"/>
<jsp:text> ${name}=${value} </jsp:text>
</jsp:root>

test.jspx:

<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:t="urn:jsptagdir:/WEB-INF/tags">
<jsp:directive.page contentType="text/html; charset=ISO-8859-1" />

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <t:nameValuePair name="name" value="Google" />
        <t:nameValuePair name="age" value="11" />
        <t:nameValuePair name="description" value="Popular Search Engine" />
        <jsp:text> test=value </jsp:text>
    </body>
</html>

</jsp:root>

sortie:

<html><head><title>Test</title></head><body>name=Googleage=11description=Popular Search Engine test=value </body></html>
Était-ce utile?

La solution

Il me semble que le TagX est coupé pour le rendre plus simple d'écrire les tags. Une nouvelle ligne à la fin serait, par exemple, se retrouver avec un espace où la balise est utilisée et qui pourrait être mauvais.

Bien pourquoi ne pas mettre votre texte dans la balise dans un intervalle:

<jsp:text><span> ${name}=${value} </span></jsp:text>

Ou utilisez l'espace insécable: &nbsp;

De cette façon, vous évitez la garniture et vous devriez obtenir le résultat souhaité.

Autres conseils

J'ai eu ce problème avec perdre des espaces, aussi. J'utilise des documents JSPX et un compilateur pré pour la production. Mais dans ma machine de développement J'utilise un tomcat intégré pour recompiler les docs JSPX à la volée chaque fois que le jsp change.

Tout d'abord je devais obtenir les mêmes résultats de compilation avec le précompilateur et le compilateur tomcat embarqué avec cet extrait pour mon web.xml

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspx</url-pattern>
        <trim-directive-whitespaces>true</trim-directive-whitespaces>
    </jsp-property-group>
</jsp-config>

Avec cette directive activé à la fois ont le même comportement. Si vous essayez de préserver les espaces ne pas le faire comme ceci:

<span class="ex1"> </span>
<span class="ex2"><jsp:text> </jsp:text></span>
<span class="ex3"> <jsp:text><!-- keep --> </jsp:text></span>
<span class="ex4"><!--  keep --></span>
<span class="ex5"><span> </span> <!--  keep --></span>
<span class="ex6">&#032;</span>
<span class="ex7">&#009;</span>

Ce sont les seules options qui travaillent pour moi:

<span class="ex8">&#160;</span>
<span class="ex9"><c:out value=" " /></span>

La résultante Compilation de jsp ressemble à ceci:

out.write("<span class=\"ex1\"/>");
out.write("<span class=\"ex2\">");
out.write("</span>");
out.write("<span class=\"ex3\">");
out.write("</span>");
out.write("<span class=\"ex4\">");
out.write("</span>");
out.write("<span class=\"ex5\">");
out.write("<span/>");
out.write("</span>");
out.write("<span class=\"ex6\"/>");
out.write("<span class=\"ex7\"/>");
out.write("<span class=\"ex8\">");
out.write(' ');
out.write("</span>");
out.write("<span class=\"ex9\">");
if (_jspx_meth_c_005fout_005f0(_jspx_th_ktr_005fform_005f0, _jspx_page_context))
  return true;
out.write("</span>");

Par ailleurs. Vous voyez la référence qui est un espace insécable en XML qui se traduit par out.write ( » « ); dans le jsp compilé. Mais l'espace insécable est preservered même si vous ne le voyez pas. Si vous faites un hexdump -C test.jspx vous obtenez:

6f 75 74 2e 77 72 69 74  65 28 27 c2 a0 27 29 3b  |out.write('..');|

".." dans les colonnes de droite montre les caractères non imprimables "c2 a0" qui est unicode pour "l'espace insécable".

Comme un espace insécable est pas toujours ce que vous voulez, votre seule option est <c: out value=""/>. S'il y a d'autres options, je suis heureux d'entendre parler dans les commentaires.

Mon texte avait encore à briser, donc j'ajouté <wbr> avant que les espaces entre les ${...}s.

Il s'avère que ne fonctionne pas dans Internet Explorer, et le problème était cette ligne:

<%@ page trimDirectiveWhitespaces="true" %>

Ce qu'il fixe:

<%@ page trimDirectiveWhitespaces="false" %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top