我如何创建一个允许我 read/write 属性的 JSF 复合组件?
How can I create a JSF composite component that allows me to read/write to the attributes?
我正在尝试创建一个允许用户在 selectOneMenu 和 selectManyListbox 之间切换的复合组件。我希望切换可绑定到布尔值,并且 selectOneMenu/selectManyListbox 可绑定到页面的视图范围的支持 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 但我还有很多其他变量需要操作还有。
As I said, its pretty easy to get these variables with getAttributes()
but I'm really not sure how to manipulate them.
来自 UIComponent#getAttributes()
javadoc(强调我的):
Return a mutable Map
representing the attributes (and properties, see below) associated wth this UIComponent
, keyed by attribute name (which must be a String).
因此它是可变的。您可以在其上使用通常的 Map#put()
方法。假设您要切换名为 "toggle"
的 java.lang.Boolean
属性,下面是一个示例:
getAttributes().put("toggle", getAttributes().get("toggle") != Boolean.TRUE);
我正在尝试创建一个允许用户在 selectOneMenu 和 selectManyListbox 之间切换的复合组件。我希望切换可绑定到布尔值,并且 selectOneMenu/selectManyListbox 可绑定到页面的视图范围的支持 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 但我还有很多其他变量需要操作还有。
As I said, its pretty easy to get these variables with
getAttributes()
but I'm really not sure how to manipulate them.
来自 UIComponent#getAttributes()
javadoc(强调我的):
Return a mutable
Map
representing the attributes (and properties, see below) associated wth thisUIComponent
, keyed by attribute name (which must be a String).
因此它是可变的。您可以在其上使用通常的 Map#put()
方法。假设您要切换名为 "toggle"
的 java.lang.Boolean
属性,下面是一个示例:
getAttributes().put("toggle", getAttributes().get("toggle") != Boolean.TRUE);