如何将JSF复合组件属性设置为ManagedBean属性?

时间:2016-05-20 12:25:43

标签: primefaces attributes jsf-2.2 managed-bean composite-component

所以我制作了一个复合组件FileAdder.xhtml

<composite:interface>
    <composite:attribute name="type" value="#{editoriCompositeController.typeString}"/>
</composite:interface>

<composite:implementation>
    <h:form>
        <p:editor id="editor" widgetVar="editorWidget" value="some text" width="600" />
    </h:form>
</composite:implementation>

然后我有了EditoriCompositeController ManagedBean:

@ViewScoped
@ManagedBean
public class EditoriCompositeController {

    String typeString;

    public void setTypeString(String typeStringParameter) {
        this.typeString = typeStringParameter;
    }

    public String getTypeString() {
        return typeString;
    }

}

然后在我的fileattachmentsview.xhtml中我使用组件:

    <owncomponents:fileadder type="MEMO" />

但是这并没有将支持bean中的typeString值设置为“MEMO”。它保持为null我用一个打印值的按钮测试它。

如何让backing bean获取typeString的值我将复合组件的type - 属性设置为“MEMO”?为什么它是null而不是“备忘录”?

2 个答案:

答案 0 :(得分:7)

您必须将目标bean / model作为另一个复合属性传递。然后你可以在复合内部使用<c:set>来设置它的属性。

<cc:interface>
    <cc:attribute name="bean" type="com.example.Bean" />
    <cc:attribute name="type" type="java.lang.String" />
</cc:interface>
<cc:implementation>
    <c:set target="#{cc.attrs.bean}" property="type" value="#{cc.attrs.type}" />
    <p:editor value="#{cc.attrs.bean.text}" />
</cc:implementation>    

用法:

public class Bean {

    private String text;
    private String type; // I suggest to make it an enum.

    // ...
}

<h:form>
    <your:composite bean="#{bean}" type="MEMO" />
    <p:commandButton action="#{bean.submit}" />
</h:form>

请注意,我考虑了复合材料之外的形式。在复合材料中使用表单是不好的做法。

另见:

答案 1 :(得分:1)

我通过手动获取&#34;类型&#34;解决了这个问题。来自支持bean中的组件的属性:

String typeString = (String) component.getAttributes().get("type");