当前位置: 首页 > 知识库问答 >
问题:

将值从一个@ViewScoped托管bean传递到另一个@ViewScoped托管bean

任小云
2023-03-14

我有一个托管beanmyBean1,它有以下方法:

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")){

所以我在这一行上附加了一个dubugger,我得到了这个:

您可以注意到,变量selectedsalleorac具有空值,而selectedsalleoracid具有字符串值。

共有1个答案

皇甫福
2023-03-14

解决办法就是使用:

<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>
 类似资料:
  • 如何从Servlet访问JSF ViewScope托管bean? (假设所讨论的托管bean已经创建,但尚未销毁)

  • 问题内容: 我一直在用@ViewScoped Managed-Bean来敲打我的头。我正在使用primeface的“计划”组件以显示一些事件。当用户单击特定按钮时,使用ajax在viewscoped bean中调用一个方法,但是每次我得到一个“ java.io.NotSerializableException”时,如果我更改托管bean范围以请求该问题,就会消失。 我究竟做错了什么?有任何想法吗?

  • 我正计划将一个web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加空beans.xml文件。 将所有JSF@ManagedBean替换为CDI@Named Annotations。 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。 将所有JSF@ManagedProperty替换为CDI@Inject Annotati

  • 托管bean它是一个纯Java类,它包含一组属性和一组,方法。 以下是托管bean方法执行的常见功能: 验证组件的数据 处理组件触发的事件 执行处理以确定应用程序必须导航的下一页 它也可以作为JFS框架的模型。 JSF托管Bean示例 请看看下面一段示例代码 - 您可以通过以下方式使用此。 通过配置成XML文件。 通过使用注释。 通过XML文件配置托管Bean 在xml文件配置是比较旧方法。 在这

  • 主要内容:使用XML配置,使用@ManagedBean注解JSF 托管bean(Managed Bean)是JSF注册的常规Java Bean类。托管bean包含getter和setter方法,业务逻辑。JSF托管bean作为UI组件的Model。 它存储JSF xhtml页面使用的数据。借助JSF框架,可以从JSF页面访问托管Bean。 在JSF 1.2中,我们必须在JSF配置文件(如)中注册受管理的bean。 从JSF 2.0可以使用注解注册管理be

  • 我有一个JSF的问题,CDI项目。我做了大量研究,发现在CDI中没有注释。我用对话框解决基于ajax的页面的问题。我想将变量从DataTable传递到dialog。为此,我不能使用bean,因为在请求结束后会丢弃值。有人能帮我解决吗?我不能使用,但这是一个糟糕的做法。或者只保存这一个变量到会话谁知道。你们能给我一些提示如何优雅地解决这个问题吗? 以下是错误消息: