jsf@viewscope、primefaces< p:dialog和< ui:include

c2e8gylq  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(311)

我有:在主页和对话框按钮。
a希望具有托管bean(newdialog.java)的viewscope生命周期,执行什么对话框。换句话说:按下按钮时重新创建NewDialogbean,关闭对话框时销毁。
但是newdialog bean在加载主页时创建了。如何在按下按钮时强制创建bean?

<ui:composition
   <h:form id="mainForm">
      <p:commandButton value="New Dialog"
                  onclick="newDialogVar.show();"/>  
   </h:form>

        <ui:include src="#{viewScopedBean.page}.xhtml" />
    </ui:define>
</ui:composition>

包含页面:

<ui:composition ..
        <f:view >
       <h:form id="formId"
         <p:dialog appendToBody="false"
                  dynamic="true"
                  modal="true"
                  widgetVar="newDialogVar">

              <p:commandButton value="Ok"
                         actionListener="#{newDialog.ok}"/>
      </h:form>
    </p:dialog>
    </f:view>
</ui:composition>

豆子:

@ManagedBean
@ViewScoped
public class NewDialog implements Serializable{

  @PostConstruct
    protected void postConstruct() {
        LOG.info("----------------- PostConstruct -------------------");
    }
}

我使用:primefaces 3.5和mojarra 2.1.22
提前谢谢!
p、 s.:根据研究,我补充说:

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

到web.xml。

n8ghc7c1

n8ghc7c11#

这是预期的行为。这个 <ui:include> 在视图生成时运行,而不是在视图渲染时运行。因此,即使您有条件地呈现它的一个父级,它仍将计算它的 src 属性创建/恢复视图时。关于“视图构建时间”和“视图渲染时间”的深入背景解释可以在以下答案中找到:jsf2 facelets中的jstl。。。有道理吗?
您的具体功能需求还不清楚,因此我无法详细阐述正确的方法,但事实是,如果您想推迟创建bean以显示对话框,则需要寻找另一种方法。也许您需要将bean分成两部分,一部分保存include路径,另一部分保存对话框的数据?

ejk8hzay

ejk8hzay2#

我有一个像你这样的场景,在对话框中显示一个图形,这个按钮调用一个方法来设置src为dialog:

<p:commandButton value="Montos" update=":form2:growl, :form2:displaygraf" oncomplete="montosDialog.show()" actionListener="#{serviciosMB.mostrarGraf}" icon="ui-icon-disk"/>

这是对话框(在同一页中)

<p:dialog id="dialog" header="Estado del monto del contrato" widgetVar="montosDialog" resizable="false">  
      <p:panel id="displaygraf">
          <ui:include src="#{serviciosMB.urlGrafMontos}" />  
      </p:panel>
   </p:dialog>

managedbean服务SMB:

public void mostrarGraf() throws Exception {
    try {
        if (this.servicioUtilNew.getContratoUtil().getMontosList().isEmpty()) {
            this.urlGrafMontos ="void.xhtml";
            JsfUtil.addWarnningMessage("El contrato no tiene montos definidos");
        } else {
              this.urlGrafMontos ="grafMontosServicios.xhtml";
        }
    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, "Error: addOrdenProdServArr() " + e.getMessage());

    }
}

这是grafmontosservicios.xhtml

<h:body>              
    <p:barChart id="stacked1" value="#{grafMontosServiciosMB.categoryModelChartMontos}"   legendPosition="ne" animate="true"
                    title="Estado del monto del contrato" barMargin="20" style="height:300px; width: 500px"/>                                                                      
</h:body>

构建图形的托管bean

public CartesianChartModel getCategoryModelChartMontos() {
    return categoryModelChartMontos;
}

public void setCategoryModelChartMontos(CartesianChartModel categoryModelChartMontos) {
    this.categoryModelChartMontos = categoryModelChartMontos;
}
/**
 * Creates a new instance of GrafMontosServiciosMB
 */
public GrafMontosServiciosMB() {
}
@PostConstruct
public void crearTablaMontos() {
    try {
        ...           
    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, "Error: createCategoryModel() " + e.getMessage());
    }
}

}

相关问题