Rotom92
Rotom92

Reputation: 766

update of a render component that updates another component

I have a problem that i can't solve. I have my xhtml page:

enter image description here

The problem is that i have a form where i insert the name and select the location of a travel. It renders an external panel "Volo" where the selectionMenu is updated with some values got from DB based on location selected. Next i want to get a value from Volo selection and update the another panel with ID="HE"(is the one called HotelEsc). I'm in trouble with the selectionMenu in "Volo" because i can't get the value into it. Always gives an NullPointException error. Probably the problem is that i'm trying to understand how Update and render work and i am mistaking something about these operations. Hope on your help thank you.

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

Code of related 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;
}
}

Upvotes: 0

Views: 1347

Answers (2)

Rotom92
Rotom92

Reputation: 766

After lots of attempts, i understood how render/update works. I hope the solution with the xhtml here down helps other people with the same problem: The updates have to be done on the components that you want to refresh(for example in my situation the targets of the updates given from chosen values in selections); process has to be used to specificate which components are used to implement the action.

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

Upvotes: 0

Hatem Alimam
Hatem Alimam

Reputation: 10048

You are somehow misunderstood the use of some attributes.

I'll post my notes on your code.

The p:commandButton inside Volo section is confusing

  1. it doesn't have a render attribute, it's the update instead, you should remove render.
  2. The update you have is updating the current section Volo is that what you need ?
  3. it's processing only the first section which is regGrid, which means that the values inside Volo section won't be updated to the model inside the managedBean (causing the NullPointer), is that what you want ? don't think so.

Your "HE" button should be link this (If I understood what you want correctly)

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

Hope this Helps...

Upvotes: 1

Related Questions