将托管bean实例参数化为复合组件属性

时间:2014-09-01 15:27:44

标签: jsf jsf-2 composite-component

我已经搜索了如何对Managed Bean类进行参数化,直到现在还没有。

我在做什么?

我有一个从我的Bean访问某些方法的JSF组件,但这个方法已经由一个抽象类实现。

方法和属性的名称不会改变,但现在我正在复制和粘贴,只更改Bean名称。

第一个实现是工作,但我希望改进第二个。

1-组件(现在):

...
<cc:interface>
    <cc:attribute name="title"         type="java.lang.String"  required="true"/>
    <cc:attribute name="data"          type="java.util.List"    required="true"/>
    <cc:attribute name="columnModel"   type="java.util.List"    required="true"/>
    <cc:attribute name="newEntity"     type="java.lang.Object"  required="true"/>
    <cc:attribute name="crudState"     type="java.lang.Integer" required="true"/>
</cc:interface>
...
<cc:implementation>
    <p:dataTable var="entity" value="#{cc.attrs.data}" >
        <p:columns value="#{cc.attrs.columnModel}" 
            var="column" style="#{column.style}" 
            styleClass="#{column.styleClass}">
        ...
        </p:columns>
    </p:dataTable>
</cc:implementation>
...

1-实施(现在):

    ...
    <comp:crud 
        title="#{cfgUserBean.title}"
        data="#{cfgUserBean.data}"
        columnModel="#{cfgUserBean.coluuns}"
        newEntity="#{cfgUserBean.newEntity}"
        newEntity="#{cfgUserBean.crudState}"/>
    ...
    <comp:crud 
        title="#{cfgCityBean.title}"
        data="#{cfgCityBean.data}"
        columnModel="#{cfgCityBean.columns}"
        newEntity="#{cfgCityBean.newEntity}"
        crudState="#{cfgCityBean.curdState}"/>

所需

将Bean名称作为参数传递

2-组件(所需):

...
<cc:interface>
    <cc:attribute name="BEANNAME" type="java.lang.Object"  required="true"/>
</cc:interface>
...
<cc:implementation>
    <p:dataTable var="entity" value="#{cc.attrs.BEANNAME.data}" >
        <p:columns value="#{cc.attrs.BEANNAME.columnModel}" 
            var="column" style="#{column.style}" 
            styleClass="#{column.styleClass}">
        ...
        </p:columns>
    </p:dataTable>
</cc:implementation>

2-实施(所需):

    ...
    <comp:crud BEANNAME="cfgUserBean" />
    ...
    <comp:crud BEANNAME="cfgCityBean" />

结论

正如您所看到的,如果我可以参数化Bean名称,我将能够简化最终编码。

任何有想法我能做什么的人? 提前谢谢

1 个答案:

答案 0 :(得分:2)

由@BalusC帮助澄清我的想法,我注意到第二个实现几乎回答了我的问题。

那就是我所做的:

<强>及部件

...
<cc:interface>
    <cc:attribute name="managedBean"  type="company.AbstractWebCrud" required="true"/>
</cc:interface>
...
<cc:implementation>
    <p:dataTable var="entity" value="#{cc.attrs.managedBean.data}" >
    ...
    </p:dataTable>
</cc:implementation>
...

<强>实施

...
<comp:crud-lista 
    managedBean="#{cfgUserBean}"/>
...

<强>结论

将抽象类作为参数类型传递,我能够从类中访问所有公共方法。工作就像一个魅力!

谢谢@BalusC的关注!! : - )