valueChangeListener方法每次都创建一个新的bean实例吗?

时间:2012-10-17 11:39:34

标签: jsf managed-bean valuechangelistener

我有<p:selectOneMenu>String个条目,并且valueChangeListener就可以了。

查看:

<p:selectOneMenu value="#{myLdapEntry.oneMenuselectedValue}" effect="fade" style="font-size:12px;"
    valueChangeListener="#{myLdapEntry.menuValueChanged}">
    <f:selectItem itemLabel="" itemValue=""/>
    <f:selectItems value="#{treeBean.objclasslist}" var="objclass"
    itemLabel="#{objclass}" itemValue="#{objclass}" />
    <p:column>   
        #{o}  #{objclass}
    </p:column>
    <f:ajax event="change" render=":form:objclassAttrsValstab" />
</p:selectOneMenu>

型号:

List<String> objectClassList = new ArrayList<String>();

public void menuValueChanged(ValueChangeEvent vce) {
    String newValue = vce.getNewValue().toString();
    objectClassList.add(newValue);
    System.out.println(objectClassList);
}

我想记住objectClassList中之前已取消的所有项目。但问题是它始终只包含最后选择的项目而不包含之前的项目。我甚至尝试使用Vector代替List,但仍然有相同的结果。

我认为valueChangeListener方法每次都会创建一个新的bean实例,以便每次都重新初始化objectClassList

这是真的吗?这是怎么造成的,我该如何解决?

1 个答案:

答案 0 :(得分:2)

如果bean是请求作用域,那确实会发生。然后,每个HTTP 请求都会创建一个全新的bean实例。就那么简单。如果在同一视图上进行交互时需要具有相同的bean实例,则应将其置于视图范围内。

@ManagedBean
@ViewScoped
public class MyLdapEntry {
   // ... 
}

此问题与您是否使用valueChangeListener完全无关。

另见:


对具体问题

无关valueChangeListener并非完全是执行业务操作和模型值操作的正确位置。而是使用<p:ajax listener>代替valueChangeListener(和<f:ajax>)。

<p:ajax listener="#{myLdapEntry.menuValueChanged}" update=":form:objclassAttrsValstab" />

public void menuValueChanged() {
    objectClassList.add(oneMenuselectedValue);
}

另见: