【问题标题】:Why is ui:fragement not rendered inside ui:composition为什么 ui:fragment 没有在 ui:composition 内呈现
【发布时间】:2013-12-31 01:47:19
【问题描述】:

我是 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>

模板.xhtml:

<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>

但是关于每个文件的责任,这对我来说似乎不太好(这似乎并不通用,为什么模板中应该有这样的东西?)。

我是否遗漏了一些非常明显的东西?

【问题讨论】:

  • 这个link可以帮助你

标签: jsf jsf-2 facelets templating


【解决方案1】:
<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>

试试这个。

【讨论】:

  • 这不是我想要的,但是将 ui:fragment 移动到 body ui:define 中是可以的。
  • 这个结构没有任何意义。
【解决方案2】:

在构建视图期间,&lt;ui:define&gt; 和 &lt;ui:composition&gt; 之外的任何内容都会被忽略,并且不会出现在 JSF 组件树中。

您需要将&lt;ui:fragment&gt; 放入&lt;ui:define&gt;。

<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 &lt;c:if&gt;,因为它已经在视图构建期间运行:

<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>

另见:

【讨论】:

  • @BasluC:我正在尝试使用 JSTL 来效仿你的示例,但它不起作用:(。我正在使用 JSF1.2,可能是这样吗?我已经尝试过使用不同的命名空间。
  • 我已经问了一个大约一周前没人回答的问题:stackoverflow.com/questions/41810854/jsf-1-2-dynamic-uiparam
  • @Gabriel:使用 [jsf] 标签来吸引 JSF 用户的注意,而不仅仅是版本标签。
猜你喜欢
  • 2015-11-20
  • 2021-12-05
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多