2014-01-28 64 views
0

我遇到一个问题,使用Primefaces dataTable,这是jsf将调用我的托管bean init()这将做一个数据库搜索。JSF PrimeFaces ViewScope不调用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(字符串),并会再次返回到搜索屏幕,但一旦我的屏幕加载时,它会调用的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

欢迎来到Stackoverflow!如果你已经解决了你的问题(恭喜),那么请张贴它作为答案。它可以帮助其他人快速找出问题已经解决。 – mabi

+0

非常感谢!对不起,我是新的,并感谢您的建议:D –

+0

可能重复[JSF 2.1查看范围管理bean重新创建每个刷新](http://stackoverflow.com/questions/19153374/jsf-2-1-view-范围的管理,豆重新创建上,每刷新) – Kukeltje

回答

0

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

@ViewScoped
在此范围内一个bean的生活,只要你用在同一个JSF视图交互浏览器窗口/选项卡。它会根据HTTP请求创建 ,并在您回发到 不同视图后遭到破坏。当您通过GET请求离开/关闭视图时,它不会立即被破坏,但它不再以通常的方式访问 。 JSF将bean存储在UIViewRoot#getViewMap() 中,并将托管bean名称作为密钥存储在 会话中。 您需要从操作(侦听器) 方法中返回null或void以保持bean存活。将此作用域用于更复杂的表单 ,它们使用ajax,数据表和/或多个呈现/禁用 属性,这些属性的状态需要在同一浏览器窗口/选项卡(视图)内的后续请求 中保留。

在函数中,我只是改变为void,并且jsf不会再次调用init()。