【问题标题】:update of a render component that updates another component更新另一个组件的渲染组件的更新
【发布时间】:2014-01-21 10:25:05
【问题描述】:

我有一个我无法解决的问题。我有我的 xhtml 页面:

问题是我有一个表格,我可以在其中插入姓名并选择旅行地点。它呈现一个外部面板“Volo”,其中 selectionMenu 会根据所选位置使用从 DB 获取的一些值进行更新。接下来,我想从 Volo 选择中获取一个值,并使用 ID="HE" 更新另一个面板(即名为 HotelEsc 的面板)。 我在“Volo”中的 selectionMenu 遇到了麻烦,因为我无法将值放入其中。总是给出 NullPointException 错误。问题可能是我试图了解更新和渲染是如何工作的,而我对这些操作有误解。希望得到您的帮助,谢谢。

xhtml代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">


<h:head>
    <title>Add a Default Package</title>
</h:head>
<h:body>
    <h:form id="form">


        <p:panel header="DefaultPackage Form">
            <h:panelGrid columns="3" id="regGrid">

                <h:outputLabel for="Name">Name:</h:outputLabel>
                <p:inputText id="Name"
                    value="#{addDefaultPackageBean.defpackDTO.name}" />
                <p:message for="Name" />

                <h:outputLabel for="location">Locations Available:</h:outputLabel>

                <h:selectOneMenu for="location"
                    value="#{addDefaultPackageBean.defpackDTO.location}">
                    <f:ajax listener="#{addDefaultPackageBean.Search()}" render="Volo"  />
                    <f:selectItems id="location"
                        value="#{addDefaultPackageBean.availableLocations}" />
                </h:selectOneMenu>

            </h:panelGrid>
        </p:panel>





        <p:panel header="Voli Disponibili per la location selezionata"
            id="Volo">

            <h:outputLabel for="Fly">Volo:</h:outputLabel>
            <h:selectOneMenu for="Fly" value="#{addDefaultPackageBean.fly}">
                <f:selectItems id="Fly" value="#{addDefaultPackageBean.elelisfly}"
                    var="ElementDTO" itemValue="#{ElementDTO.name}"
                    itemLabel="#{ElementDTO.name}" />
            </h:selectOneMenu>

        <p:commandButton action="#{addDefaultPackageBean.sel()}" value="HE" render=":form,:form:regularGrid,:form:Volo" update=":form:Volo" process="form:regGrid,@this"></p:commandButton>
        </p:panel>




        <p:panel header="HotelEsc" id="HotelEscursioni">
            <h:panelGrid columns="3" id="regularGrid">

                <h:outputLabel for="Hotel">Hotel:</h:outputLabel>
                <h:selectOneMenu for="Hotel" value="#{addDefaultPackageBean.hotel}">
                    <f:selectItems id="Hotel"
                        value="#{addDefaultPackageBean.elelishotel}" var="ElementDTO"
                        itemValue="#{ElementDTO.name}" itemLabel="#{ElementDTO.name}" />
                </h:selectOneMenu>
                <p:message for="Hotel" />

                <h:outputLabel for="Escursion">Escursioni:</h:outputLabel>
                <f:facet name="header">Clicca su view per vedere i dettagli</f:facet>
                <p:dataTable id="Escursion" var="esc"
                    value="#{addDefaultPackageBean.elelisescursion}"
                    rowKey="#{esc.name}"
                    selection="#{addDefaultPackageBean.selectedEscursions}"
                    selectionMode="multiple">
                    <p:column headerText="Nome">  #{esc.name}  </p:column>

                    <p:column headerText="Costo">  #{esc.cost}  </p:column>

                    <p:column headerText="Data Iniziale">  #{esc.startingDate}  </p:column>

                    <p:column headerText="Data Fine">  #{esc.endingDate}  </p:column>

                    <f:facet name="footer">

                    </f:facet>
                </p:dataTable>

            </h:panelGrid>
        </p:panel>

    </h:form>
</h:body>

</html>

相关bean的代码:

package beans;

import java.awt.Event;
import java.io.Serializable;
import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.view.ViewScoped;

import elementManagement.ElementMgr;
import elementManagementDTO.ElementDTO;
import DefaultPackageManagement.DefaultPackageMgr;
import DefaultPackageManagementDTO.DefaultPackageDTO;


@ManagedBean(name="addDefaultPackageBean") //come viene richiamato 
@ViewScoped
public class AddDefaultPackageBean{

    /**
     * 
     */

    @EJB
    private DefaultPackageMgr defpackMgr;
    private DefaultPackageDTO defpackDTO;
    private ArrayList<ElementDTO> elelisfly;
    private ArrayList<ElementDTO> elelishotel;
    private ArrayList<ElementDTO> elelisescursion;
    private ArrayList<ElementDTO> elelis;
    private ElementDTO[] selectedEscursions;
    private String fly;
    private String hotel;
    private boolean flag=true;
    private boolean flagdopo=true;
    private ArrayList<String> availableLocations;
    private ElementDTO flyElem;

    @EJB
    private ElementMgr elemMgr;



    public ElementDTO[] getSelectedEscursions() {
        return selectedEscursions;
    }
    public void setSelectedEscursions(ElementDTO[] selectedEscursions) {
        this.selectedEscursions = selectedEscursions;
    }
    public AddDefaultPackageBean() {        
        defpackDTO = new DefaultPackageDTO();
    }

    @PostConstruct
    public void init()
    {
        this.elelisfly=new ArrayList<ElementDTO>();
        this.elelishotel=new ArrayList<ElementDTO>();
        this.elelisescursion=new ArrayList<ElementDTO>();
        this.setElelis(elemMgr.getAllElements());
        this.availableLocations=new ArrayList<String>();
        this.flyElem=new ElementDTO();
        for(ElementDTO e:elelis)
        {
                if (this.availableLocations.contains(e.getLocation())==false)
                        {

                         this.availableLocations.add(e.getLocation());  

                        }
        }   
    }


    public String add() {
        this.AssignElemFlyFromSelection();
        this.AssignElemHotelFromSelection();
        this.AssignElemEscursionFromSelection();
        defpackMgr.save(defpackDTO);
        return "/employee/index?faces-redirect=true";
    }

    public void sel()
    {
        System.out.print("ehila" );
        this.setElelis(this.elemMgr.getAllElementsByLocation(this.defpackDTO.getLocation()));
         for(ElementDTO e:elelis)
           {
               System.out.print("elemento della location Haiti "+e.getName());
           }
        this.AssignElemFlyFromSelection();
        System.out.print(this.fly+"Il volo selezionato per la location è "+this.getFlyElem().getName() );
        this.elelisescursion.clear();
        this.elelishotel.clear();

        for(ElementDTO e:elelis)
        {
            if(e.getType().equals("Hotel"))
            {
                 System.out.print("ho un hotel tra gli elementi "+e.getName() );
                if(e.getStartingDate().after(this.flyElem.getStartingDate())&&((e.getEndingDate().before(this.flyElem.getEndingDate()))))
                {
                 System.out.print("ho un hotel tra gli elementi con le date giuste"+e.getName());
                    this.getElelishotel().add(e);

                }
            }
            else
            {

            if(e.getType().equals("Escursion"))
            {
                if(e.getStartingDate().after(this.flyElem.getStartingDate())&&(e.getEndingDate().before(this.flyElem.getEndingDate())))
                {

                    this.getElelishotel().add(e);

                }

            }

            }
        }
    this.setFlag(true);
    this.setFlagdopo(true); 


    }


    public DefaultPackageDTO getDefpackDTO() {
        return defpackDTO;
    }
    public void setDefpackDTO(DefaultPackageDTO defpackDTO) {
        this.defpackDTO = defpackDTO;
    }
    public ArrayList<ElementDTO> getElelisfly() {
        return elelisfly;
    }
    public void setElelisfly(ArrayList<ElementDTO> elelisfly) {
        this.elelisfly = elelisfly;
    }
    public ArrayList<ElementDTO> getElelishotel() {
        return elelishotel;
    }
    public void setElelishotel(ArrayList<ElementDTO> elelishotel) {
        this.elelishotel = elelishotel;
    }
    public ArrayList<ElementDTO> getElelisescursion() {
        return elelisescursion;
    }
    public void setElelisescursion(ArrayList<ElementDTO> elelisescursion) {
        this.elelisescursion = elelisescursion;
    }
    public String getFly() {
        return fly;
    }
    public void setFly(String fly) {
        this.fly = fly;
    }
    public String getHotel() {
        return hotel;
    }
    public void setHotel(String hotel) {
        this.hotel = hotel;
    }

    private void AssignElemFlyFromSelection()
    {
        for (ElementDTO elem:this.elelisfly)
        {
            if(elem.getName().equals(this.fly))
            {
                this.flyElem=elem;
            }
        }
    }

    private void AssignElemHotelFromSelection()
    {
        for (ElementDTO elem:this.elelishotel)
        {
            if(elem.getName().equals(this.hotel))
            {
                this.defpackDTO.getElem().add(elem);
            }
        }
    }

    private void AssignElemEscursionFromSelection()
    {
        for(int i=0;i<selectedEscursions.length;i++)
        {
                this.defpackDTO.getElem().add(selectedEscursions[i]);
        }
    }

   public void Search(){



       String s=defpackDTO.getLocation();
       System.out.print("luogo scelto "+s);
       this.setElelis(this.elemMgr.getAllElementsByLocation(s));
       for(ElementDTO e:elelis)
       {
           System.out.print("aggiungo volo "+e.getName());
           if(e.getType().equals("Flight"))
           {
               this.getElelisfly().add(e);
               System.out.print("aggiungo volo "+e.getName());
           }
       }
       this.setFlag(true);
   }

public ArrayList<ElementDTO> getElelis() {
    return elelis;
}
public void setElelis(ArrayList<ElementDTO> elelis) {
    this.elelis = elelis;
}
public ArrayList<String> getAvailableLocations() {
    return availableLocations;
}
public void setAvailableLocations(ArrayList<String> availableLocations) {
    this.availableLocations = availableLocations;
}
public Boolean getFlag() {
    return flag;
}
public void setFlag(Boolean flag) {
    this.flag = flag;
}
public boolean isFlagdopo() {
    return flagdopo;
}
public void setFlagdopo(boolean flagdopo) {
    this.flagdopo = flagdopo;
}
public ElementDTO getFlyElem() {
    return flyElem;
}
public void setFlyElem(ElementDTO flyElem) {
    this.flyElem = flyElem;
}
}

