方法多次调用

时间:2013-10-14 13:08:40

标签: jsf primefaces

我想在某些条件下打印一系列结果。 在我的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;
     }

1 个答案:

答案 0 :(得分:0)

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

private Boolean renderResult;

与它的吸气剂和二传手。使用@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>

您的checkData:

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;
    }
  }
}