使用ui:include时,请避免使用多个DOCTYPE和html标记

时间:2011-08-18 07:24:39

标签: jsf-2 facelets

我们在“主要”页面中使用了多个ui:include标记。要包含的页面如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=".." xmlns:ui="..." ...>
    <ui:fragment rendered="${foo}">
       some html code
    </ui:fragement>
    <ui:fragment rendered="${!foo || bar}">
       some more html code
    </ui:fragement>
</html>

使用ui:include模板导致在源代码中多次重复DOCTYPEhtml标记,这非常难看。 (当然,用户没有看到,但我是整洁的HTML的粉丝)

但是,如果我从to-be-included-xhtml中删除DOCTYPEhtml标记,则Faces Servlet会抛出一个异常,指出{{1}的前缀ui没有约束。

有没有人知道,我如何能够包含另一个XHTML页面没有多个ui:fragmentDOCTYPE s?

1 个答案:

答案 0 :(得分:3)

你应该看一下ui:composition标签。 我们还使用ui:include来包含jsf2页面,并解决你遇到的问题我相信你可以通过添加ui:composition标签来改变你所包含的页面,如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns=".." xmlns:ui="..." ...>
    <ui:composition>
    <ui:fragment rendered="${foo}">
       some html code
    </ui:fragement>
    <ui:fragment rendered="${!foo || bar}">
       some more html code
    </ui:fragement>
    </ui:composition>
</html>