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

如何创建一个JSF复合组件,允许我读/写属性?,jsf,composite-component,Jsf,Composite Component,我正在尝试创建一个复合组件,它允许用户在selectOneMenu和selectManyListbox之间切换。我希望切换可以绑定到布尔值,selectOneMenu/selectManyListbox可以绑定到页面的视图范围支持bean中的对象列表 我能够创建一个复合组件,它可以很容易地读取变量。我只是通过getAttributes()获取绑定的@FacesComponent对象中的属性 但是,我如何使这些变量可写呢 例如,假设我有以下视图范围的bean: AssetSearch.java @

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

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

但是,我如何使这些变量可写呢

例如,假设我有以下视图范围的bean:

AssetSearch.java

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

    private boolean toggle;
    private List<Asset> selectedList;

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

    ...

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

我可能可以使用getSubmitedValue/getConvertedValue来管理selectedList,但我还需要处理一系列其他变量

正如我所说,使用
getAttributes()
获取这些变量非常容易,但我真的不知道如何操作它们

从(我的)重点:

返回一个可变的
映射
,该映射表示与此
ui组件
关联的属性(和属性,请参见下文),由属性名称(必须是字符串)键入

因此它是可变的。你可以用通常的方法处理它。如果您想切换名为
“toggle”
java.lang.Boolean
属性,下面是一个示例:

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

取决于具体的功能需求,问题中没有明确的功能需求。@BalusC抱歉。我在文章的顶部添加了一个详细的解释,说明了我要做的事情。除了切换(您应该将其存储在视图范围内,如前一个问题所回答的),您不需要额外的逻辑来更新模型值。还是你面临一个问题?该组合不一定也需要是
UIInput
的实例。例如,为了读取@FacesComponent对象中的“toggle”属性,我使用:(Boolean)getAttributes().get(“toggle”)。但是,我如何编写它呢?在ajax侦听器方法中?只需使用
put()
。它只是一个
java.util.Map
@FacesComponent(value = "specialList")
public class SpecialList extends UIInput {

    ...

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