如何在jsf中使用viewscoped销毁托管bean

时间:2013-07-26 10:25:38

标签: jsf-2 primefaces destroy view-scope

我正在开发一个JSF 2.1项目。我正在使用primefaces 3.5组件。 有两个带有viewscoped的managedbean,WizardBean和CreateInputBean。它们用于向导组件(primefaces)。最后一点第一个向导,我点击一个按钮然后打开对话框。对话框中还有向导。这里使用CreateInputBean创建域对象的实例。在打开对话框后再次创建实例后,有最后一个实例的信息,因为CreateInputBean是生命。我想用ViewScoped销毁CreateInputBean,而不去另一个页面。

我尝试了这些,但他们没有工作。

@ManagedBean(name = "cbean")
@ViewScoped
public class CreateInputBean {

public void addUsage() {
    ...
    FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove("#{cbean}");
      or
    FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove("cbean");
} 
}

enter image description here

            <p:wizard flowListener="#{wizard.onFlowProcess}">
                <p:tab id="personal" title="Kullanıcı ile ilgili bilgiler">
                    ...
                </p:tab>
                <p:tab id="confirm" title="Kullanım Verileri">
                    <p:panel style="height: 600px;">
                        <p:dataTable id="liste" value="#{ubean.usages}" var="usage">
                            ...
                        </p:dataTable>
                        <p:commandButton value="Ekle" onclick="dlg.show();" type="button" />
                    </p:panel>
                    <p:dialog header="Usage Ekleme" widgetVar="dlg" showEffect="fold"
                        hideEffect="fold" height="600" width="600">
                        <p:wizard flowListener="#{cbean.onFlowProcess}">
                            <p:tab title="Servis Tipi">
                                ...
                            </p:tab>
                            <p:tab title="Kullanim Tipi">
                                ...
                            </p:tab>
                            <p:tab title="İşlem Süresi/Adedi/Miktarı">
                                <p:panel style="height: 500px; width: 500px;">
                                    <h:panelGrid columns="2">
                                        <p:outputLabel value="Term:" />
                                        <p:inputText value="#{cbean.term}" />
                                        <p:commandButton value="Save"
                                            actionListener="#{cbean.addUsage}" oncomplete="dlg.hide()"
                                            update="liste" />
                                    </h:panelGrid>
                                </p:panel>
                            </p:tab>
                        </p:wizard>
                    </p:dialog>
                </p:tab>
            </p:wizard>

1 个答案:

答案 0 :(得分:0)

我找到了办法。但是我不能破坏视图结构的托管bean。我可以在对话框中获取第一个选项卡向导并清除向导中的字段。

<script type="text/javascript">  
                function resetWizard() {
                    wiz.loadStep(wiz.cfg.steps[0], true);
                }
     </script>

   ...........................................


 <p:wizard flowListener="#{cbean.onFlowProcess}" widgetVar="wiz">


.............


  <p:commandButton value="Save" actionListener="#{cbean.addUsage}" 
       oncomplete="dlg.hide(), resetWizard()" update="liste" />



 ..........


    public void addUsage(ActionEvent actionEvent) {
    selectedServis = modalService.getServis(selectedServisID);
    selectedKullanimTipi = modalService
            .getKullanimTipi(selectedKullanimTipiID);
    ubean.addUsage(new Call(ubean.getAbone(), selectedServis, term,
            selectedKullanimTipi));

    this.selectedServisID = 1;
    this.selectedKullanimTipiID  = 1 ;
    this.selectedKullanimTipi = null;
    this.selectedTarife = null;
    this.selectedServis = null;
    this.term = null;

}