Properties of h:selectOneMenu tags become to null after button clicked
giannisapi Mar 27, 2009 12:04 PMHi all,
I have created a seam application using seam gen and now i am trying to extend its functionality. What am trying to do is:
i) render the page and display some lists using s:selectItems and h:selectOneMenu.
ii) the user should select the desired values, put the search text in a h:inputText box and hit submit.
iii) now the suer should the results of the search at the bottom of the page.
The problem is that as soon i hit the button to execute the query all the values of the h:selectOneMenu tags resolve to null so the application fails.
I was wondering if i could somehow disable the h:selectOneMenu tags or give a sollution to this.
Below i give my source pages:
My action class MotorcycleActionImpl.java is:
package com.advert.sbeans; import java.io.Serializable; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import javax.ejb.Remove; import javax.ejb.Stateful; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import com.advert.ebeans.Motorcycle; import com.advert.ebeans.Motorcyclecateg; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Destroy; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Out; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.datamodel.DataModel; import org.jboss.seam.annotations.datamodel.DataModelSelection; @Stateful @Name("motorcycleService") @Scope(ScopeType.SESSION) public class MotorcycleActionImpl implements Serializable,MotorcycleAction{ /** * */ private static final long serialVersionUID = 1L; private String searchString; private int pageSize = 10; private int page = 2; private List<Integer> registrationYears = new ArrayList<Integer>(); private List<Integer> kilometers = new ArrayList<Integer>(); private List<String> price = new ArrayList<String>(); // @DataModelSelection(value="motorcyclesList") private Motorcycle motor; private String motorcyclecategory; @PersistenceContext private EntityManager entityManager; private String category; @In(required=false) @Out(required=false) private Integer fromYear; @In(required=false) @Out(required=false) private Integer toYear; @In(required=false) @Out(required=false) private Integer fromKilometers; @In(required=false) @Out(required=false) private Integer toKilometers; @In(required=false) @Out(required=false) private String fromPrice; @In(required=false) @Out(required=false) private String toPrice; @DataModel private List<String> motorcycleCats = new ArrayList<String>(); @DataModel private List<Motorcycle> motorcyclesList = new ArrayList<Motorcycle>(); @SuppressWarnings("unchecked") public void queryMotorcycles() { System.out.println("size of motorcycles"); //getMotorcycleCats(); List temp; motorcyclesList = entityManager.createQuery( "select motor from Motorcycle motor "// + //" where lower(motoCategory.category) like #{pattern} " ).getResultList(); System.out.println("motorcyclesList : " + motorcyclesList.toString()); //System.out.println("size of motorcycles is: " + motorcycles.size()); } // @Factory("motorcyclesList") public List<Motorcycle> getMotorcyclesList() { return motorcyclesList; } public void setMotorcyclesList(List<Motorcycle> motorcyclesList) { this.motorcyclesList = motorcyclesList; } //@Factory("motor") public Motorcycle getMotor() { return motor; } public void setMotor(Motorcycle motor) { this.motor = motor; } //@Factory("motorcyclecategory") public String getMotorcyclecategory() { System.out.println("getMotorcyclecateg()"); return motorcyclecategory; } public void setMotorcyclecategory(String motorcyclecategory) { System.out.println("setMotorcyclecateg()"); this.motorcyclecategory = motorcyclecategory; } //@Factory("price") public List<String> getPrice() { Integer priceInt = 0; while (priceInt <= 10000) { this.price.add(priceInt.toString()); priceInt = priceInt + 2000; } while (priceInt <= 50000) { this.price.add(priceInt.toString()); priceInt = priceInt + 5000; } this.price.add("More than 50000"); return price; } public void setPrice(List<String> price) { this.price = price; } //@Factory("fromPrice") public String getFromPrice() { return fromPrice; } public void setFromPrice(String fromPrice) { System.out.println("setFromPrice"); this.fromPrice = fromPrice; } //@Factory("toPrice") public String getToPrice() { return toPrice; } public void setToPrice(String toPrice) { this.toPrice = toPrice; } //@Factory("kilometers") public List<Integer> getKilometers() { Integer max = 300000; Integer min = 0; while (min < max) { kilometers.add(min); min = min + 5000; } return kilometers; } public void setKilometers(List<Integer> kilometers) { this.kilometers = kilometers; } //@Factory("registrationYears") public List<Integer> getRegistrationYears() { if (this.registrationYears != null || this.registrationYears.size() > 0) { registrationYears = new ArrayList<Integer>(); } BigInteger year = (BigInteger ) entityManager.createNativeQuery( "select year(current_date())" ) .getSingleResult(); for (Integer from = Integer.parseInt(year.toString()) - 50; from <= Integer.parseInt(year.toString()); from++) { this.registrationYears.add(from); } return registrationYears; } public void setRegistrationYears(List<Integer> registrationYears) { this.registrationYears = registrationYears; } //@Factory("motorcycleCats") public List<String> getMotorcycleCats() { System.out.println("getMotorcycleCats"); List<Motorcyclecateg> temp = new ArrayList<Motorcyclecateg>(); temp = entityManager.createQuery( "select motoCategory from Motorcyclecateg motoCategory " ) .getResultList(); for(Motorcyclecateg cat: temp) { motorcycleCats.add(cat.getCategory()); } return motorcycleCats; } //@Factory("fromKilometers") public Integer getFromKilometers() { return fromKilometers; } public void setFromKilometers(Integer fromKilometers) { this.fromKilometers = fromKilometers; } //@Factory("toKilometers") public Integer getToKilometers() { return toKilometers; } public void setToKilometers(Integer toKilometers) { this.toKilometers = toKilometers; } //@Factory("fromYear") public Integer getFromYear() { return fromYear; } public void setFromYear(Integer fromYear) { this.fromYear = fromYear; } //@Factory("toYear") public Integer getToYear() { return toYear; } public void setToYear(Integer toYear) { this.toYear = toYear; } public void setMotorcycleCats(List<String> motorcycleCats) { System.out.println("setMotorcycleCats"); this.motorcycleCats = motorcycleCats; } //@Factory("category") public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public void nextPage() { page++; } public void find() { page = 0; if (motorcycleCats != null) { motorcycleCats.clear(); } } public void validate(){ } public boolean isNextPageAvailable() { return motorcycleCats!=null && motorcycleCats.size()==pageSize; } public String getSearchString() { return searchString; } public void setSearchString(String searchString) { this.searchString = searchString; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } @Remove public void remove(){ } @Destroy public void destroy(){ } }
Which implements the interface:
package com.advert.sbeans; import java.util.List; import javax.ejb.Local; import com.advert.ebeans.Motorcycle; import com.advert.ebeans.Motorcyclecateg; @Local public interface MotorcycleAction { public String getCategory(); public void setCategory(String category); public void setMotor(Motorcycle motor) ; public Motorcycle getMotor() ; public void setMotorcyclecategory(String motorcyclecategory); public List<String> getPrice() ; public void setPrice(List<String> price); public String getFromPrice(); public void setFromPrice(String fromPrice); public String getToPrice() ; public void setToPrice(String toPrice); public Integer getFromYear(); public void setFromYear(Integer fromYear); public Integer getToYear(); public void setToYear(Integer toYear); public void setRegistrationYears(List<Integer> registrationYears); public List<Integer> getKilometers(); public void setKilometers(List<Integer> kilometers); public Integer getFromKilometers(); public void setFromKilometers(Integer fromKilometers) ; public Integer getToKilometers() ; public void setToKilometers(Integer toKilometers); public List<Integer> getRegistrationYears(); public void queryMotorcycles(); public List<Motorcycle> getMotorcyclesList(); public void setMotorcyclesList(List<Motorcycle> motorcyclesList); public void nextPage(); public void find(); public void validate(); public boolean isNextPageAvailable(); public String getSearchString(); public void setSearchString(String searchString); public int getPageSize(); public void setPageSize(int pageSize); public int getPage(); public void setPage(int page); public List<String> getMotorcycleCats(); public void setMotorcycleCats(List<String> motorcycleCats); public void remove(); }
And my xhtml page is:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" xmlns:a="http://richfaces.org/a4j" template="layout/template.xhtml"> <ui:define name="body"> <f:facet name="header">motorcycleAction</f:facet> <h:form id="MotorcycleActionForm"> <fieldset> <table border="1"> <tr> <td>Select Category</td> <td><h:selectOneMenu id="selectedMotoCategory" value="#{motorcycleService.category}" required="false" > <s:selectItems id="selectMotoCategory" value="#{motorcycleService.motorcycleCats}" var="category" label="#{category}"/> </h:selectOneMenu> </td> </tr> <tr> <td>From: </td> <td><h:selectOneMenu id="selectedFromYear" value="#{fromYear}" > <s:selectItems id="selectFromYear" value="#{motorcycleService.registrationYears}" var="fromYear" label="#{fromYear}"/> </h:selectOneMenu> </td> <td>To:</td> <td><h:selectOneMenu id="selectedToYear" value="toYear" > <s:selectItems id="selectToYear" value="#{motorcycleService.registrationYears}" var="toYear" label="#{toYear}"/> </h:selectOneMenu> </td> </tr> <tr> <td>From Kms: </td> <td><h:selectOneMenu id="selectedFromKilometers" value="#{fromKilometers}" > <s:selectItems id="selectFromKilometers" value="#{motorcycleService.kilometers}" var="fromKilometers" label="#{fromKilometers}"/> </h:selectOneMenu> </td> <td>To Kms:</td> <td><h:selectOneMenu id="selectedToKilometers" value="toKilometers" > <s:selectItems id="selectToKilometers" value="#{motorcycleService.kilometers}" var="toKilometers" label="#{toKilometers}"/> </h:selectOneMenu> </td> </tr> <tr> <td>From Price: </td> <td><h:selectOneMenu id="selectedFromPrice" value="#{fromPrice}" > <s:selectItems id="selectFromPrice" value="#{motorcycleService.price}" var="fromPrice" label="#{fromPrice}"/> </h:selectOneMenu> </td> <td>To Price:</td> <td><h:selectOneMenu id="selectedToPrice" value="toPrice" > <s:selectItems id="selectToPrice" value="#{motorcycleService.price}" var="toPrice" label="#{toPrice}"/> </h:selectOneMenu> </td> </tr> <tr> <td> Select Criteria </td> <td> <h:inputText id="searchString" value="#{motorcycleService.searchString}" style="width: 165px;"> </h:inputText> </td> </tr> <tr> <td> <h:commandButton id="searchMotorcycles" value="Find Motorcycles" action="#{motorcycleService.queryMotorcycles}" reRender="motorcycleResults"/> </td> </tr> </table> </fieldset> </h:form> <a:outputPanel id="motorcycleResults"> <div class="section"> <h:outputText value="No Motorcycles Found" rendered="#{motorcyclesList} != null and #{motorcyclesList}.rowCount==0}"/> <h:dataTable id="motorcyclesList" value="#{motorcyclesList}" var="motor" rendered="#{motorcyclesList.rowCount>0}"> <h:column> <f:facet name="header">Name</f:facet> #{motor.category} </h:column> <h:column> <f:facet name="header1">Price</f:facet> #{motor.price} </h:column> <h:column> <f:facet name="header2">Model</f:facet> #{motor.model} </h:column> </h:dataTable> </div> </a:outputPanel> </ui:define> </ui:composition>
Any help would be much appreciated.
Kind Regards,
Ioannis