使用分页和排序创建JSF表

时间:2012-04-06 14:17:13

标签: java jsf jsf-2

我想用分页和排序创建this JSF表。

到目前为止这是JSF代码:

<?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>

Bean代码:

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
                )
                */
    }
}

我想使用这个Oracle表来存储数据:

-- TABLE ACTIVESESSIONSLOG

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

我无法解决一些问题: 1.我想在没有Tomahawk组件库的情况下使用纯JSF,每个组件库都包含t:dataList和t:saveState组件 2.我想使用Oracle表的java代码,我想简化代码 - 删除不需要的代码。

我将把所有我的声望点给予那个能帮助我修复代码的人,当有资金可用时(两天后),无论现在或以后修复代码。

祝福 彼得

2 个答案:

答案 0 :(得分:3)

对于类似的东西,我们使用了JQuery datatables插件(http://datatables.net/),它很容易实现。

答案 1 :(得分:2)

尝试使用Primefaces datatable。 这很容易。