1
votes

Im developing web application in jsf primefaces, im facing one problem in getting the value from the dataTable

here is my xhtml code

<p:contextMenu for="table">
        <p:menuitem value="Allocate" actionListener="#{allocation.allocate}" update="msg"/> 
</p:contextMenu>
<p:dataTable id="table" var="batch" value="#{allocation.batchInfoList}" rowKey="#{batch.id}"  
                 selection="#{allocation.batchInfo}" selectionMode="single">  
        <p:column headerText="Tan">  
            <h:outputText value="#{batch.tan}" />  
        </p:column> 
        <p:column headerText="Username">  
            <h:outputText value="#{batch.users.curator}" />
        </p:column>
        <p:column headerText="Status">  
            <h:outputText value="#{batch.status}" />  
        </p:column> 
 </p:dataTable> 

and here is my action code

package com.cation.action;

import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.cation.bean.BatchInfo;
import com.cation.bean.Users;
import com.cation.controller.CationController;

public class Allocation {

    private String batchName;

    private String curator;

    private String tanNumber;

    private List<BatchInfo> batchInfoList;

    private List<String> batchList = new ArrayList<String>();

    private List<Users> usersList = new ArrayList<Users>();

    private BatchInfo batchInfo = new BatchInfo();

    private CationController cationController = new CationController();

    public String getBatchName() {
        return batchName;
    }

    public void setBatchName(String batchName) {
        this.batchName = batchName;
    }

    public List<BatchInfo> getBatchInfoList() {
        return batchInfoList;
    }

    public void setBatchInfoList(List<BatchInfo> batchInfoList) {
        this.batchInfoList = batchInfoList;
    }

    public List<String> getBatchList() {
        return batchList;
    }

    public void setBatchList(List<String> batchList) {
        this.batchList = batchList;
    }

    public List<Users> getUsersList() {
        return usersList;
    }

    public void setUsersList(List<Users> usersList) {
        this.usersList = usersList;
    }

    public String getCurator() {
        return curator;
    }

    public void setCurator(String curator) {
        this.curator = curator;
    }

    public String getTanNumber() {
        return tanNumber;
    }

    public void setTanNumber(String tanNumber) {
        this.tanNumber = tanNumber;
    }

    public BatchInfo getBatchInfo() {
        return batchInfo;
    }

    public void setBatchInfo(BatchInfo batchInfo) {
        this.batchInfo = batchInfo;
    }

    @SuppressWarnings("unchecked")
    public Allocation() {
        try {
            HttpServletRequest request = (HttpServletRequest) FacesContext
                    .getCurrentInstance().getExternalContext().getRequest();
            HttpSession session = request.getSession();
            usersList = (List<Users>) session.getAttribute("allUsers");
            batchList = cationController.getAllBatch();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public String handleBatch() {
        try {
            batchInfoList = new ArrayList<BatchInfo>();
            batchInfoList = cationController.getBatchByName(batchName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "allotInput";
    }

    public void allocate() {
        System.out.println(batchInfo);
    }
}

My problem is when selecting the row value from the datatable by a right click event and selecting the allocate, it invokes the method but the object is returned as null. I am not sure whether i have put the code in the datatable tag in xhtml correctly.

can any one help me to solve this issue. Just to get the selected row value or object of it.

2

2 Answers

1
votes

First-of-all try to annotate your Bean with

@ManagedBean
@SessionScoped
public class Allocation {
...
}

And how you are using a actionListener, maybe you need to user a ActionEvent on the method

public void allocate(ActionEvent event) {
    System.out.println(batchInfo);
}
0
votes

Try using an ajax call. It is very simple. Add a row click listener method for the rowSelect event.

<h:form id="tableForm">
    <p:dataTable id="userTable" var="item" value="#{myMB.batchList}"
                selectionMode="single" rowKey="#{item}" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="5,10,15" paginatorPosition="bottom">
        <p:ajax event="rowSelect" listener="#{myMB.rowClickListener}"
                    update="@form" />
                <p:column headerText="Column Field1" >
                    <h:outputText value="#{item.field1}" />
                </p:column>
                <p:column headerText="Column Field2" >
                    <h:outputText value="#{item.field2}" />
                </p:column>
    </p:dataTable>
</h:form>

And into your managed bean:

public void rowClickListener(SelectEvent event) {
    if (event.getObject() != null) {
        Batch pickedBatch= (Batch) event.getObject();
        // do what you need with your selected batch object
    }
}

Hope it can be handy for you. Good luck!