in this page either h:commandButton doesn’t trigger action method in managed bean but when I click button it reloads current page. I don’t know why please help.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition 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"
>
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Bootstrap 101 Template</title>
<!-- Bootstrap -->
<h:outputStylesheet library ="css" name="bootstrap.css"/>
<h:outputStylesheet library ="css" name="bootstrap-responsive.css"/>
<h:outputScript library="js" name="bootstrap.js"/>
<h:outputScript library="js" name="bootstrap-responsive.js"/>
</h:head>
<h:body>
<h:form>
<label><h3>Search</h3></label>
<h:selectOneMenu id="searchtype" value="#{searchView.searchType}" style="width: 230px">
<f:selectItems value="#{searchView.searchType}"/>
</h:selectOneMenu>
<br/>
<h:inputText id="searchvalue" value="#{searchView.searchvalue}" required="true" style="height: 30px; width: 230px">
<p:watermark value="Search type" for="searchvalue"/>
</h:inputText>
<br/>
<h:commandButton id="searchbtn" value="Search" action="#{searchView.prepareSearchResultView()}" styleClass="btn"/>
</h:form>
</h:body>
</html>
And my searchView managed bean is session scoped and here is prepareSearchResultView() method in managed bean;
public String prepareSearchResultView(){
this.searchResultList = searchCustomer();
if(!this.searchResultList.isEmpty()){
this.citizenSearchResultList = getCitizenSearchList();
this.orgSearchResultList = getOrganizationSearchList();
if(getCitizenSearchList().getRowCount() >0){
return "citizensearchlist";
}else if(getOrganizationSearchList().getRowCount()>0){
return "orgsearchlist";
}
}else
return "nosearchresult";
//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "no such result", "no such result"));
return null;
}
and getSearchType() method
public Map<String, Object> getSearchType(){
Map<String, Object> returnMap = new LinkedHashMap<String, Object>();
if(loginview.isAbleToGetCitizenInfo() || loginview.isUserAdmin()){
returnMap.put("searchtype1", "searchcitizenbyregno");
returnMap.put("searchtype2", "searchcitizenbyname");
}
if(loginview.isAbleToGetOrgInfo() || loginview.isUserAdmin()){
returnMap.put("searchtype3", "searchorgbyregno");
returnMap.put("searchtype4", "searchgorgbyname");
returnMap.put("searchtype5", "searchorgbystateregno");
}
return returnMap;
}
You are using
<h:selectOneMenu>in a wrong way. Your value in the selectMenu is a map and you cannot set a value of a type of map from a select menu without using a converter. In the selectitems you should bind the value attribute to some string in the managed bean. Then in your actionMethod you can retrieve the selected value from the map by using this selected type.Please take a look at the following post to understand the concept better: Primefaces selectOneMenu listener not called with Objects other than Strings
Also retrieving
f:selectItemsvalues through a getter which does business logic is not a good practice. You should create a property in your managed bean which initialize that map in the constructor. Even more instead of using a map, it is better to use a list and encapsulate your key and value in a custom object.Lastly your
prepareSearchListfunction’s last statementreturn nullis not necessary and should be removed as it is an unreachable code according to what you have posted.