【问题标题】:JSF @ViewScope, PrimeFaces <p:dialog and <ui:includeJSF @ViewScope、PrimeFaces <p:dialog 和 <ui:include
【发布时间】:2013-06-06 12:29:52
【问题描述】:

我有:主页和对话框上的按钮。

A 想要托管 bean (NewDialog.java) 的 ViewScope 生命周期,执行对话框。 换句话说:按下按钮时重新创建 NewDialog bean,并在关闭对话框时销毁。

但是在加载主页时已经创建了 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

提前致谢!

附: :根据我的研究补充:

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

到 web.xml。

【问题讨论】:

    标签: java jsf jsf-2 primefaces view-scope


    【解决方案1】:

    这是预期的行为。 &lt;ui:include&gt; 在视图构建期间运行,而不是在视图渲染期间运行。因此,即使您有条件地渲染其父级之一,它仍会在构建/恢复视图期间评估其src 属性。可以在此答案中找到“视图构建时间”与“视图渲染时间”的深入背景说明:JSTL in JSF2 Facelets... makes sense?

    您的具体功能要求不清楚,因此我无法详细说明正确的方法,但事实是,如果您想推迟 bean 的创建以显示对话框,则需要寻找替代方法。也许您需要将 bean 拆分为两个,一个包含包含路径,另一个包含对话框的数据?

    【讨论】:

    • 感谢您的快速回复!关于 - 我同意你的观点,但我不知道如何以其他方式做。有必要在主页上有对话框。
    • 关于功能需求:是的,我想推迟创建bean。原因:首先用户应该选择组件进入主页面,根据该组件创建对话框。对话框很重,我不想在主页的所有生命周期中都保留它。
    • 然后拆分bean。一个在构建视图期间使用(顺便说一下,最好是请求范围,除非您至少使用 Mojarra 2.1.18,另请参见链接的 JSTL 链接)和另一个在渲染期间使用查看和处理表单提交。在另一个中,您可以执行和管理数据的初始化/加载。
    • 必须初始化对话框,否则我会从组件中获取空指针进入对话框。
    【解决方案2】:

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

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

    托管bean serviciosMB:

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

    }

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 2014-02-19
      • 2011-07-10
      • 2012-08-17
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      相关资源
      最近更新 更多