Créer JSF table avec la pagination et le tri

Je veux créer cette JSF table avec la pagination et de tri.

C'est JSF code de la mesure:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"    
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<ui:insert name="header">           
<ui:include src="header.xhtml"/>         
</ui:insert>
</h:head>
<h:body>
<h1><img src="resources/css/images/icon.png" alt="NVIDIA.com" /> History Center</h1>
<!-- layer for black background of the buttons -->
<div id="toolbar" style="margin: 0 auto; width:1180px; height:30px; position:relative;  background-color:black">
<!-- Include page Navigation -->
<ui:insert name="Navigation">           
<ui:include src="Navigation.xhtml"/>         
</ui:insert>
</div>  
<div id="greenBand" class="ui-state-default ui-corner-allh" style="position:relative; top:35px; left:0px;"> 
<h:graphicImage alt="Dashboard"  style="position:relative; top:-20px; left:9px;"  value="resources/images/logo_sessions.png" />
</div>
<div id="main" style="margin: 0 auto; width:1190px; height:700px; position:absolute;  background-color:transparent; top:105px">
<div id="mainpage" style="margin: 0 auto; width:1190px; height:500px; position:absolute;  background-color:transparent; top:80px">
<div id="settingsHashMap" style="width:750px; height:400px; position:absolute;  background-color:r; top:20px; left:1px">
<h:form id="form">
<!-- The sortable data table -->
<h:dataTable value="#{SessionsController.dataList}" var="item">
<h:column>
<f:facet name="header">
<h:commandLink value="Account Session ID" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="Account Session ID" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.ASESSIONID}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="User ID" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="User ID" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.USERID}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="Activity Start Time" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="Activity Start Time" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.ACTIVITYSTART}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="Activity End Time" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="Activity End Time" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.ACTIVITYEND}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="Activity" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="Activity" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.ACTIVITY}" />
</h:column>
</h:dataTable>
<!-- The paging buttons -->
<h:commandButton value="first" action="#{SessionsController.pageFirst}"
disabled="#{SessionsController.firstRow == 0}" />
<h:commandButton value="prev" action="#{SessionsController.pagePrevious}"
disabled="#{SessionsController.firstRow == 0}" />
<h:commandButton value="next" action="#{SessionsController.pageNext}"
disabled="#{SessionsController.firstRow + SessionsController.rowsPerPage >= SessionsController.totalRows}" />
<h:commandButton value="last" action="#{SessionsController.pageLast}"
disabled="#{SessionsController.firstRow + SessionsController.rowsPerPage >= SessionsController.totalRows}" />
<h:outputText value="Page #{SessionsController.currentPage} /#{SessionsController.totalPages}" />
<br />
<!-- The paging links -->
<t:dataList value="#{SessionsController.pages}" var="page">
<h:commandLink value="#{page}" actionListener="#{SessionsController.page}"
rendered="#{page != SessionsController.currentPage}" />
<h:outputText value="<b>#{page}</b>" escape="false"
rendered="#{page == SessionsController.currentPage}" />
</t:dataList>
<h:form id="form">
<!-- The sortable data table -->
<h:dataTable value="#{SessionsController.dataList}" var="item">
<h:column>
<f:facet name="header">
<h:commandLink value="Account Session ID" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="Account Session ID" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.ASESSIONID}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="User ID" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="User ID" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.USERID}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="Activity Start Time" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="Activity Start Time" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.ACTIVITYSTART}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="Activity End Time" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="Activity End Time" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.ACTIVITYEND}" />
</h:column>
<h:column>
<f:facet name="header">
<h:commandLink value="Activity" actionListener="#{SessionsController.sort}">
<f:attribute name="sortField" value="Activity" />
</h:commandLink>
</f:facet>
<h:outputText value="#{item.ACTIVITY}" />
</h:column>
</h:dataTable>
<!-- The paging buttons -->
<h:commandButton value="first" action="#{SessionsController.pageFirst}"
disabled="#{SessionsController.firstRow == 0}" />
<h:commandButton value="prev" action="#{SessionsController.pagePrevious}"
disabled="#{SessionsController.firstRow == 0}" />
<h:commandButton value="next" action="#{SessionsController.pageNext}"
disabled="#{SessionsController.firstRow + SessionsController.rowsPerPage >= SessionsController.totalRows}" />
<h:commandButton value="last" action="#{SessionsController.pageLast}"
disabled="#{SessionsController.firstRow + SessionsController.rowsPerPage >= SessionsController.totalRows}" />
<h:outputText value="Page #{SessionsController.currentPage} /#{SessionsController.totalPages}" />
<br />
<!-- The paging links -->
<t:dataList value="#{SessionsController.pages}" var="page">
<h:commandLink value="#{page}" actionListener="#{SessionsController.page}"
rendered="#{page != SessionsController.currentPage}" />
<h:outputText value="<b>#{page}</b>" escape="false"
rendered="#{page == SessionsController.currentPage}" />
</t:dataList>
<br />
<!-- Set rows per page -->
<h:outputLabel for="rowsPerPage" value="Rows per page" />
<h:inputText id="rowsPerPage" value="#{SessionsController.rowsPerPage}" size="3" maxlength="3" />
<h:commandButton value="Set" action="#{SessionsController.pageFirst}" />
<h:message for="rowsPerPage" errorStyle="color: red;" />
<!-- Cache bean with data list, paging and sorting variables for next request -->
<t:saveState value="#{SessionsController}" />
</h:form>        <br />
<!-- Set rows per page -->
<h:outputLabel for="rowsPerPage" value="Rows per page" />
<h:inputText id="rowsPerPage" value="#{SessionsController.rowsPerPage}" size="3" maxlength="3" />
<h:commandButton value="Set" action="#{SessionsController.pageFirst}" />
<h:message for="rowsPerPage" errorStyle="color: red;" />
<!-- Cache bean with data list, paging and sorting variables for next request -->
<t:saveState value="#{SessionsController}" />
</h:form>
</div>   
<div id="settingsdiva" style="width:350px; height:400px; position:absolute;  background-color:transparent; top:20px; left:400px">
</div>   
<div id="settingsdivb" style="width:350px; height:400px; position:absolute;  background-color:transparent; top:20px; left:800px">
</div>   
</div>  
</div>
</h:body>
</html>

