h:selectOneMenu - Ajax is not working

UI Components for JSF
averri
Posts: 136
Joined: 07 Sep 2009, 15:51
Location: Brazil

05 Oct 2009, 15:52

Hi,

I'm trying to use p:ajax tag inside a h:selectOneMenu but the actionListener (AccountManager.countrySelected) is not beeing invoked.

The xhtml page fragment:

Code: Select all

<h:form prependId="false" >
    <h:selectOneMenu  id="country" required="true" value="#{AccountManager.selectedCountry}"  >
        <f:selectItems value="#{AccountManager.availableCountries}" />
        <p:ajax event="change" partialSubmit="true" update="city" actionListener="#{AccountManager.countrySelected}"/>
     </h:selectOneMenu>
</h:form>
The JSF managed bean:

Code: Select all

public class AccountManager implements Serializable {

    private static final long serialVersionUID = 927489238947992834L;

    private AccountService accountService;

    private CityRepository cityRepository;

    private CountryRepository countryRepository;

    // The account being managed.
    private Account account;

    // Available genders.
    private SelectItem[] availableGenders;

    // Available countries.
    private List<SelectItem> availableCountries;

    // Available cities.
    private List<SelectItem> availableCities;

    private Country selectedCountry;

    public AccountManager() {        
    }// end constructor

    @PostConstruct
    public void init() {

        // Create an empty Account.
        this.account = new Account();        
        Person person = new Person();
        person.setHomeAddress(new HomeAddress());
        this.account.setPerson(person);

        // Populate the availableGenders list.
        List<SelectItem> list = new ArrayList();
        for(Gender g : Gender.values()) {
            SelectItem item = new SelectItem(g, g.toString());
            list.add(item);
        }
        availableGenders = list.toArray(new SelectItem[0]);

        // Populate the availableCountries list.
        availableCountries = new ArrayList();
        List<Country> countryList = countryRepository.listAll();
        for(Country c : countryList) {
            availableCountries.add(new SelectItem(c, c.getName()));
        }

        populateAvailableCities((Country) availableCountries.get(0).getValue());
        
    }// end method

    /**
     * Invoked when a country is selected in the GUI.
     * @param actionEvent
     */
    public void countrySelected(ActionEvent actionEvent) {
        System.out.println("#### countrySelected.");
        populateAvailableCities(selectedCountry);
    }// end method

    public void validateLogin(FacesContext context, UIComponent component, Object input) {
        String var = (String) input;
        if ("averri".equalsIgnoreCase(var)) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "<strong>" + var + "</strong>" + " already exists!", null));
        }
    }// end method

    public void validateEmail(FacesContext context, UIComponent component, Object input) {
        String var = (String) input;
        if ("alexandreverri@gmail.com".equals(var)) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "<strong>" + var + "</strong>" + " already exists for another account!", null));
        }
    }// end method

    /**
     * 
     * @param country
     */
    public void populateAvailableCities(Country country) {
        availableCities = new ArrayList();
        if(country == null) {
            return;
        }
        List<City> cities = cityRepository.findByCountryCode(country.getCode());
        for(City c : cities) {
            availableCities.add(new SelectItem(c, c.getName()));
        }
    }// end method

    public String requestAccount() {
        try {
            accountService.requestAccount(account);

            addInfoMessage("Sucess", "Account created");
            
        } catch (AccountServiceException e) {
            addWarnMessage("Error", e.getMessage());
        }
        return null;
    }// end method

    public void setAccountService(AccountService accountService) {
        this.accountService = accountService;
    }

    public void setCityRepository(CityRepository cityRepository) {
        this.cityRepository = cityRepository;
    }

    public void setCountryRepository(CountryRepository countryRepository) {
        this.countryRepository = countryRepository;
    }    

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    /**
     * @return the availableGenders
     */
    public SelectItem[] getAvailableGenders() {
        return availableGenders;
    }

    /**
     * @param availableGenders the availableGenders to set
     */
    public void setAvailableGenders(SelectItem[] availableGenders) {
        this.availableGenders = availableGenders;
    }

    /**
     * @return the availableCountries
     */
    public List<SelectItem> getAvailableCountries() {
        return availableCountries;
    }

    /**
     * @param availableCountries the availableCountries to set
     */
    public void setAvailableCountries(List<SelectItem> availableCountries) {
        this.availableCountries = availableCountries;
    }

    /**
     * @return the selectedCountry
     */
    public Country getSelectedCountry() {
        return selectedCountry;
    }

    /**
     * @param selectedCountry the selectedCountry to set
     */
    public void setSelectedCountry(Country selectedCountry) {
        this.selectedCountry = selectedCountry;
    }

    /**
     * @return the availableCities
     */
    public List<SelectItem> getAvailableCities() {
        return availableCities;
    }

    /**
     * @param availableCities the availableCities to set
     */
    public void setAvailableCities(List<SelectItem> availableCities) {
        this.availableCities = availableCities;
    }    

}// end class

