2009-12-11 11 views
1

Essayez d'utiliser JSPX et de lancer un problème étrange. Texte à l'intérieur de jsp: le texte n'est pas censé être supprimé par les espaces, selon la documentation JSP, mais quand j'ai un élément jsp: text avec des espaces blancs au début d'un fichier tagx, lorsqu'il est utilisé dans les vues jspx, le les espaces disparaissent.jsp: texte perdant des espaces à l'intérieur de tagx

J'ai fait pas mal de recherches mais je n'arrive pas à trouver ce qui cause cela. J'ai vérifié que les mêmes instances de texte jsp: incluses directement dans la vue jspx fonctionnent correctement, mais mises dans un fichier tagx séparé, elles sont perdues.

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

EDIT: Voici un exemple de code. Notez que les espaces menant et suivant 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/onglets/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> 
+0

Si vous remplacez les espaces avec des points ou quelque chose, sont-ils conservés? Etes-vous sûr qu'il n'y a pas quelque chose d'autre autour de l'étiquette qui supprime les espaces? Les espaces en dehors de la balise sont-ils également supprimés ou est-ce uniquement les espaces de votre jsp: texte qui disparaît? – Brimstedt

+0

Notez que les balises de texte jsp: qui perdent leurs espaces sont directement sous la racine jsp: du fichier tagx, et rien ne les entoure dans le fichier jspx. Similaire jsp: les balises de texte qui se trouvent directement dans le fichier jspx conservent leurs espaces de début et de fin, mais pas celles du fichier tagx. –

+0

Je ne suis pas très sûr de la nature du problème. Le "test = valeur" a des espaces dans la sortie. Les éléments t: nameValuePair n'ont pas d'espaces, ce qui est correct. La sortie semble correcte! Un commentaire que je pourrais faire est qu'il y a deux étiquettes de fermeture. – Joshua

Répondre

0

Il me semble que le TagX est d'être découpé pour le rendre plus simple d'écrire les étiquettes. Une nouvelle ligne à la fin finirait avec un espace où l'étiquette est utilisée et qui pourrait être mauvaise.

Bien pourquoi ne pas mettre votre texte dans la balise dans une période:

<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 que vous voulez .

+0

Je veux réellement émettre une source HTML avec la balise, pas de contenu pouvant être rendu. En tant que tel, l'inclusion d'un élément ou d'une entité   semble incorrecte. –

+0

Ensuite, vous devriez probablement envisager d'écrire les balises sans utiliser jspx et le faire en utilisant une classe afin que vous puissiez contrôler votre sortie plus. Bien que je me demande où vous voulez utiliser la source? Est-ce pour une source de sauvegarde, je peux comprendre que c'est un problème, mais si c'est pour l'affichage sur l'écran, cela n'a pas d'importance. – Knubo

0

J'ai eu ce problème avec perdre des espaces, aussi. J'utilise jspx Documents et un pré compilateur 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 changement de jsp.

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 le même comportement. Si vous essayez de préserver les espaces ne pas 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:

Par ailleurs,
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 dans XML qui aboutit à out.write (''); dans le jsp compilé.Mais l'espace insécable est préservé 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 non brisable n'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'en entendre parler dans les commentaires.