1

尝试使用 JSPX 并遇到一个奇怪的问题。根据 JSP 文档,jsp:text 中的文本不应删除空格,但是当我在 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>
4

3 回答 3

0

在我看来,tagx 正在被修剪以使编写标签更简单。例如,最后的新行将以使用标签的空格结束,这可能很糟糕。

虽然为什么不将您的文本放在标签中:

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

或使用非中断空间:&nbsp;

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

于 2010-11-13T23:14:12.353 回答
0

我也遇到了丢失空格的问题。我正在使用 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>");

顺便一提。您会看到引用,它是 XML 中的一个不间断空格,导致 out.write(' '); 在编译好的jsp中。但是即使您看不到,也保留了不间断的空间。如果你这样做,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=""/>. 如果还有其他选择,我很高兴在评论中听到。

于 2016-10-14T09:05:24.040 回答
0

我的文字仍然必须中断,所以我在 s<wbr>之间的空格之前添加了${...}

事实证明这在 Internet Explorer 中不起作用,问题出在这一行:

<%@ page trimDirectiveWhitespaces="true" %>

这修复了它:

<%@ page trimDirectiveWhitespaces="false" %>
于 2019-07-02T11:12:46.263 回答