如何在JSF中创建有效的“全选”复选框

我想在JSF h:datatable实现select all复选框。 这是h:datatable的代码:

          

DX-57 History Center

= SessionsController.totalRows}" > = SessionsController.totalRows}" >

这是托管bean:

 package com.DX_57.HM_57; /* * include default packages for Beans */ import java.io.Serializable; 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.*; import javax.annotation.PostConstruct; import javax.sql.DataSource; import javax.annotation.Resource; import javax.faces.bean.ViewScoped; 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") @ViewScoped public class Sessions implements Serializable { /* * Call the Oracle JDBC Connection driver */ @Resource(name = "jdbc/Oracle") private DataSource ds; // Data. private List dataList; // Rows 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; /* * Constructor */ public Sessions() { /* * Set default properties */ 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. } public class ActiveSessionObj { /* * Oracle table structure CREATE TABLE ACTIVESESSIONSLOG( ASESSIONID * VARCHAR2(30 ) NOT NULL, USERID VARCHAR2(30 ), ACTIVITYSTART * TIMESTAMP(6), ACTIVITYEND TIMESTAMP(6), ACTIVITY CLOB ) */ private String aSessionID; private String userID; private Date activityStart; private Date activityEnd; private String activity; //private boolean selected; public ActiveSessionObj(String aSessionID, String userID, Date activityStart, Date activityEnd, String activity) { this.aSessionID = aSessionID; this.userID = userID; this.activityStart = activityStart; this.activityEnd = activityEnd; this.activity = activity; } public int getFirstRow() { return firstRow; } public String getaSessionID() { return aSessionID; } public void setaSessionID(String aSessionID) { this.aSessionID = aSessionID; } public String getactivity() { return activity; } public void setactivity(String activity) { this.activity = activity; } public Date getactivityEnd() { return activityEnd; } public void setactivityEnd(Date activityEnd) { this.activityEnd = activityEnd; } public Date getactivityStart() { return activityStart; } public void setactivityStart(Date activityStart) { this.activityStart = activityStart; } public String getuserID() { return userID; } public void setuserID(String userID) { this.userID = userID; } private ActiveSessionObj() { throw new UnsupportedOperationException("Not yet implemented"); } } // 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 = list(firstRow, rowsPerPage, sortField, sortAscending); totalRows = countDBRowNum(); //count the tablerows } catch (Exception e) { throw new RuntimeException(e); } // 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 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 ActiveSessionObj 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 ActiveSessionObj 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 list(int firstRow, int rowCount, String sortField, boolean sortAscending) throws SQLException { String SqlStatementSmall = null; String SQLStatementLarge = null; if (ds == null) { throw new SQLException(); } Connection conn = ds.getConnection(); if (conn == null) { throw new SQLException(); } int countrow = firstRow + rowCount; String sortDirection = sortAscending ? "ASC" : "DESC"; /* * For small tables */ SqlStatementSmall = "SELECT c.*" + " FROM (SELECT b.*, rownum rn" + " FROM (SELECT a.*" + " FROM activeSessionsLog a" + " ORDER BY %s %s) b" + " WHERE rownum  ?"; /* * For huge datatables optimized for perfomance */ SQLStatementLarge = "select * from" + " (select asl.*, row_number() over (order by userid asc) r " + " from activesessionslog asl)" + " where r > 980750 and r <= 980800;"; String sql = String.format(SqlStatementSmall, sortField, sortDirection); PreparedStatement ps = null; ResultSet resultSet = null; List dataList = new ArrayList(); try { conn.setAutoCommit(false); boolean committed = false; ps = conn.prepareStatement(sql); ps.setInt(1, countrow); ps.setInt(2, firstRow); resultSet = ps.executeQuery(); /* * take the result from the SQL query and insert it into Array List * collection */ dataList = ActiveSessionsArrayList(resultSet); conn.commit(); committed = true; } finally { ps.close(); 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 countDBRowNum() throws Exception { String SqlStatement = null; if (ds == null) { throw new SQLException(); } Connection conn = ds.getConnection(); if (conn == null) { throw new SQLException(); } SqlStatement = "SELECT count(*) FROM ACTIVESESSIONSLOG"; PreparedStatement ps = null; ResultSet resultSet = null; int count = 0; try { conn.setAutoCommit(false); boolean committed = false; try { SqlStatement = "SELECT count(*) FROM ACTIVESESSIONSLOG"; ps = conn.prepareStatement(SqlStatement); resultSet = ps.executeQuery(); if (resultSet.next()) { count = resultSet.getInt(1); } conn.commit(); committed = true; } finally { if (!committed) { conn.rollback(); } } } finally { ps.close(); conn.close(); } return count; } /** * Map the current row of the given ResultSet to ActiveSessionObj. * * @param resultSet The ResultSet of which the current row is to be mapped * to ActiveSessionObj. * @return The mapped ActiveSessionObj from the current row of the given * ResultSet. * @throws SQLException If something fails at database level. */ private ArrayList ActiveSessionsArrayList(ResultSet rs) throws SQLException { ArrayList list = new ArrayList(); try { while (rs.next()) { list.add(new ActiveSessionObj( rs.getString("ASESSIONID"), rs.getString("USERID"), timestampToDate(rs.getTimestamp("ACTIVITYSTART")), timestampToDate(rs.getTimestamp("ACTIVITYEND")), rs.getString("ACTIVITY"))); } } catch (Exception x) { x.printStackTrace(); } return list; } //get the selected rows private HashMap selectedIds = new HashMap(); // get the list from the JSF page public Map getSelectedIds() { return selectedIds; } //delete all selected checkboxes public void deleteSelectedIDs() throws SQLException { boolean success = false; if (ds == null) { throw new SQLException(); } Connection conn = ds.getConnection(); if (conn == null) { throw new SQLException(); } PreparedStatement ps = null; ResultSet resultSet = null; try { conn.setAutoCommit(false); boolean committed = false; try { String sqlDeleteQuery = "DELETE FROM ACTIVESESSIONSLOG WHERE ASESSIONID = ?"; Set keySet = selectedIds.keySet(); String[] keys = new String[]{}; keys = selectedIds.keySet().toArray(keys); ps = conn.prepareStatement(sqlDeleteQuery); for (int i = 0; i < keys.length; i++) { ps.setString(1, keys[i]); ps.executeUpdate(); ps.clearParameters(); selectedIds.put(keys[i], false); //get(keys[i]) = false; } conn.commit(); committed = true; //selectedIds.clear(); } finally { if (!committed) { conn.rollback(); } } } finally { ps.close(); conn.close(); } /* * // Get selected items. boolean success = false; try { String * sqlDeleteQuery = ""; * * Set keySet = selectedIds.keySet(); Iterator keyIterator = * keySet.iterator(); while(keyIterator.hasNext()) { keyIterator.next(); * } * * } * catch(Exception x) { success = false; } // Do your thing with the * MyData items in List selectedDataList. */ //return success; // Navigation case. } private static Date timestampToDate(java.sql.Timestamp ts) { Date d = null; try { d = new Date(ts.getTime()); } catch (Exception e) { e.printStackTrace(); } return d; } } 

我的问题是如何实现选择性全select all按钮。 创建java方法的一种方法,它获取数据库表的所有键并创建存储所有键的hashmap。 像这样的东西:

 private HashMap selectedIds = new HashMap(); 

当我尝试实现选择行复选框时,此代码非常有效。 问题是当我有100万行或更多行进入数据库表时会发生什么? 在这种情况下,所有键都将被插入一个非常大的hashmap中,也许我会得到错误,因为内存消耗太大了。 有更优化的解决方案吗?

祝彼得

UPDATE

我已经实现了用于选择行的简单复选框,并将它们传递给删除java方法,该方法是使用键将行删除到数据库表中。 但是我如何实现select all into JavaScript client side并调用java方法删除数据库表中的所有记录?

你可以做这样的事情

       

在你的js中放置此代码

  $(window).load(function () { $(document).delegate(".checkall", "click", function(event) { $(this).closest("table").find(':checkbox').attr('checked', this.checked); }); }); 

btw而不是存储在map中你可以像这样添加属性到你的迭代item :而不是value="#{SessionsController.selectedIds[item.aSessionID]}"这样的value="#{item.selected}"

稍后您可以在服务器端迭代它们并添加到将发送给您的列表中删除方法…

选择是客户端操作。 所以你可以使用JavaScript实现这一点。 一个想法是将特定的CSS类添加到您要选择的所有复选框(然后更容易选择它们):

       

然后,您可以简单地使用以下jQuery代码来检查具有此特定CSS类的所有元素: jQuery(".selectable-checkbox").attr("checked", true);

如果您不使用jQuery,您可以执行相同的操作,稍微调整一下此处显示的代码: 如何在JavaScript中按类获取元素?


关于你的编辑:

你想要一个按钮Select all 删除表中所有项目的按钮?

如果需要实现这一点,请将此按钮重命名为Delete all items ,只需调用Java方法(即经典 ),而无需选中复选框。 选择项目的兴趣是什么,因为你之后会删除它们?

对于JSF 2,对于selectionMode中数据表中选定的所有行,paginator = true:在页面中

   /// toggleSelect is dispared on click to checkbox header  

我已使用此代码选择所有复选框:

$(window).load(function(){

  $(document).delegate(".checkall", "click", function(event) { $(this).closest("table").find(':checkbox').attr('checked', this.checked); }); }); 

当我在标题中选中/取消选中复选框时,它正常工作,然后选中/取消选中该列下的所有复选框。 但如果再次选择相同的,则不会选择其他复选框。 。