我有一個List<String>
,我成功地將其表示爲一個數據表;現在我正在嘗試創建一個複合組件,但似乎我仍然無法理解StateHelper
如何工作。未能將默認值設置爲複合組件
我想要做的是,如果value
由xhtml傳遞的屬性計算爲null
,自動創建一個新的List<String>
。現在,唯一可能的操作是單擊一個按鈕,將新項目添加到列表中。
我的組件
<cc:interface componentType="testComponent">
<cc:attribute name="value" required="true" type="java.util.List"/>
</cc:interface>
<cc:implementation>
<f:event type="postAddToView" listener="#{cc.init}" />
<p:dataTable id="data" value="#{cc.data}" var="_data">
<p:column headerText="Nombre/Relación">
<h:outputText value="#{_data}" />
</p:column>
</p:dataTable>
<p:commandButton value="Añadir" process="@this" update="data"
actionListener="#{cc.addData}" ajax="true"/>
</cc:implementation>
組件bean是
@FacesComponent("testComponent")
public class TestComponent extends UIOutput implements NamingContainer {
private static final String LISTA_DATOS = "LST_DATOS";
private static final Logger log = Logger.getLogger(TestComponent.class.getName());
@Override
public String getFamily() {
return UINamingContainer.COMPONENT_FAMILY;
}
public List<String> getData() {
@SuppressWarnings("unchecked")
List<String> data = (List<String>) this.getStateHelper().get(LISTA_DATOS);
return data;
}
public void setData(List<String> data) {
this.getStateHelper().put(LISTA_DATOS, data);
}
public void addData() {
List<String> data = (List<String>)this.getData();
data.add("HOLA");
this.setData(data);
}
public void init() {
log.info("En init()");
if (this.getStateHelper().get(LISTA_DATOS) == null) {
if (this.getValue() == null) {
this.getStateHelper().put(LISTA_DATOS, new ArrayList<String>());
} else {
this.getStateHelper().put(LISTA_DATOS, this.getValue());
}
}
}
的組件被稱爲像
<h:form>
<imas:editorTest value="#{testBean.data1}"/>
</h:form>
<h:form>
<imas:editorTest value="#{testBean.data2}"/>
</h:form>
與testBean
之中:
private List<String> data1 = new ArrayList<>(Arrays.asList("ONE", "TWO", "SIXTYNINE"));
private List<String> data2 = null;
public List<String> getData1() {
return this.data1;
}
public void setData1(List<String> data1) {
this.data1 = data1;
}
public List<String> getData2() {
return this.data2;
}
public void setData2(List<String> data2) {
this.data2 = data2;
}
我發現的問題是,當通過data2
(null
列表),點擊按鈕添加一個新的項目,但只有前兩個;之後,無論點擊多少次按鈕,都不會向列表中添加新項目(日誌中未顯示異常)。相反,添加儘可能多的項目沒有問題,因爲我希望用data1
初始化組件。我所觀察到的現象,導致我,我濫用getStateHelper
的是,當我按一下按鈕,執行兩次init()
方法,在當時的思想
一兩件事,this.getStateHelper().get(LISTA_DATOS)
是null
,而我預期由於在組件初次渲染時對其進行了初始化,因此它不爲空。我期望getStateHelper
在調用之間攜帶這樣的狀態,我錯在哪裏?
哦!我用JDK 7使用Wildfly 8.1(不升級)。