【问题讨论】:

    标签: jsf jsf-2 primefaces


    【解决方案1】:

    您在某种程度上误解了某些属性的使用。

    我会在你的代码上发表我的笔记。

    Volo 部分中的p:commandButton 令人困惑

    1. 它没有render 属性,而是update,您应该删除render
    2. 你的更新是更新当前部分Volo是你需要的吗?
    3. 它只处理regGrid 的第一部分,这意味着Volo 部分中的值不会更新到managedBean 中的模型(导致NullPointer),这是你想要的吗?不这么认为。

    你的“HE”按钮应该链接这个(如果我理解你想要的正确的话)

    <p:commandButton action="#{addDefaultPackageBean.sel()}" 
                     value="HE"
                     update="HotelEscursioni" process="@parent">
    </p:commandButton>
    

    希望对您有所帮助...

    【讨论】:

    • 嗨,首先,感谢您的回答。我想用“Volo”中选择菜单中的值更新“HotelEscursioni”的值。空指针由“Volo”的选择菜单中fly的空值给出。这是问题吗,我无法从选择中检索值。根据您的提示,“volo”中的选择值仍然显示,但按钮不执行任何操作
    • @Rotom92 在这种情况下,怀疑您有验证错误..可能需要基于您的对象的转换器..
    • 不要认为它..可能是渲染/更新的问题...我可能在某些时候弄错了
    【解决方案2】:

    经过多次尝试,我了解了渲染/更新的工作原理。我希望这里使用 xhtml 的解决方案可以帮助其他有同样问题的人: 必须对要刷新的组件进行更新(例如,在我的情况下,从选择中的选定值给出的更新目标);必须使用流程来指定使用哪些组件来执行操作。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui">
    
    
    <h:head>
        <title>Add a Default Package</title>
    </h:head>
    
    <h:body>
        <h:form id="form">
    
    
                    <p:outputLabel for="Name">Name:</p:outputLabel>
                    <p:inputText id="Name"
                        value="#{addDefaultPackageBean.defpackDTO.name}" />
                    <p:message for="Name" />
    
                    <p:outputLabel for="Location">Locations Available:</p:outputLabel>
                    <p:selectOneMenu id="Location" 
                        value="#{addDefaultPackageBean.defpackDTO.location}">
                        <f:selectItems 
                            value="#{addDefaultPackageBean.availableLocations}" />
                    </p:selectOneMenu>
                <p:commandButton action="#{addDefaultPackageBean.Search()}" value="Ciao" render=":form:Volo" update=":form:Volo :form"></p:commandButton>
    
    
    
    
    
    
    
            <p:panel header="Voli Disponibili per la location selezionata"
                id="Volo" rendered="#{addDefaultPackageBean.flag}">
    
                <h:panelGrid columns="3" id="voloGrid">
                <p:outputLabel for="Volare">Volo:</p:outputLabel>
                <p:selectOneMenu for="Volare" value="#{addDefaultPackageBean.fly}">
                    <f:selectItems id="Volare" value="#{addDefaultPackageBean.elelisfly}"
                        var="Ciao" itemValue="#{Ciao.name}" 
                        itemLabel="#{Ciao.name}" />
                </p:selectOneMenu>
    
                <p:commandButton actionListener="#{addDefaultPackageBean.sel()}" value="hesef" update=":form:voloGrid :form:HotelEscursioni" process=":form:Location,:form:voloGrid,@this"/>
                </h:panelGrid>
    
    
            </p:panel>
    
            <p:panel header="HotelEscurs" id="HotelEscursioni" rendered="#{addDefaultPackageBean.flagdopo}">
    
    
                    <p:outputLabel for="Hotel">Hotel:</p:outputLabel>
                    <p:selectOneMenu for="Hotel" value="#{addDefaultPackageBean.hotel}">
                        <f:selectItems id="Hotel"
                            value="#{addDefaultPackageBean.elelishotel}" var="ElementDTO"
                            itemValue="#{ElementDTO.name}" itemLabel="#{ElementDTO.name}" />
                    </p:selectOneMenu>
                    <p:message for="Hotel" />
    
    
    
    
    
    
                    <p:dataTable id="Escursion" var="esc"
                        value="#{addDefaultPackageBean.elelisescursion}"
                        rowKey="#{esc.name}"
                        selection="#{addDefaultPackageBean.selectedEscursions}"
                        selectionMode="multiple">
                        <p:column headerText="Nome">  #{esc.name}  </p:column>
    
                        <p:column headerText="Costo">  #{esc.cost}  </p:column>
    
                        <p:column headerText="Data Iniziale">  #{esc.startingDate}  </p:column>
    
                        <p:column headerText="Data Fine">  #{esc.endingDate}  </p:column>
    
                        </p:dataTable>
    
                    </p:panel>
    
    
    
    
    
    
    
    
        </h:form>
    </h:body>
    
    </html>
    

    【讨论】:

      猜你喜欢
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 2022-06-30
      • 2019-01-31
      • 2021-08-17
      • 2017-08-30
      相关资源
      最近更新 更多