【问题标题】:Java facelets dynamic loading and composite component attributesJava facelets 动态加载和复合组件属性
【发布时间】:2011-01-30 11:01:06
【问题描述】:

目前,出于教育目的,我正在尝试使用带有 Facelets 视图技术的 JavaServer Faces 2.0 实现 webpart 技术。我创建了 facelet 模板、facelet 自定义组件并制作了一些 facelet“模板”客户端。但在一件事上我被困住了。我无法动态加载控件并将它们放入cc:attributes

如果我有一个页面,例如包含静态文本或将其与 ManagedBean 绑定,则属性 ui:include 一切正常。

<ui:define name="right-column">
    right-column asd
    <h:link outcome="asdf" value="link_get">
        <f:param name="aa" value="123" />
        <f:param name="a" value="123 dd + 20" />
    </h:link>
    <h:commandLink action="asdf?faces-redirect=true" value="asdf">
        <f:param name="aa" value="123" />
    </h:commandLink><br />
    <ui:include src="./resources/Controls/CategoryTree.xhtml"/><br />
    This works even if I put src with MenageBean property.
    <ui:include src="#{browseProducts.incudePath}"/>
</ui:define>

这是我的 facelet 控件(数据绑定在 #{TreeBean.root} 内的此控件内:

<!-- NO INTERFACE -->
<cc:interface>
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>
<!--    This is a very simply scaffolding for Category Three Control.
    -->
    <p:tree value="#{TreeBean.root}" var="node"
            expandAnim="FADE_IN" collapseAnim="FADE_OUT">
        <p:treeNode>
            <h:outputText value="#{node}" />
        </p:treeNode>
    </p:tree>

</cc:implementation>

但是当ui:include 指向带有cc:attribute 的控件时,我遇到了问题。我不知道如何从支持 bean 初始化这个属性并做“东西”。

例如我有这个页面:

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./resources/layout/Template.xhtml"
                xmlns:sc="http://java.sun.com/jsf/composite/Controls">

    <ui:define name="right-column">
        <sc:dummy ItemCount="10" />
        <ui:include src="./resources/Controls/dummy.xhtml" />
    </ui:define>
</ui:composition>

这里是复合控件:

<cc:interface>
        <cc:attribute name="ItemCount" required="true"
                      shortDescription="This attribute is meaningful "  />
    </cc:interface>
    <!-- IMPLEMENTATION -->
    <cc:implementation>
    <!-- How to pass ItemCount to my dummy bean to create so many items in
    list as ItemCount value -->
        <ui:repeat value="#{dummy.dummyList}" var="dummyItem">
            <h:outputText value="#{dummyItem}" />
        </ui:repeat>
    </cc:implementation>

以及支持 bean 代码:

public ArrayList<String> getDummyList() {
    //Here I try to get dummy list work.
    dummyList = new ArrayList<String>(getDummyCount());
    for (int i=0;i< getDummyCount();i++){
        dummyList.add(i + "" + i);
    }
    return dummyList;
}

如何做到这一点?

【问题讨论】:

    标签: jsf-2 include facelets composite-component


    【解决方案1】:

    我认为你有两个问题:

    1. 使用复合组件中的参数调用方法
    2. 为包含的页面指定一些参数

    对于1.,从jsf 2开始,你可以直接调用方法,指定参数(应该是方法签名的一部分):

            <ui:repeat value="#{dummy.getDummyList(cc.attrs.dummyCode)}" var="dummyItem">
                <h:outputText value="#{dummyItem}" />
            </ui:repeat>
    

    但我怀疑您正在尝试将支持用于它不是为它设计的东西。也许您会对为您的复合组件编写支持 java 代码感兴趣,这是不同的。但是,如果您是初学者,则很难掌握。我首先尝试以不同的方式设计我的页面和 bean 交互。不知道你要解决哪个问题,但乍一看,这个解决方案看起来太复杂了。

    对于 2.,您应该查看 ui:param。一个快速的谷歌搜索给了我这个:http://www.jsfcentral.com/articles/facelets_3.html

    【讨论】:

    • 感谢您对问题的帮助。有时间我会看看这个:-)
    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2012-01-30
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2015-08-31
    相关资源
    最近更新 更多