Jsf 2 使用ui:include时避免使用多个DOCTYPE和html标记

Jsf 2 使用ui:include时避免使用多个DOCTYPE和html标记,jsf-2,facelets,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="${fo

我们在“主页”中使用了几个
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>

一些html代码
更多的html代码
使用
ui:include
进行模板化会导致在源代码中多次重复
DOCTYPE
html
标记,这非常难看。(当然,用户看不到,但我是tidy html的粉丝)

但是,如果我从要包含的xhtml中删除
DOCTYPE
html
标记,Faces Servlet将抛出一个异常,说明
ui:fragment
的前缀
ui
未绑定


有人知道吗,我如何在没有多个
DOCTYPE
s和
html
s的情况下包含另一个XHTML页面

您应该看看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>

一些html代码
更多的html代码