【问题标题】:Does the valueChangeListener method create a new bean instance each time?valueChangeListener 方法是否每次都创建一个新的 bean 实例?
【发布时间】:2012-10-07 15:50:59
【问题描述】:

我有一个<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 每次都会重新初始化。

这是真的吗?这是如何引起的,我该如何解决?

【问题讨论】:

  • 为什么不在构造函数中放置一个调试断点或日志语句来验证是否是这种情况?你的 bean 被放置在什么范围内?
  • 我没有任何范围,所以它是默认值:requestScope,谢谢你 BalusC!

标签: jsf managed-bean valuechangelistener


【解决方案1】:

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

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

这个问题与你是否使用valueChangeListener完全无关。

另见:


与具体问题无关,valueChangeListener 并不完全是执行业务操作和模型值操作的正确位置。而是使用&lt;p:ajax listener&gt; 而不是valueChangeListener(和&lt;f:ajax&gt;)。

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

与

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

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多