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