【问题标题】:JSF PrimeFaces ViewScope without calling init()不调用 init() 的 JSF PrimeFaces ViewScope
【发布时间】:2014-02-19 05:04:37
【问题描述】:

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

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

<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 有帮助吗?

【问题讨论】:

  • 欢迎来到 Stackoverflow!如果您已经解决了您的问题(恭喜),请将其作为答案发布。它可以帮助其他人快速确定您的问题已解决。
  • 非常感谢!对不起,我是新手,感谢您的建议:D

标签: jsf-2 primefaces managed-bean


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多