为什么ui:片段没有在ui:composition中呈现

时间:2013-12-12 15:08:42

标签: jsf jsf-2 facelets templating

我是JSF和Java的初学者,请你好!

如果用户是管理员,我正在尝试呈现特定的块。

我有一个模板。如果用户已登录,此模板将正确呈现特定块。

admin.xhtml:

    <ui:composition template="../../WEB-INF/tpl/admin/template.xhtml">
        <ui:define name="sectionTitle">Admin</ui:define>

        <!-- Logged as Admin -->
        <ui:fragment rendered="#{user.admin}">
            <ui:define name="body">
                <h3>Welcome</h3>
                <p>Please choose an administration task!</p>
            </ui:define>
        </ui:fragment>

    </ui:composition>

所引用:

<div class="header">
    <h2>
        <ui:insert name="sectionTitle"> Default Section Title</ui:insert>
    </h2>
    <ui:insert name="logBox">
        <ui:fragment rendered="#{not user.logged}">
            <ui:include src="login.xhtml"></ui:include>
        </ui:fragment>

        <ui:fragment rendered="#{user.logged}">
            <h:form>
                <h:commandButton value="Logout"
                    action="#{userService.logout}" />
            </h:form>
        </ui:fragment>
    </ui:insert>
</div>

    <div class="corebody">
        <ui:insert name="body"> Default Section Content</ui:insert>
    </div>

我可以像这样在模板中移动渲染块:

<ui:fragment rendered="#{user.admin}">
        <ui:insert name="body"> Default Section Content</ui:insert>
</ui:fragment>

但是对于每个文件的责任感这对我来说似乎不太好(这看起来不太通用,为什么这样的事情应该出现在模板中?)。

我错过了一些非常明显的东西吗?

2 个答案:

答案 0 :(得分:1)

在构建视图期间,<ui:define><ui:composition>以外的任何内容都被忽略,并且不会在JSF组件树中结束。

您需要将<ui:fragment>放在<ui:define>内。

<ui:composition template="../../WEB-INF/tpl/admin/template.xhtml">
    <ui:define name="sectionTitle">Admin</ui:define>

    <!-- Logged as Admin -->
    <ui:define name="body">
        <ui:fragment rendered="#{user.admin}">
            <h3>Welcome</h3>
            <p>Please choose an administration task!</p>
        </ui:fragment>
    </ui:define>

</ui:composition>

另一种方法是使用JSTL <c:if>,因为它在视图构建期间运行:

<ui:composition template="../../WEB-INF/tpl/admin/template.xhtml">
    <ui:define name="sectionTitle">Admin</ui:define>

    <!-- Logged as Admin -->
    <c:if test="#{user.admin}">
        <ui:define name="body">
            <h3>Welcome</h3>
            <p>Please choose an administration task!</p>
        </ui:define>
    </c:if>

</ui:composition>

另见:

答案 1 :(得分:0)

<ui:composition template="../../WEB-INF/tpl/admin/template.xhtml">
    <ui:define name="sectionTitle">

        <!-- Logged as Admin -->
        <ui:fragment rendered="#{user.admin}">
            <ui:define name="body">
                 <h3>Welcome</h3>
                 <p>Please choose an administration task!</p>
            </ui:define>
        </ui:fragment>
    </ui:define>
</ui:composition>

试试这个。