1

I have a JSF page which renders a text field depending on the value of a drop down using primefaces ajax listner. The dynamic rendering is done fine. but the problem is once I submit the form the the bound value of that textfield doesn't get bound instead it is shown as null.

this is the part of my JSF only the necessary fields are included here

<h:panelGroup id="textPanel" >
<h:form id="main" prependId="false"> 
<h:outputText value="WorkFlow ID:" />  
<h:selectOneMenu id="workFlows"  value="#{workFlowSelectionController.selectedWorkFlowId}" >
<p:ajax event="change" listener="#{workFlowSelectionController.dropDownChange}"  update="textPanel"/>
<f:selectItems value="#{workFlowSelectionController.allActiveworkFlows}"/>
</h:selectOneMenu> 
<p:inputText  value="#{workFlowSelectionController.texField}" rendered="#{workFlowSelectionController.textfieldVisibility}"/>
<p:commandButton ajax="false"  value="Next"   action="#{workFlowSelectionController.addWorkFlowselectionDetails}"/>  
</h:form>
</h:panelGroup>    

this is my managed bean

@ManagedBean
@RequestScoped
public class WorkFlowSelectionController {
private boolean textfieldVisibility = false;
private String texField;

public void dropDownChange() {
    logger.info("WorkFlowSelectionController.dropDownChange() entered");



    if (selectedWorkFlowId != null) {

        if (selectedWorkFlowId.equals("-1")) {
            textfieldVisibility = true;
            operationListStatus = false;


        } else {
            textfieldVisibility = false;
            operationListStatus = true;

        }
    } else {
        textfieldVisibility = false;
        operationListStatus = true;

    }
public void addWorkFlowselectionDetails() throws CloneNotSupportedException {



    System.out.println("Selected Value of Text Field is" + texField);


}
public String getTexField() {
    return texField;
}

public void setTexField(String texField) {
    this.texField = texField;
}
}

i haven't included the dropdown code of the backing bean. i just need an idea of what i am doing wrong here if i remove the rendered attribute of the textfield it works fine.

thank you

1 Answers1

2

Put the bean in the view scope instead of request scope. A request scoped is recreated on every single HTTP request. The boolean property will default to false again whenever you submit the form, so the submitted value won't be processed then.

@ManagedBean
@ViewScoped
public class WorkFlowSelectionController {
    //
}

A view scoped bean will live as long as you're (ajax-) interacting with the same view by returning null or void from action(listener) methods.

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • if `p:commandButton` is not ajax i.e. `ajax="false"` than it should in `@RequestScope`? – Sarz Mar 05 '15 at 05:19