0

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

1 回答 1

0

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

private Boolean renderResult;

它的吸气剂和二传手。使用 @PostConstruct 来初始化 renderResult = false。在通过 ajax 调用方法 checkData 后,该方法实际上将重新计算用户输入并更新 renderResult 的值。IE

<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;
    }
  }
}
于 2013-10-14T16:01:54.157 回答