【问题标题】:pass a value from one @Viewscoped managed bean to another @Viewscoped managed bean将值从一个 @Viewscoped 托管 bean 传递到另一个 @Viewscoped 托管 bean
【发布时间】:2016-12-26 08:31:58
【问题描述】:

我有一个托管 bean myBean1,它有这个方法:

private String selectedSalleOrAc;
private String selectedSalleOrAcId;

public void effacerJourDialog(Object o){

        if(o instanceof Salle){
            this.selectedSalleOrAc = "1";
            this.selectedSalleOrAcId = ((Salle)o).getId() + "";
        }
        if(o instanceof Appareil){
            this.selectedSalleOrAc = "2";
            this.selectedSalleOrAcId = ((Appareil)o).getId() + "";       
        }

        Map<String, Object> options = new HashMap<>();
        options.put("modal", true);
        options.put("resizable", false);
        options.put("closable", true);
        options.put("width", 660);
        options.put("height", 700);
        options.put("closeOnEscape", true);
        options.put("contentWidth", 660);
        options.put("contentHeight", 700);
        // Affichage du dialogue
        Map<String, List<String>> params = new HashMap<>();
        List<String> values = new ArrayList<>();
        values.add(this.selectedSalleOrAcId);
        values.add(this.selectedSalleOrAc);
        params.put("selectedSalleOrAcId", values);
        params.put("selectedSalleOrAc", values);
        RequestContext.getCurrentInstance().openDialog("/planningSalleAppareil/effacerJour", options, params);
    }

 //Getters and Setters

所以effacerJourDialog 方法将打开一个对话框,其中传递了两个参数(selectedSalleOrAcIdselectedSalleOrAc)。

<f:metadata>
    <f:viewParam name="selectedSalleOrAcId" value="#{myBean2.selectedSalleOrAcId}" />
</f:metadata>

<f:metadata>
    <f:viewParam name="selectedSalleOrAc" value="#{myBean2.selectedSalleOrAc}" />
</f:metadata>

<ui:define name="menu">
    <p:menuitem onclick="$('#form\\:valider').click();"
                value="#{messages.valider}"
                icon="ui-icon-nouveau"/>

    <p:menuitem action="#{myBean2.retour()}"
                immediate="true"
                value="#{messages.annuler}"
                icon="ui-icon-supprimer" />


</ui:define>

<ui:define name="content">
    <h:form id="form" styleClass="ui-panel-form" >


        <p:growl id="messages" showDetail="true" showSummary="true"/>


        <p:commandButton id="validerEffacerJour"
                         action="#{myBean2.effacerJour}"
                         update="messages"/>

        <p:panel>

            <p:panelGrid>
                <p:row>
                    <p:column>
                        <h:outputLabel id="jour0"
                                       for="jour"
                                       value="#{messages.Jour}" />
                    </p:column>

                    <p:column>

                        <p:selectOneMenu id="jour"
                                         value="#{myBean2.jourAEffacer}"
                                         required="true"
                                         requiredMessage="Jour de la semaine : vous devez indiquer une valeur.">
                            <f:selectItem itemLabel="Selectionnez un jour" itemValue="" />
                            <f:selectItem itemLabel="#{messages.Jour1}" itemValue="1" />
                            <f:selectItem itemLabel="#{messages.Jour2}" itemValue="2" />
                            <f:selectItem itemLabel="#{messages.Jour3}" itemValue="3" />
                            <f:selectItem itemLabel="#{messages.Jour4}" itemValue="4" />
                            <f:selectItem itemLabel="#{messages.Jour5}" itemValue="5" />
                            <f:selectItem itemLabel="#{messages.Jour6}" itemValue="6" />
                            <f:selectItem itemLabel="#{messages.Jour7}" itemValue="7" />
                        </p:selectOneMenu>
                    </p:column>
                </p:row>

            </p:panelGrid>

        </p:panel>

    </h:form>
</ui:define>

然后命令按钮validerEffacerJour 将从myBean2 调用方法effacerJour

    private Integer jourAEffacer;

    private String selectedSalleOrAc;
    private String selectedSalleOrAcId;


    public void effacerJour(){

        Object selectedObject = null;

        if(selectedSalleOrAc.equals("1")){
            selectedObject = salleService.trouver(Integer.parseInt(selectedSalleOrAcId));
        }
        else if(selectedSalleOrAc.equals("2")){
            selectedObject = appareilService.trouver(Integer.parseInt(selectedSalleOrAcId));      
        }

        planningService.effacerJour(selectedObject, this.jourAEffacer);
    }

//Getters and setters

但我在该行中收到 NullPointerException :

if(selectedSalleOrAc.equals("1")){

所以我在这条线上附加了一个调试器,我得到了这个:

您可以注意到变量selectedSalleOrAc 有一个空值,selectedSalleOrAcId 有一个字符串值。

所以我在 effacerJourDialog 方法上附加了一个调试器:

当我将两个变量 selectedSalleOrAcselectedSalleOrAcId 传递给对话框时,您可以看到它们,但唯一的 selectedSalleOrAcId 变量在 effacerJour() 方法中是已知的。

我该如何解决这个问题?

PS:我的两个托管 bean 是视图范围的

【问题讨论】:

  • 所以你的问题实际上是:“我如何将一个值从一个 @Viewscoped 托管 bean 传递给另一个 @Viewscoped 托管 bean”,对吗?
  • @Kukeltje 是的,就是这样

标签: jsf primefaces


【解决方案1】:

解决方案就是使用:

<f:metadata>
    <f:viewParam name="selectedSalleOrAcId" value="#{myBean2.selectedSalleOrAcId}" />
    <f:viewParam name="selectedSalleOrAc" value="#{myBean2.selectedSalleOrAc}" />
</f:metadata>

而不是:

<f:metadata>
    <f:viewParam name="selectedSalleOrAcId" value="#{myBean2.selectedSalleOrAcId}" />
</f:metadata>

<f:metadata>
    <f:viewParam name="selectedSalleOrAc" value="#{myBean2.selectedSalleOrAc}" />
</f:metadata>

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2012-11-08
    • 2013-02-01
    • 2011-03-03
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多