cagatay.civici
Prime
Posts: 18616
Joined: 05 Jan 2009, 00:21
Location: Cybertron
Contact:

06 Oct 2009, 11:42

Can you compare it with the select components examples?

http://97.107.138.40:8080/prime-showcas ... Select.jsf

averri
Posts: 136
Joined: 07 Sep 2009, 15:51
Location: Brazil

06 Oct 2009, 20:59

Hi Cagatay,

sure. In my case, I need to compare my code with the 'Double Combo' example but unfortunately it is missing from PrimeFaces ShowCase source.

Could you please provide the source code for 'Double Combo' example?

Thank you.


averri
Posts: 136
Joined: 07 Sep 2009, 15:51
Location: Brazil

10 Oct 2009, 00:42

Dear Cagatay,

The examples you provided are equal to my project, but in my case it's not working. I don't know what else can I do. :(

Thank you.
A. Verri

averri
Posts: 136
Joined: 07 Sep 2009, 15:51
Location: Brazil

10 Oct 2009, 19:04

Hi Cagatay

I've discovered that p:ajax is not working properly.

Consider my Double Combo example. I have two selectOneMenu - the country and the city. When the country component is selected, the city component must be populated with corresponding cities.

In order to make my double combo example to work, the containing form could not have components with required properties empty - even if set partialSumbit="true" and immediate="true" in the country component. You must set country as follows:

Code: Select all

<h:form prependId="false" >
    <h:selectOneMenu  id="country" required="true" value="#{AccountManager.selectedCountry}" immediate="true" >
        <f:selectItems value="#{AccountManager.availableCountries}" />
        <p:ajax event="change" partialSubmit="false" update="city" actionListener="#{AccountManager.countrySelected}"/>
     </h:selectOneMenu>
     <h:selectOneMenu id="city" ...>
</h:form>
I cannot use partialSubmit='true' in my contry component - in any case.

I would like to suggest you to revise the p:ajax component, because it's not respecting the jsf lifecycle.

Thank you.

cagatay.civici
Prime
Posts: 18616
Joined: 05 Jan 2009, 00:21
Location: Cybertron
Contact:

11 Oct 2009, 12:43

Sure Averri, I'll look into this, thanks for the feedback!

cagatay.civici
Prime
Posts: 18616
Joined: 05 Jan 2009, 00:21
Location: Cybertron
Contact:

01 Nov 2009, 16:41

I've tested this and it seems to be working fine. Of course the action didn't fire when validation failed because of another component with validations in same form. But when I set partialSubmit to true, it worked.

huthief
Posts: 5
Joined: 18 Jan 2010, 09:56

21 Jan 2010, 18:47

I tried Combo selectOneMenu , it works.
But if there are more than tow h:selectOneMenu , the secend or third h:selectOneMenu p:ajax not working.

My step is selected HA , then HB , HB 's p:ajax nerver working .(see Code)

When I selected "HB", MYSelectedHB always empty ,not the value I selected.
At this moment , the browser show serval selectItems via MYSelectItemsHB ,but only the inital selectItem in the source code (view by borwser's "see source code").

primefaces-1.0.0-SNAPSHOT.jar (1/16/2010) I uesd.

Is anyone can help me ?

Thank you.

The following code p:ajax not working....

Code: Select all

	<h:form id="myForm" prependId="false">
 	
	        <h:commandButton value="DO" action="#{TEST.doAA}"/>	

		<h:selectOneMenu id="HA" value="#{TEST.MYSelectedHA}">
			<f:selectItems value="#{TEST.MYSelectItemsHA}" />
			<p:ajax actionListener="#{TEST.doSelectHA}" update="HB" event="change"/>
		</h:selectOneMenu>

		<h:selectOneMenu id="HB" value="#{TEST.MYSelectedHB}">
			<f:selectItems value="#{TEST.MYSelectItemsHB}" />
			<p:ajax actionListener="#{TEST.doSelectHB}" update="HTMPL" event="change"/>
		</h:selectOneMenu>
		
		<h:selectOneMenu id="HTMPL" value="#{TEST.MYSelectedHTMPL}" >
			<f:selectItems  value="#{TEST.MYSelectItemsHTMPL}" />
		</h:selectOneMenu>
		
		<p:ajaxStatus>  
      			<f:facet name="start">  
            			<h:graphicImage value="/images/loading.gif" />  
        		</f:facet>  
          
        		<f:facet name="complete"> 
        			 <h:outputText value="" />  
        		</f:facet>
        	
    		</p:ajaxStatus> 
		</h:form>
The following code p:ajax working....

Code: Select all

	<h:form id="myForm" prependId="false">
 	
	        <h:commandButton value="DO" action="#{TEST.doAA}"/>	

		<h:selectOneMenu id="HB" value="#{TEST.MYSelectedHB}">
			<f:selectItems value="#{TEST.MYSelectItemsHB}" />
			<p:ajax actionListener="#{TEST.doSelectHB}" update="HTMPL" event="change"/>
		</h:selectOneMenu>
		
		<h:selectOneMenu id="HTMPL" value="#{TEST.MYSelectedHTMPL}" >
			<f:selectItems  value="#{TEST.MYSelectItemsHTMPL}" />
		</h:selectOneMenu>
		
		<p:ajaxStatus>  
      			<f:facet name="start">  
            			<h:graphicImage value="/images/loading.gif" />  
        		</f:facet>  
          
        		<f:facet name="complete"> 
        			 <h:outputText value="" />  
        		</f:facet>
        	
    		</p:ajaxStatus> 
		</h:form>
The java bean code

Code: Select all

public class TEST extends Paging implements Serializable {

	/**
     * 
     */

	private String MYSelectedHA = ""; // 

	private String MYSelectedHB = ""; // 

	private String MYSelectedHD = "";// 

	private String MYSelectedHTMPL = "";// 

	private SelectItem[] MYSelectItemsHA;

	private SelectItem[] MYSelectItemsHB;

	private SelectItem[] MYSelectItemsHD;

	private SelectItem[] MYSelectItemsHTMPL;

	public String getMYSelectedHB() {
		return MYSelectedHB;
	}

	public void setMYSelectedHB(String mYSelectedHB) {
		MYSelectedHB = mYSelectedHB;
	}

	public String getMYSelectedHA() {
		return MYSelectedHA;
	}

	public void setMYSelectedHA(String mYSelectedHA) {
		MYSelectedHA = mYSelectedHA;
	}

	/**
	 * 
	 * 
	 * @param actionEvent
	 */
	public void doSelectHA(ActionEvent actionEvent) {
		if (MYSelectedHA != null && !MYSelectedHA.equals("")) {
			if (MYSelectedHD != null && !MYSelectedHD.equals("")) {
				MYSelectItemsHB = SelectItems.getSelectItems(MYSelectedHA,MYSelectedHD));
			} else {
				MYSelectItemsHB = SelectItems.getSelectItems(MYSelectedHA);
			}

		} else {
			MYSelectItemsHB = SelectItems.getSelectItems(null, "");
		}
		
		MYSelectItemsHTMPL = SelectItems.getSelectItems(null, "");
	}

	/**
	 * 
	 * 
	 * @param actionEvent
	 */
	public void doSelectHD(ActionEvent actionEvent) {
		if (MYSelectedHA != null && !MYSelectedHA.equals("")) {
			if (MYSelectedHD != null && !MYSelectedHD.equals("")) {
				MYSelectItemsHB = SelectItems.getSelectItems(MYSelectedHA,MYSelectedHD);
			} else {
				MYSelectItemsHB = SelectItems.getSelectItems(MYSelectedHA);
			}

		}
		
		MYSelectItemsHTMPL = SelectItems.getSelectItems(null, "");
	}

	/**
	 * 
	 * 
	 * @param actionEvent
	 */
	public void doSelectHB(ActionEvent actionEvent) {
		if (MYSelectedHB != null && !MYSelectedHB.equals("")) {

			Object oHtmplDao = SpringContext.getBean("HtmplDao");

			HtmplEntry myE = new HtmplEntry();

			myE.setTTH2(MYSelectedHB);

			if (MYSelectedHA != null && !MYSelectedHA.equals("")) {
				myE.setTTH1(MYSelectedHA);
			}

			MYSelectItemsHTMPL = SelectItems.getSelectItems(
					((HtmplDao) oHtmplDao).getTT01TT02Items(myE), "");

		}
	}

	public String getMYSelectedHD() {
		return MYSelectedHD;
	}

	public void setMYSelectedHD(String mYSelectedHD) {
		MYSelectedHD = mYSelectedHD;
	}

	public String getMYSelectedHTMPL() {
		return MYSelectedHTMPL;
	}

	public void setMYSelectedHTMPL(String mYSelectedHTMPL) {
		MYSelectedHTMPL = mYSelectedHTMPL;
	}

	public SelectItem[] getMYSelectItemsHA() {
		if (MYSelectItemsHA == null) {
			MYSelectItemsHA = SelectItems.getSelectItems(HkeynKeeper
					.getInstance().getHK02HK03ItemsByHK01("H1"), "");
		}
		return MYSelectItemsHA;
	}

	public void setMYSelectItemsHA(SelectItem[] mYSelectItemsHA) {
		MYSelectItemsHA = mYSelectItemsHA;
	}

	public SelectItem[] getMYSelectItemsHB() {
		if (MYSelectItemsHB == null)
			MYSelectItemsHB = SelectItems.getSelectItems(null, "");
		return MYSelectItemsHB;
	}

	public void setMYSelectItemsHB(SelectItem[] mYSelectItemsHB) {
		MYSelectItemsHB = mYSelectItemsHB;
	}

	public SelectItem[] getMYSelectItemsHD() {
		if (MYSelectItemsHD == null) {
			MYSelectItemsHD = SelectItems.getSelectItems(HkeynKeeper
					.getInstance().getHK02HK03ItemsByHK01("H4"), "");
		}
		return MYSelectItemsHD;
	}

	public void setMYSelectItemsHD(SelectItem[] mYSelectItemsHD) {
		MYSelectItemsHD = mYSelectItemsHD;
	}

	public SelectItem[] getMYSelectItemsHTMPL() {
		if (MYSelectItemsHTMPL == null)
			MYSelectItemsHTMPL = SelectItems.getSelectItems(null, "");
		return MYSelectItemsHTMPL;
	}

	public void setMYSelectItemsHTMPL(SelectItem[] mYSelectItemsHTMPL) {
		MYSelectItemsHTMPL = mYSelectItemsHTMPL;

cagatay.civici
Prime
Posts: 18616
Joined: 05 Jan 2009, 00:21
Location: Cybertron
Contact:

22 Jan 2010, 13:32

Maybe you're getting validation errors, can you add a p:messages and try to update it as well.

Also what does HB render on change attribute, is it empty when you update it? Can you post the ajax response with firebug after you make an ajax request with HA selectOneMenu?

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 11 guests