如何在JSF输出中去除空格?

4

是否有可能配置JSF 2.0以删除XHTML标签之间不必要的空格?

3个回答

7
很抱歉,Facelets无法区分不必要的空格和必要的空格。为此,它需要确定单独的HTML标签,解析CSS和JS文件以查找证据,证明它确实是不必要的。对于HTML <pre><textarea> 标签、CSS white-space:pre 属性和JS element.style.whiteSpace='pre' 代码,空格具有重要意义。
检查这些内容可靠性的成本和复杂度太高了。如果你真正关心的是网络带宽,那么只需在服务器级别开启gzip压缩。如何做到这一点取决于所使用的服务器,但在Tomcat上,只需在/conf/server.xml中的<Connector>元素中添加compression="on"即可。
然而,可以创建一个Filter来替换响应编写器以修剪空格。你可以在这里找到这样一个过滤器的示例。但它并没有考虑CSS / JS。

在MyFaces Core 2.1.10中,我直接在facelets编译器上添加了此功能。请参见下面的答案。 - lu4242
@lu4242:它是否考虑了HTML的<pre><textarea>,CSS的white-space以及JS的element.style.whiteSpace - BalusC
它直接在facelets编译器标记中删除空格,但不过滤Renderer类所做的内容,这非常好,因为如果您需要特殊的东西,可以将标记放在bean上并使用<h:outputText .../>输出即可。在我看来,这是目前最好的选择。让我知道您的想法,也许我们可以改进MyFaces上的此功能。 - lu4242

4
这个答案来自我的博客: http://lu4242.blogspot.com/2012/12/html-white-space-compression-for-jsf.html
你可以在你的faces-config.xml中添加以下内容,使用MyFaces Core 2.1.10或更高版本来移除这些空格:
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                     http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
                     version="2.1">
    <faces-config-extension>
        <facelets-processing>
            <file-extension>.xhtml</file-extension>
            <process-as>xhtml</process-as>
            <oam-compress-spaces>true</oam-compress-spaces>
        </facelets-processing>
    </faces-config-extension>
</faces-config>

那就这样吧。现在,facelets编译器将尝试在不改变页面外观的情况下,根据HTML空格压缩规则来减少或删除不必要的空格/制表符。简单地说,这意味着它会将多个连续的空格替换为一个空格或者全部删除。它还会尽可能使用“\n”字符,以便在压缩后更容易阅读页面标记。
由于这种优化是在facelets编译器中完成的,因此减少空白的工作只需要完成一次,所以您所有的页面都不会增加额外的CPU或内存负担。更重要的是,它减少了呈现页面所需的内存和CPU资源,这可以为您的应用程序提供一些小的提升。

1
+1 如果包括了您所引用的博客文章的上下文 :) - Taryn
+1 谢谢,这对我有用。只需编辑您的帖子以关闭 < faces-config-extension > 标签,因为它可能会让某些人感到困惑。 - faissal

2

我正在尝试寻找一种简单的解决方案,以压缩HTML并删除在primefaces>jsf>jsp>servlet解析后创建的空格。

我了解到primefaces可以帮助我压缩js和css,但是由于jsf转换为jsp发生在primefaces解析之后,因此他们无法处理HTML。

JSP规范曾经有一个指令

  <%@ page trimDirectiveWhitespaces="true" %> 

为了做我需要的事情。

此外,如果需要,我们可以在web.xml中处理它。

我知道正确的方法是配置Web服务器来处理它。

然而,jBoss 7.1.1对JSP配置失去了灵敏度。(问题始于7.0,当时我们不得不在每次JSP更改后重新启动服务器。问题得到解决,但在7.1中又出现了。应该在7.2中得到解决,但7.2还没有发布。)

无论如何,jBoss是一个很好的工具。

我的问题是,从JSP转换到JSF会丢失功能吗。

应该有一种标记告诉JSF将trimDirectiveWhitespaces放入它正在尝试解析自身的JSP中。

我不喜欢“过滤器”解决方案,因为它会每次流式输出时都修剪输出内容。我宁愿将其编译到JSP>Sevlet中,而不是每次在输出时都这样做。此外,它是定制的(不是标准的,未经文件化等)。

仍然想知道在JSF中轻松“修剪空格”,“压缩HTML”的方法...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接