代码之家  ›  专栏  ›  技术社区  ›  Alan Krueger

jsp:tagx中的文本丢失空白

  •  1
  • Alan Krueger  · 技术社区  · 15 年前

    尝试使用JSPX,遇到了一个奇怪的问题。JSP中的文本:根据JSP文档,文本不应该被删除空白,但是当我在一个tagx文件的开头有一个带有前导空白的jsp:text元素时,当在JSPX视图中使用时,前导空白会消失。

    我已经做了很多谷歌搜索,但找不到是什么导致这个被删除。我已经验证了jspx视图中直接包含的相同jsp:text实例是否正常工作,但是放入单独的tagx文件会导致它丢失。

    这在使用JSP 2.1库的Jetty 6.1.19和6.1.22下。

    编辑 :下面是一些示例代码。请注意,在 <jsp:text> 标签被剥离。根据我看到的JSP文档判断,应该保留其中的空白。

    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>
    

    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>
    

    输出:

    <html><head><title>Test</title></head><body>name=Googleage=11description=Popular Search Engine test=value </body></html>
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   Knubo    14 年前

    在我看来,TagX正在被剪裁,以便更简单地编写标记。例如,末尾的新行将以使用标记的空间结尾,这可能很糟糕。

    尽管为什么不将文本放在一个范围内的标记中:

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

    或使用不间断空间: &nbsp;

    这样你就可以避免修剪,得到你想要的结果。

        2
  •  0
  •   Janning Vygen    8 年前

    我也有失去空白的问题。我正在使用JSPX文档和预编译程序进行生产。但在我的开发机器中,每当JSP发生变化时,我都使用嵌入式Tomcat动态地重新编译JSPX文档。

    首先,我需要用预编译器和嵌入式Tomcat编译器实现相同的编译结果 web.xml

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

    激活此指令后,两者的行为相同。如果你试图保留空白 不要 这样做:

    <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>
    

    这些是我唯一的选择:

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

    生成的JSP编译如下所示:

    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>");
    

    顺便说一句。您可以在编译的JSP中看到引用,它是XML中不间断的空格,会导致out.write(“”)。但是,即使你看不到它,也会保留不间断的空间。如果你做了 hexdump -C test.jspx 你得到:

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

    右栏中的“.”显示不可打印字符“c2 a0”,即Unicode表示“不间断空格”。

    因为不间断的空间并不总是你想要的,你唯一的选择是 <c: out value=""/> . 如果还有其他选择,我很高兴在评论中听到。