0

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;
}
Odgiiv
  • 683
  • 1
  • 11
  • 32
  • Can you explain the problem in more detail. Whats the scope of your managed bean, and can you add the code of the prepareSearchResultView too? What do you want to achieve after clicking the command button, do you want to change something or do you want to navigate to another page? – cubbuk Jan 17 '13 at 09:30
  • post your `searchView` code show the used annotations – Daniel Jan 17 '13 at 09:33
  • Btw: never do business logic in getters. See also http://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple-times/2090062#2090062 – BalusC Jan 17 '13 at 15:30

1 Answers1

2

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.

<h:selectOneMenu id="searchtype" value="#{searchView.selectedType}" style="width: 230px">
    <f:selectItems value="{searchView.searchType}"/>
</h:selectOneMenu>

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:selectItems values 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.

<h:selectOneMenu id="searchtype" value="#{searchView.selectedType}" style="width: 230px">
    <f:selectItems value="{searchView.searchType}" 
                   var="searchType" 
                   itemLabel=#{searchType.key} 
                   itemValue=#{searchType.value}/>
</h:selectOneMenu>

List<RowItems> searchType = Lists.newArrayList(); // guave constructor

@PostConstruct
public void initBean(){
    if(loginview.isAbleToGetCitizenInfo() || loginview.isUserAdmin()){
        searchType.add(new RowItems("searchType1", "searchcitizenbyregno"));
        searchType.add(new RowItems("searchtype2", "searchcitizenbyname"));
    }
    if(loginview.isAbleToGetOrgInfo() || loginview.isUserAdmin()){
        searchType.add(new RowItems("searchtype3", "searchorgbyregno"));
        searchType.add(new RowItems("searchtype4", "searchgorgbyname"));
        searchType.add(new RowItems("searchtype5", "searchorgbystateregno"));
    }
}

public List<RowItems> getSearchType(){
    return searchType
}

Lastly your prepareSearchList function's last statement return null is not necessary and should be removed as it is an unreachable code according to what you have posted.

Community
  • 1
  • 1
cubbuk
  • 7,800
  • 4
  • 35
  • 62