Button/Link
Data
Input
Miscellaneous
Multimedia
Output
Panel
Select
JSTL
Faces Core
Facelets
Extensions

alloy:dataTable

DataTable is a UIData (iterator) component that renders a table element with tabular data and is designed to be used in conjunction with alloy:column child component tags. Since it extends HtmlDataTable, it supports all the features of h:dataTable.

Lazy Usage

The table rows contained in the DataModel can be fetched in a lazy (on-demand) manner by having the value attribute bound via EL to an instance of OnDemandDataModel. The rows are fetched on the server-side whenever the user clicks on a pagination control, selects a sort column, or enters a filter.
Customers
  • Results 1-10 of 162 (Page 1 of 17)
First Name Last Name Date of Birth Country
John Adams Nov 30, 1735 United States
Samuel Adams Oct 27, 1722 United States
Josiah Bartlett Dec 21, 1729 United States
Carter Braxton Oct 16, 1736 United States
Charles Carroll Oct 19, 1737 United States
Benjamin Franklin Feb 17, 1706 United States
Elbridge Gerry Mar 03, 1701 United States
John Hancock Feb 23, 1737 United States
Thomas Jefferson May 13, 1743 United States
Francis Lewis Apr 21, 1713 United States

Source Code

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:alloy="http://liferay.com/faces/alloy"
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<alloy:form id="myForm">
<alloy:field label="#{i18n['rows-per-page']}">
<alloy:selectOneMenu value="#{dataTableBacking.rowsPerPage}">
<f:selectItem itemLabel="5" itemValue="5" />
<f:selectItem itemLabel="10" itemValue="10" />
<f:selectItem itemLabel="25" itemValue="25" />
<f:selectItem itemLabel="50" itemValue="50" />
<f:selectItem itemLabel="75" itemValue="75" />
<f:selectItem itemLabel="100" itemValue="100" />
<f:ajax render="@form" />
</alloy:selectOneMenu>
</alloy:field>
<alloy:messages globalOnly="true" layout="table" />
<alloy:dataTable id="customerTable"
rows="#{dataTableBacking.rowsPerPage}" value="#{dataTableBacking.customerOnDemandDataModel}"
var="customer">
<f:facet name="header">
<alloy:outputText value="#{i18n['customers']}" />
<alloy:paginator />
</f:facet>
<alloy:column headerText="#{i18n['first-name']}">
<alloy:outputText value="#{customer.firstName}" />
</alloy:column>
<alloy:column headerText="#{i18n['last-name']}">
<alloy:outputText value="#{customer.lastName}" />
</alloy:column>
<alloy:column headerText="#{i18n['date-of-birth']}">
<alloy:outputText value="#{customer.dateOfBirth}">
<f:convertDateTime pattern="MMM dd, yyyy" />
</alloy:outputText>
</alloy:column>
<alloy:column headerText="#{i18n['country']}">
<alloy:outputText value="#{customer.country.countryName}"/>
</alloy:column>
</alloy:dataTable>
</alloy:form>
</ui:composition>
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@ManagedBean
@ViewScoped
public class DataTableBacking implements Serializable {
// serialVersionUID
private static final long serialVersionUID = 1715081848553221866L;
// Injections
@ManagedProperty(value = "#{customerService}")
private transient CustomerService customerService;
// Private Data Members
private List<Customer> customerDataModel;
private DataModel<Customer> customerOnDemandDataModel;
private int rowsPerPage = 10;
private List<Customer> selectedCustomers;
private String selectionMode = "checkbox";
private String summaryPosition = "bottom";
public void determineSelectedCustomers(ActionEvent actionEvent) {
FacesContext facesContext = FacesContext.getCurrentInstance();
selectedCustomers = new ArrayList<Customer>();
UICommand commandButton = (UICommand) actionEvent.getSource();
DataTable customerDataTable = (DataTable) commandButton.findComponent("customers");
String selectedRowIndexes = customerDataTable.getSelectedRowIndexes();
if ((selectedRowIndexes != null) && (selectedRowIndexes.length() > 0)) {
int originalRowIndex = customerDataTable.getRowIndex();
String[] selectedRowIndexArray = selectedRowIndexes.split(",");
StringBuilder facesMessageText = new StringBuilder();
for (String selectedRowIndex : selectedRowIndexArray) {
int rowIndex = Integer.parseInt(selectedRowIndex);
customerDataTable.setRowIndex(rowIndex);
Customer customer = (Customer) customerDataTable.getRowData();
selectedCustomers.add(customer);
if (facesMessageText.length() > 0) {
facesMessageText.append(", ");
}
facesMessageText.append(customer.getFirstName());
facesMessageText.append(" ");
facesMessageText.append(customer.getLastName());
}
if (facesMessageText.length() > 0) {
FacesMessage facesMessage = new FacesMessage(facesMessageText.toString());
facesContext.addMessage(null, facesMessage);
}
customerDataTable.setRowIndex(originalRowIndex);
}
else {
FacesMessage facesMessage = new FacesMessage("No Customers Selected");
facesContext.addMessage(null, facesMessage);
}
}
public List<Customer> getCustomerDataModel() {
if (customerDataModel == null) {
customerDataModel = customerService.getAllCustomers();
}
return customerDataModel;
}
public DataModel getCustomerOnDemandDataModel() {
if (customerOnDemandDataModel == null) {
customerOnDemandDataModel = new CustomerOnDemandDataModel(getRowsPerPage());
}
return customerOnDemandDataModel;
}
public int getRowsPerPage() {
return rowsPerPage;
}
public List<Customer> getSelectedCustomers() {
return selectedCustomers;
}
public String getSelectionMode() {
return selectionMode;
}
public String getSummaryPosition() {
return summaryPosition;
}
public void modeSwitch(ValueChangeEvent valueChangeEvent) {
UISelectOne selectOneMenu = (UISelectOne) valueChangeEvent.getSource();
DataTable customerDataTable = (DataTable) selectOneMenu.findComponent("customers");
customerDataTable.setSelectedRowIndexes(null);
}
public void rowDeselectListener(AjaxBehaviorEvent ajaxBehaviorEvent) {
// When using JSF 2.2, this cast is unnecessary, and the method can take the RowDeselectEvent directly.
RowDeselectEvent rowDeselectEvent = (RowDeselectEvent) ajaxBehaviorEvent;
addFacesMessage(rowDeselectEvent, rowDeselectEvent.getRowIndex(), (Customer) rowDeselectEvent.getRowData());
}
public void rowDeselectRangeListener(AjaxBehaviorEvent ajaxBehaviorEvent) {
// When using JSF 2.2, this cast is unnecessary, and the method can take the RowDeselectRangeEvent directly.
RowDeselectRangeEvent rowDeselectRangeEvent = (RowDeselectRangeEvent) ajaxBehaviorEvent;
addFacesMessage(rowDeselectRangeEvent, rowDeselectRangeEvent.getRowIndexes(),
rowDeselectRangeEvent.getRowDataList());
}
public void rowSelectListener(AjaxBehaviorEvent ajaxBehaviorEvent) {
// When using JSF 2.2, this cast is unnecessary, and the method can take the RowSelectEvent directly.
RowSelectEvent rowSelectEvent = (RowSelectEvent) ajaxBehaviorEvent;
addFacesMessage(rowSelectEvent, rowSelectEvent.getRowIndex(), (Customer) rowSelectEvent.getRowData());
}
public void rowSelectRangeListener(AjaxBehaviorEvent ajaxBehaviorEvent) {
// When using JSF 2.2, this cast is unnecessary, and the method can take the RowSelectRangeEvent directly.
RowSelectRangeEvent rowSelectRangeEvent = (RowSelectRangeEvent) ajaxBehaviorEvent;
addFacesMessage(rowSelectRangeEvent, rowSelectRangeEvent.getRowIndexes(), rowSelectRangeEvent.getRowDataList());
}
public void setCustomerService(CustomerService customerService) {
// Injected via @ManagedProperty annotation.
this.customerService = customerService;
}
public void setRowsPerPage(int rowsPerPage) {
this.rowsPerPage = rowsPerPage;
}
public void setSelectionMode(String selectionMode) {
this.selectionMode = selectionMode;
}
public void setSummaryPosition(String summaryPosition) {
this.summaryPosition = summaryPosition;
}
protected void addFacesMessage(FacesEvent facesEvent, int rowIndex, Customer customer) {
FacesContext facesContext = FacesContext.getCurrentInstance();
StringBuilder messageText = new StringBuilder();
messageText.append("Received ");
messageText.append(facesEvent.getClass().getSimpleName());
messageText.append(" for rowIndex=[");
messageText.append(rowIndex);
messageText.append("] customer=[");
messageText.append(customer.getFirstName());
messageText.append(" ");
messageText.append(customer.getLastName());
messageText.append("] in the ");
messageText.append(facesEvent.getPhaseId().toString());
messageText.append(" phase.");
FacesMessage facesMessage = new FacesMessage(messageText.toString());
facesContext.addMessage(null, facesMessage);
}
protected void addFacesMessage(FacesEvent facesEvent, int[] rowIndexes, List<Object> customerList) {
FacesContext facesContext = FacesContext.getCurrentInstance();
StringBuilder messageText = new StringBuilder();
messageText.append("Received ");
messageText.append(facesEvent.getClass().getSimpleName());
messageText.append(" for rowIndexes=");
messageText.append(Arrays.toString(rowIndexes));
if (customerList != null) {
messageText.append(" Customers=[");
for (int i = 0; i < customerList.size(); i++) {
if (i > 0) {
messageText.append(", ");
}
Customer customer = (Customer) customerList.get(i);
messageText.append(customer.getFirstName());
messageText.append(" ");
messageText.append(customer.getLastName());
}
messageText.append("]");
}
messageText.append(" in the ");
messageText.append(facesEvent.getPhaseId().toString());
messageText.append(" phase.");
FacesMessage facesMessage = new FacesMessage(messageText.toString());
facesContext.addMessage(null, facesMessage);
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
public class CustomerOnDemandDataModel extends OnDemandDataModel<Customer> implements Serializable {
// serialVersionUID
private static final long serialVersionUID = 1715725381634521866L;
// Transient Data members
private transient CustomerService customerService;
private int rowsPerPage;
public CustomerOnDemandDataModel(int rowsPerPage) {
this.rowsPerPage = rowsPerPage;
}
@Override
public int countRows() {
return getCustomerService().getCustomerCount();
}
@Override
public List<Customer> findRows(int startRow, int finishRow, List<SortCriterion> sortCriteria) {
CustomerComparator customerComparator = new CustomerComparator(sortCriteria);
List<Customer> customers = getCustomerService().getCustomers(startRow, finishRow, customerComparator);
FacesMessage facesMessage = new FacesMessage("OnDemandDataModel: Fetched row index range " + startRow + "-" +
finishRow);
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.addMessage(null, facesMessage);
return customers;
}
@Override
public int getRowsPerPage() {
return rowsPerPage;
}
protected CustomerService getCustomerService() {
if (customerService == null) {
// In order to accommodate clustered environments, the CustomerService is transient and therefore must be
// self-injected.
FacesContext facesContext = FacesContext.getCurrentInstance();
Application application = facesContext.getApplication();
ELResolver elResolver = application.getELResolver();
ELContext elContext = facesContext.getELContext();
customerService = (CustomerService) elResolver.getValue(elContext, null, "customerService");
}
return customerService;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Liferay Faces Alloy 4.1.1 + Liferay Faces Bridge Implementation 5.0.0 + Showcase Common 4.0.0 + Liferay Faces Util 3.4.1 + Mojarra 2.2.20