JSF - 即时创建页面

时间:2013-06-07 09:05:23

标签: jsf

我正在寻找一种关于如何基于给定模板动态创建jsf页面的和蔼的想法。

以下是要求:

用户有几个模板,他选择一个模板。 显示所选模板,并且对于模板中的每个占位符,用户可以选择他想要在给定占位符中显示的内容。它可以是桌子,图表等...... 此配置保存在数据库中,并在用户登录时显示给用户。

现在构建模板很简单:

    <div class="top-left" >
         <ui:insert name="top-left"/>
     </div>
    <div class="top-right" >
        <ui:insert name="top-right"/>
    </div>

当我尝试这样做时,问题就出现了:

<ui:decorate template="#{myBean.template}.xhtml" >
    <ui:repeat value="#{myBean.placeholders}" var="placeholder" >
        <ui:define name="#{placeholder}">    //FaceletException: name Must be Literal
            //display here the chosen component (chart, table ect...)
        </ui:define>
    </ui:repeat>
</ui:decorate>

非常感谢任何想法!

修改 似乎我必须放弃ui:使用动态名称定义'因为尽管在specs中它可以被指定为implementation中的值表达式

  • Mojarra 2.x
  • MyFaces 2.x
  • Facelets 1.x

预计它是一个文字。

1 个答案:

答案 0 :(得分:1)

JSF中的标记处理程序和组件必须不同。虽然tag handlers execute when view is built, components do when page is being rendered。基本上,在不经意地构建视图时将它们混合在一起可能会带来问题。

基本上,在构建视图时会运行ui:decorateui:define标记。 ui:repeat标记尚未呈现,因此这意味着您的迭代将无法正确执行。在这种情况下,您必须坚持c:forEach。看看my question

来自那里的公寓,我坚信JSF对于你想要实现的工作来说并不是最合适的工具,因为它对你正在寻找的东西有很大的限制。