我如何创建一个允许我读/写属性的JSF组合组件?



我试图创建一个复合组件,允许用户在selectOneMenu和selectManyListbox之间切换。我希望这个切换可以绑定到一个布尔值,而selectOneMenu/selectManyListbox可以绑定到页面的视图作用域backing bean中的对象列表。

我能够创建一个复合组件,它可以很容易地读取变量。我只是通过getAttributes()获得绑定@FacesComponent对象中的属性。

如何使这些变量可写呢?

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

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,但我有一堆其他的变量,我需要操作

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

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

返回一个可变的 Map,表示与此UIComponent相关的属性(和属性,见下文),由属性名称(必须是字符串)作为键。

因此它是可变的。您可以对它使用通常的Map#put()方法。假设您想要切换名为"toggle"java.lang.Boolean属性,下面是一个示例:

getAttributes().put("toggle", getAttributes().get("toggle") != Boolean.TRUE);

相关内容

  • 没有找到相关文章

最新更新