6

我有一个格式很好的“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");

所以我想我的问题保持不变:是什么决定了输出中如何包含/删除制表符/空格/换行符?

4

3 回答 3

7

根据JSP 规范

JSP.6.2.3 语义模型

...

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

因此,如果要保留空格,则需要将所需部分包装在<jsp:text>.

于 2010-05-29T14:13:27.560 回答
2

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

我四处搜寻,并认为以前没有人问过这个问题。

我一直在将我的 JSP 页面编写为 XML 文档(.jspx 后缀),而使用简洁的 XML 文档语法和(2.0 之前的)遗留语法之间的一个让我有点恼火的区别是换行符,或者在前任的。

处理后的 XML 文档会生成 XHTML,其中的标签不会被空格或换行符打断。

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

但是,我的理解是,白色间距不必在此过程中丢失。我检查了 jasper 代码,特别是 org.apache.jasper.compiler.Node,粗略的检查发现很多 .trim() 调用,这可能是不必要地删除了间距。但是,我对这段代码不是那么熟悉就果断地说。

总而言之,这可能是一个错误/需要改进的领域。无论如何,有没有办法通过配置嵌入换行符?我有信心能够使用丑陋、丑陋的 CDATA 部分或类似的技术(jsp:text?)来实现这些目标……但在我遇到麻烦之前,有没有更简单/更简洁的方法?

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

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

于 2010-05-29T14:03:05.707 回答
0
<trim-directive-whitespaces>true</trim-directive-whitespaces>

<jsp:text>如果您在web.xml. 鉴于BalusC 的答案中引用的语义模型,该指令仅在您不使用 XML 语法时才有用。

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

于 2010-05-29T15:10:48.360 回答