尝试使用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 /选项卡/ 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>
输出:
<html><head><title>Test</title></head><body>name=Googleage=11description=Popular Search Engine test=value </body></html>
答案 0 :(得分:0)
在我看来,tagx正在被修剪以使编写标签更简单。最后一个新行最终会得到一个使用标签的空间,这可能是坏的。
虽然为什么不将文字放在标签中:
<jsp:text><span> ${name}=${value} </span></jsp:text>
或使用非中断空格:
这样你可以避免修剪,你应该得到你想要的结果。
答案 1 :(得分: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"> </span>
<span class="ex7">	</span>
这些是对我有用的唯一选择:
<span class="ex8"> </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=""/>
。如果还有其他选择,我很高兴在评论中听到它。
答案 2 :(得分:0)
我的文本仍然必须中断,所以我在<wbr>
之间的空格前添加了${...}
。
结果证明这在Internet Explorer中不起作用,问题出在这一行:
<%@ page trimDirectiveWhitespaces="true" %>
此问题已解决:
<%@ page trimDirectiveWhitespaces="false" %>