JSP Document / JSPX:什么决定了输出中如何删除制表符/空格/换行符?

我有一个很好地格式化的“JSP文档”(“XML in XML”),当生成网页并发送给用户时,会删除一些换行符。

现在真正奇怪的部分:显然“主”.jsp总是删除所有的换行符,但对于主.jsp中包含的任何后续.jsp,换行符似乎是随机删除的(有些是在那里,有些则不是)。

例如,如果我正在查看从Firefox提供的网页并要求“查看源代码” ,我会看到生成的内容。

那么,什么决定了什么时候/如何保留/删除换行符?

这只是我编写的一个例子……你可以强制使用.jsp来实现这个目的:

或这个:

  

我认为删除了换行符以节省带宽,但如果我想保留它们怎么办? 如果我想保留与.jsp文件中相同的XML缩进怎么办?

这可行吗?

编辑

按照skaffman的建议,我看了一下生成的.java文件,“main”没有很多out.write,但没有一个写标签或换行。 与该文件相反,我从主.jsp中包含的所有内容都有很多行,如:

 out.write("\t...\n"); 

所以我想我的问题保持完全相同:什么决定了输出中包含/删除标签/空格/换行符的方式?

根据JSP规范 :

JSP.6.2.3语义模型

为了清楚地解释空白的处理,我们遵循XSLT规范的结构。 处理JSP文档的第一步是识别文档的节点。 然后,从文档中删除所有只有空格的文本节点; 唯一的例外是jsp:text元素中的节点,这些节点是逐字保存的。 生成的节点将按以下各节中的说明进行解释。 模板数据可以直接传递给响应,也可以通过(标准或自定义)操作进行调解。

因此,如果要保留空格,则需要在包含所需的部分。

不是一个非常精确的答案,但根据这个消息 ,贾斯帕可能会这样做(我承认我没有检查自己):

我有一个搜索,并不认为之前已经问过这个。

我一直在把我的JSP页面写成XML文档(.jspx后缀),而且使用简洁的XML文档语法和(2.0之前的)遗留语法之间的一点点差异让人感到恼火的是换行符,或者缺少前任的。

处理后的XML文档会生成XHTML,其中标记通过间距或换行符不间断。

我完全理解为什么会出现这种情况的概念; 将第一个XML文档解析为它的节点树,然后基于该树生成XHTML。

但是,我的理解是,沿途不必丢失白色间距。 我检查了jasper代码,特别是org.apache.jasper.compiler.Node,粗略检查显示了很多.trim()调用,这可能会不必要地删除间距。 但是,我对这段代码不太熟悉,果断地说。

总之,这可能是一个改进的bug /领域。 无论如何,有没有办法通过配置嵌入换行符? 我有信心用丑陋,丑陋的CDATA部分或类似技术(jsp:text?)实现这些……但在我遇到麻烦之前,是否有更容易/更简洁的方式?

该消息很老,但此评论中也报告了相同的行为,您的问题似乎暗示它仍然适用。

不确定您是否可以更改此行为(不使用filter)。

 true 

如果在web.xml使用上述指令,则会剥离空格。 鉴于BalusC答案中引用的语义模型,该指令仅在您不使用XML语法时才有用。

(Tomcat 6.0.16; Servlet 2.5声明; XML语法中的JSP 2.1声明)