tags:

views:

48

answers:

1

I am using a JSF data table. One of the columns in the table is a Command button.

When this button is clicked I need to pass few parameters (like a value of the selected row) using the Expression language. This paramaters need to be passed to the JSF managed bean which can execute methods on them.

I have used the following snippet of code but the value i am getting on the JSF bean is always null.

<h:column>
<f:facet name="header">
<h:outputText value="Follow"/>
</f:facet>

<h:commandButton id="FollwDoc" action="#{usermanager.followDoctor}" value="Follow" />
<h:inputHidden id="id1" value="#{doc.doctorid}" />

</h:column>

Bean Method:

public void followDoctor()
{
FacesContext context = FacesContext.getCurrentInstance();
Map requestMap = context.getExternalContext().getRequestParameterMap();
String value = (String)requestMap.get("id1");
System.out.println("Doctor Added to patient List"+ value);
}

How can I pass values to the JSF managed bean with a commandbutton?

+2  A: 

Use DataModel#getRowData() to obtain the current row in action method.

@ManagedBean
@ViewScoped
public class Usermanager {
    private List<Doctor> doctors;
    private DataModel<Doctor> doctorModel;

    @PostConstruct
    public void init() {
        doctors = getItSomehow();
        datamodel = new ListDataModel<Doctor>(doctors);
    }

    public void followDoctor() {
        Doctor selectedDoctor = doctorModel.getRowData();
        // ...
    }

    // ...
}

Use it in the datatable instead.

<h:dataTable value="#{usermanager.doctorModel}" var="doc">

And get rid of that h:inputHidden next to the h:commandButton in the view.


An -less elegant- alternative is to use f:setPropertyActionListener.

public class Bean {
    private Long doctorId;

    public void followDoctor() {
        Doctor selectedDoctor = getItSomehowBy(doctorId);
        // ...
    }

    // ...
}

With the following button:

<h:commandButton action="#{usermanager.followDoctor}" value="Follow">
    <f:setPropertyActionListener target="#{usermanager.doctorId}" value="#{doc.doctorId}" />
</h:commandButton>
BalusC