JSF PrimeFaces ViewScope无需调用init()

时间:2014-01-28 03:48:51

标签: jsf-2 primefaces managed-bean

我遇到一个使用Primefaces dataTable的问题,即jsf将调用我的托管bean init(),它将从数据库进行搜索。

在我的jsf中,用户可以执行另一个在String中传递参数的搜索。

<p:commandButton id="btnChild" type="Submit" icon="ui-icon-plus" styleClass="action-buttons" value="Child" update=":frmSysMenu:messages dtSysMenu" ajax="false" action="#{Controller.doParent('C')}" process="dtSysMenu" />

我的托管bean能够执行 doParent(String)并再次返回搜索屏幕但是一旦我的屏幕加载,它将调用 init()哪个:

@PostConstruct
@Override
public void init(){
    try {
        doSearch(nodeValue,"root");
        setParentNode(nodeValue);

    } catch (Exception e) {
        addErrorMessage(e.getMessage());
        e.printStackTrace();
       Messages.addGlobalError(e.getMessage());
        LOG.error(e.toString(), e);
    }

}

它将返回第一个查询。 还有其他方法吗?

RequestScoped有帮助吗?

1 个答案:

答案 0 :(得分:0)

从规格(或其他地方,OP没有提到它)

  

<强> @ViewScoped
  只要您在浏览器窗口/选项卡中与相同的JSF视图进行交互,此范围内的bean就会存在。它得到了   在HTTP请求中创建,并在回发到a后被销毁   不同的看法。它不会立即被破坏   通过GET请求离开/关闭视图,但是无法访问它   通常的方式。 JSF将bean存储在UIViewRoot#getViewMap()中   将托管bean名称作为键,然后将其存储在   会话。 您需要从操作(侦听器)返回null或void   保持bean活着的方法。将此范围用于更复杂的表单   它使用ajax,数据表和/或几个渲染/禁用   需要在后续请求中保留其状态的属性   在同一浏览器窗口/标签(视图)中。

在函数中我只是改为void而jsf不再调用init()。