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;
}
3
  • 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? Commented Jan 17, 2013 at 9:30
  • post your searchView code show the used annotations Commented Jan 17, 2013 at 9:33
  • Btw: never do business logic in getters. See also stackoverflow.com/questions/2090033/… Commented Jan 17, 2013 at 15:30

1 Answer 1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.