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

时间:2010-05-29 12:48:17

标签: java jsp line-breaks jspx

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

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

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

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

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

<body><div id="page"><div id="header"><div class="title">...

或者这个:

<body>
  <div id="page">
    <div id="header">
      <div class="title">...

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

这可行吗?

修改

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

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

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

3 个答案:

答案 0 :(得分:7)

根据JSP specification

  

JSP.6.2.3语义模型

     

...

     

为了清楚地解释空白的处理,我们遵循的结构   XSLT规范。处理JSP文档的第一步是识别   文档的节点。 然后,所有只有空格的文本节点都是   从文件中删除;唯一的例外是jsp:text元素中的节点,   保持逐字。结果节点的解释如下所述   以下部分。模板数据要么直接传递给响应,要么直接传递给响应   通过(标准或自定义)行动进行调解。

因此,如果您想保留空格,则需要在<jsp:text>中包含所需的部分。

答案 1 :(得分:2)

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

  

我有一个搜索,并没有想到   之前已经问过这个。

     

我一直把我的JSP页面写成XML   文档(.jspx后缀)和一个   让我烦恼的差异   在使用简洁的XML文档之间   语法和(2.0之前的)旧语法   是换行,或缺乏   前者。

     

处理后的XML文档导致   标签不间断的XHTML   通过间距或换行符。

     

我完全理解背后的概念   为什么会这样;第一个XML   文档被解析为它的节点   树,然后生成XHTML   基于这棵树。

     

然而,我是理解   白色间距不必   一路上迷路了。我查了一下   尤其是碧玉代码   org.apache.jasper.compiler.Node,和   粗略的检查揭示了很多   .trim()调用,可能是   不必要地删除间距。   但是,我不太熟悉   这段代码果断地说。

     

总之,这可能是一个错误/区域   改善。无论如何,有没有   通过嵌入换行符的方法   组态?我有信心成为   能够用丑陋,丑陋来实现这些   CDATA部分,或类似技术   (jsp:文字?)......但在我去之前   麻烦,是否更容易/更整洁   方式是什么?

消息很旧但this comment也报告了相同的行为,您的问题似乎暗示它仍然适用。

不确定是否可以更改此行为(不使用过滤器)。

答案 2 :(得分:0)

<trim-directive-whitespaces>true</trim-directive-whitespaces>

如果您在<jsp:text>中使用上述指令,则web.xml内的空格会被删除。鉴于BalusC's answer中引用的语义模型,该指令仅在您不使用XML语法时才有用。

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