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