【问题标题】:Method called several times方法多次调用
【发布时间】:2013-10-22 01:31:33
【问题描述】:

我只想在某些条件下打印结果数组。 在我的 bean 中,我有一个方法 dataIsOk() 检查条件并使用表单中的数据进行计算。 计算成本很高(大约 5 秒)。方法 dataIsOk() 被调用了几次,然后总时间很长(大约 20 秒)。

我是 JSF 的新手,我不会因为总时间较短而做什么(例如 dataIsOk() 只调用一次)。

我的 xhtml:

<p:outputPanel rendered="#{pBean.dataIsOk() eq true}">
    <ui:include src="result.xhtml"/>
</p:outputPanel>

我看过@PostContruct,但我感觉在我的情况下它不会好,因为我的方法需要来自接口的数据(然后在构建bean之前无法执行)。

我的功能:

public boolean dataIsOk() {
    if (profilIsOk()) {
        Date dateEffet = rechercheDate();
        Parametres param = rechercheParam();
        FacesContext fc = FacesContext.getCurrentInstance();
        EBean eBean = (EBean) fc.getViewRoot().getViewMap().get("eBean");
        if (eBean !=null) {
            Calcul calcul = new Calcul();
            List<Tarif> tarifs = new ArrayList<Tarif>();
            tarifs = calcul.calculTarif(dateEffet, param, eBean.getType());
            return true;
        } else return false;
     }

【问题讨论】:

  • pBean的范围是什么?
  • @miroslav_mijajlovic 乐谱视图
  • 提供方法dataIsOk
  • JSF 保留多次调用支持 bean 的 getter 的权利。有关详细信息,请参阅链接的问题。

标签: jsf primefaces


【解决方案1】:

您需要重新设计代码。 在您的托管 bean 中创建一个简单的

private Boolean renderResult;

使用它的 getter 和 setter。使用 @PostConstruct 来初始化 renderResult = false。在通过 ajax 调用一个方法 checkData 后,该方法实际上将重新计算用户输入并更新 renderResult 的值。即

<p:selectOneMenu id="citytSelection"
    value="#{pBean.selectedCity}">  
    <f:selectItem itemLabel="Select your city..." itemValue="" />
    <f:selectItems value="#{pBean.cityList}" />
    <p:ajax listener="#{pBean.checkData}" update="yourOutputPanelId" />
</p:selectOneMenu>

您的输出面板将如下所示:

<p:outputPanel rendered="#{pBean.renderResult}" id="yourOutputPanelId">
   <ui:include src="result.xhtml"/>
</p:outputPanel>

您的检查数据:

public void checkData() {
  this.renderResult = false;
  if (profilIsOk()) {
    Date dateEffet = rechercheDate();
    Parametres param = rechercheParam();
    FacesContext fc = FacesContext.getCurrentInstance();
    EBean eBean = (EBean) fc.getViewRoot().getViewMap().get("eBean");
    if (eBean !=null) {
        Calcul calcul = new Calcul();
        List<Tarif> tarifs = new ArrayList<Tarif>();
        tarifs = calcul.calculTarif(dateEffet, param, eBean.getType());
        this.renderResult = true;
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多