如何创建允许我读取/写入属性的JSF复合组件?

时间:2015-05-26 15:34:43

标签: jsf composite-component

我尝试创建一个复合组件,允许用户在selectOneMenu和selectManyListbox之间切换。我希望切换可以绑定到布尔值,并且selectOneMenu / selectManyListbox可以绑定到页面的视图范围的辅助bean中的对象列表。

我能够创建一个可以轻松读取变量的复合组件。我只是通过 getAttributes()在绑定的 @FacesComponent 对象中获取属性。

如何让这些变量可写?

例如,假设我有以下视图作用域:

AssetSearch.java

@ManagedBean(name = "AssetSearch")
@ViewScoped
public class AssetSearch {

    private boolean toggle;
    private List<Asset> selectedList;

}

我想用复合组件操纵这些变量:

的index.xhtml

<my:specialList toggle="#{AssetSearch.toggle}"
                selected="#{AssetSearch.selectedList}"/>

如何在复合组件辅助bean中操作这两个变量?:

specialList.xhtml

<cc:interface componentType="specialList">
    <cc:attribute name="toggle" type="java.langBoolean" required="true"/>
    <cc:attribute name="selected" type="java.util.List" required="true"/>
</cc:interface/>
<cc:implementation>
    <h:selectBooleanCheckbox value=#{#cc.attrs.toggle}/>
    <h:selectOneMenu rendered="#{cc.attrs.toggle}" 
                     value="#{cc.attrs.selected}">
       ...
    <h:selectManyListbox rendered=#{! cc.attrs.toggle}"
                         value="#{cc.attrs.selected}">
       ...
</cc:implementation>

SpecialList.java

@FacesComponent(value = "specialList")
public class SpecialList extends UIInput {

    ...

}

正如我所说,用 getAttributes()来获取这些变量非常容易,但我真的不知道如何操纵它们。我读过了:

http://balusc.blogspot.com/2013/01/composite-component-with-multiple-input.html

我可能会使用 getSubmitedValue / getConvertedValue 来管理 selectedList ,但我还需要操作一些其他变量。

1 个答案:

答案 0 :(得分:1)

  

正如我所说,用getAttributes()很容易得到这些变量,但我真的不知道如何操纵它们。

来自UIComponent#getAttributes() javadoc(强调我的):

  

返回一个 mutable Map,表示与UIComponent关联的属性(和属性,见下文),由属性名称键入(必须是字符串)。< / p>

它是可变的。您可以使用常用的Map#put()方法。如果您想切换名为java.lang.Boolean的{​​{1}}属性,请参阅以下示例:

"toggle"