Le code d'Haricot:

import java.io.Serializable;
import java.math.BigDecimal;
import javax.enterprise.context.SessionScoped;
//or import javax.faces.bean.SessionScoped;
import javax.inject.Named;
/* include SQL Packages */
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import javax.annotation.Resource;
import javax.faces.component.UICommand;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
//or import javax.faces.bean.ManagedBean;
import javax.faces.event.ActionEvent;
import org.glassfish.osgicdi.OSGiService;
@Named("SessionsController")
@SessionScoped
public class Sessions implements Serializable {
/* Call the Oracle JDBC Connection driver */
@Resource(name = "jdbc/Oracle")
private DataSource ds;
//DAO.
//   private static ActiveSessionsDAO dao = DAOFactory.getInstance("javabase").getActiveSessionsDAO();
//Data.
private List<ActiveSessions> dataList;
private int totalRows;
//Paging.
private int firstRow;
private int rowsPerPage;
private int totalPages;
private int pageRange;
private Integer[] pages;
private int currentPage;
//Sorting.
private String sortField;
private boolean sortAscending;
//Constants ----------------------------------------------------------------------------------
private static final String SQL_LIST_BY_ORDER_AND_LIMIT =
"SELECT * FROM ACTIVESESSIONSLOG ORDER BY %s %s LIMIT ?, ?";
private static final String SQL_COUNT =
"SELECT count(*) FROM ACTIVESESSIONSLOG";
private static class DAOFactory {
public DAOFactory() {
}
}
private static class ActiveSessions {
public ActiveSessions() {
}
private ActiveSessions(long aLong, String string, Integer integer) {
throw new UnsupportedOperationException("Not yet implemented");
}
}
//Properties ---------------------------------------------------------------------------------
private DAOFactory daoFactory;
//Constructors -------------------------------------------------------------------------------
Sessions(DAOFactory daoFactory) {
this.daoFactory = daoFactory;
//Set default values somehow (properties files?).
rowsPerPage = 10; //Default rows per page (max amount of rows to be displayed at once).
pageRange = 10; //Default page range (max amount of page links to be displayed at once).
sortField = "ASESSIONID"; //Default sort field.
sortAscending = true; //Default sort direction.
}
//Paging actions -----------------------------------------------------------------------------
public void pageFirst() {
page(0);
}
public void pageNext() {
page(firstRow + rowsPerPage);
}
public void pagePrevious() {
page(firstRow - rowsPerPage);
}
public void pageLast() {
page(totalRows - ((totalRows % rowsPerPage != 0) ? totalRows % rowsPerPage : rowsPerPage));
}
public void page(ActionEvent event) {
page(((Integer) ((UICommand) event.getComponent()).getValue() - 1) * rowsPerPage);
}
private void page(int firstRow) {
this.firstRow = firstRow;
loadDataList(); //Load requested page.
}
//Sorting actions ----------------------------------------------------------------------------
public void sort(ActionEvent event) {
String sortFieldAttribute = (String) event.getComponent().getAttributes().get("sortField");
//If the same field is sorted, then reverse order, else sort the new field ascending.
if (sortField.equals(sortFieldAttribute)) {
sortAscending = !sortAscending;
} else {
sortField = sortFieldAttribute;
sortAscending = true;
}
pageFirst(); //Go to first page and load requested page.
}
//Loaders ------------------------------------------------------------------------------------
private void loadDataList() {
//Load list and totalCount.
try {
dataList = dao.list(firstRow, rowsPerPage, sortField, sortAscending);
totalRows = dao.count();
} catch (Exception e) {
throw new RuntimeException(e); //Handle it yourself.
}
//Set currentPage, totalPages and pages.
currentPage = (totalRows / rowsPerPage) - ((totalRows - firstRow) / rowsPerPage) + 1;
totalPages = (totalRows / rowsPerPage) + ((totalRows % rowsPerPage != 0) ? 1 : 0);
int pagesLength = Math.min(pageRange, totalPages);
pages = new Integer[pagesLength];
//firstPage must be greater than 0 and lesser than totalPages-pageLength.
int firstPage = Math.min(Math.max(0, currentPage - (pageRange / 2)), totalPages - pagesLength);
//Create pages (page numbers for page links).
for (int i = 0; i < pagesLength; i++) {
pages[i] = ++firstPage;
}
}
//Getters ------------------------------------------------------------------------------------
public List<ActiveSessions> getDataList() {
if (dataList == null) {
loadDataList(); //Preload page for the 1st view.
}
return dataList;
}
public int getTotalRows() {
return totalRows;
}
public int getFirstRow() {
return firstRow;
}
public int getRowsPerPage() {
return rowsPerPage;
}
public Integer[] getPages() {
return pages;
}
public int getCurrentPage() {
return currentPage;
}
public int getTotalPages() {
return totalPages;
}
//Setters ------------------------------------------------------------------------------------
public void setRowsPerPage(int rowsPerPage) {
this.rowsPerPage = rowsPerPage;
}
//Actions ------------------------------------------------------------------------------------
/**
* Returns list of ActiveSessions items starting at the given first index with the given row count,
* sorted by the given sort field and sort order.
* @param firstRow First index of rows to be returned.
* @param rowCount Amount of rows to be returned.
* @param sortField Field to sort the data on.
* @param sortAscending Whether to sort data ascending or not.
* @return list of ActiveSessions items starting at the given first index with the given row count,
* sorted by the given sort field and sort order.
* @throws DAOException If something fails at DAO level.
*/
public List<ActiveSessions> list(int firstRow, int rowCount, String sortField, boolean sortAscending)
throws Exception {
Object[] values = {firstRow, rowCount};
if (ds == null) {
throw new SQLException();
}
String sortDirection = sortAscending ? "ASC" : "DESC";
String sql = String.format(SQL_LIST_BY_ORDER_AND_LIMIT, sortField, sortDirection);
Connection conn = ds.getConnection();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List<ActiveSessions> dataList = new ArrayList<ActiveSessions>();
try {
conn.setAutoCommit(false);
boolean committed = false;
//           connection = daoFactory.getConnection();
preparedStatement = conn.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
dataList.add(mapActiveSessions(resultSet));
}
} catch (SQLException e) {
throw new Exception(e);
} finally {
conn.close();
}
return dataList;
}
/**
* Returns total amount of rows in table.
* @return Total amount of rows in table.
* @throws DAOException If something fails at DAO level.
*/
public int count() throws Exception {
//       Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
int count = 0;
try {
//           connection = daoFactory.getConnection();
Connection conn = ds.getConnection();
preparedStatement = conn.prepareStatement(SQL_COUNT);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
count = resultSet.getInt(1);
}
} catch (SQLException e) {
throw new Exception(e);
} finally {
//close the connection
}
return count;
}
/**
* Map the current row of the given ResultSet to ActiveSessions.
* @param resultSet The ResultSet of which the current row is to be mapped to ActiveSessions.
* @return The mapped ActiveSessions from the current row of the given ResultSet.
* @throws SQLException If something fails at database level.
*/
private static ActiveSessions mapActiveSessions(ResultSet resultSet) throws SQLException {
return new ActiveSessions(
resultSet.getLong("ASESSIONID"),
resultSet.getString("USERID"),
resultSet.getObject("value") != null ? resultSet.getInt("value") : null);
/*
CREATE TABLE ACTIVESESSIONSLOG(
ASESSIONID VARCHAR2(30 ) NOT NULL,
USERID VARCHAR2(30 ),
ACTIVITYSTART TIMESTAMP(6),
ACTIVITYEND TIMESTAMP(6),
ACTIVITY CLOB
)
*/
}
}

Je veux utiliser cette table Oracle pour stocker des données:

-- TABLE ACTIVESESSIONSLOG
CREATE TABLE ACTIVESESSIONSLOG(
ASESSIONID VARCHAR2(30 ) NOT NULL,
USERID VARCHAR2(30 ),
ACTIVITYSTART TIMESTAMP(6),
ACTIVITYEND TIMESTAMP(6),
ACTIVITY CLOB
)
/

Il y a quelques problèmes que je ne peut pas corriger:
1. Je veux utiliser pure JSF sans le Tomahawk composant la bibliothèque elle-même qui, en vertu de chacune contient le t:dataList et t:saveState composants
2. Je veux utiliser le code java pour la table Oracle et je veux simplifier le code - supprimer le code qui n'est pas nécessaire.

Je vais donner tous mes points de Réputation dans une prime à celui qui va m'aider à corriger le code lors de la bounty est disponible (au bout de deux jours) pas de mater lorsque le code est fixe, maintenant ou plus tard.

Meilleurs voeux
Peter

InformationsquelleAutor Peter Penzov | 2012-04-06