Struts 数据分页讲解与代码实例
作者 杨川 www.efine66.com重点:本分页代码重点有两个,一个是数据封装的bean ,有一个与自身段相适应的静态方法,自动实例化多个自身实例,添加到ArrayList中。二是PageController页面控制器,实例化后,有一个根据 全部数据的ArrayList 和当前页 两个参数 返回 只含有当前页要显示记录的ArrayList . 在Action中怎么写,就要看你自己了,可灵活使用。大家直接使用的是PageController这个类,这是这个程序的精华, 不知道大家能不能理解我的意思,哈哈。1 建立与你要查询数据库中的表字段相对应的Bean。并在其中建立数据库查询方法,该方法需要一个ResultSet类型的参数,是一个静态函数,把ResultSet 中的每条记录装添到一个Bean中,然后保存到ArrayList中返回。在本例中为 XueShengBean 。2 建立一个页面数据控制器:PageController 传入由上面返回的Arraylist ,当前页 ,返回一个只包含当前页的ArrayList3建立控制器组件,这部分由Struts 中的Action来实现。主要负责将实例化数据Bean ,并利用返回的ArrayList对象,接收由视图传递而来的当前页参数。构造PageController,用PageController中的方法 来返回一个只包含当前页的ArrayLIst 并放到request 里,发送到视图显示。4建立视图组件 ,使用Struts提供的标签库,主要负责从request中取出刚刚放入的对象,而实现分页显示。
实例代码
1 数据bean
package kaka; import java.util.ArrayList; import java.sql.ResultSet; import org.apache.struts.action.ActionMessage; import java.sql.SQLException; public class XueShengBean { private String xingming; private String id; private String xingbie; private String beizhu; private String xuehao; public XueShengBean() { } public static ArrayList getArrayList(ResultSet rs) { ArrayList al = new ArrayList(); try { while (rs.next()) { XueShengBean xSB = new XueShengBean(); xSB.setXuehao(rs.getString( " xuehao " )); xSB.setXingming(rs.getString( " xingming " )); xSB.setXingbie(rs.getString( " xingbie " )); xSB.setBeizhu(rs.getString( " beizhu " )); xSB.setId(rs.getString( " id " )); al.add(xSB); } } catch (SQLException ex) { System.out.println(ex.getMessage() + " 读数据时出错 " ); } return al; } public void setXingming(String xingming) { this .xingming = xingming; } public void setId(String id) { this .id = id; } public void setXingbie(String xingbie) { this .xingbie = xingbie; } public void setBeizhu(String beizhu) { this .beizhu = beizhu; } public void setXuehao(String xuehao) { this .xuehao = xuehao; } public String getXingming() { return xingming; } public String getId() { return id; } public String getXingbie() { return xingbie; } public String getBeizhu() { return beizhu; } public String getXuehao() { return xuehao; }}
2 PageController 控制器 这个是本文的重点,在此中注意这个唯一需要我们调用的方法public ArrayList getPageArrayList(ArrayList al, int cp) 在控制器被实例化后,我们只使用这个方法即可,返回一个只有当前页所需要的ArrayList,非常方便
package db; import java.util.ArrayList; import java.sql.ResultSet; import java.util.HashMap; /** * <p>Title:分页代码—页面控制 </p> * * <p>Description:struts 分页代码—页面控制 </p> * <p>Description:2007年2月4号凌晨写下此分页代码。 * 在Bean的使用上本来想用DynaBean,不过显示的时候,就不好办了。 * 感觉数据库字段改变不是太大吧,况且一个自己写一个封装数据的Bean * 在程序别的地方,会省很多事。 * * </p> * <p>Copyright:www.efine66.com Copyright (c) 2007</p> * * <p>Company:efine </p> * @author 杨川 www.efine66.com * @version 1.0 */ public class PageController { public PageController() { } // int totalRows; // 总行数 int pageSize = 1 ; // int currentPage = 10 ; // 当前页 int totalPages; int nextPage; int previousPage; int pageStartRow; // 请求记录开始位置 int pageEndRow; // boolean hasNext = true ; // boolean hasPrevious = true ; // boolean hasTop = true ; // boolean hasLast = true ; // // /** * getPageArrayList * 实例化后,真接执行此函数,正确传递参数,即可完成所有设置,与页面控制 * 返回根据分面计算得到的ArrayList * @param al ArrayList * @param cp int * @return ArrayList */ public ArrayList getPageArrayList(ArrayList al, int cp) { setPageController(al, cp); ArrayList alt = new ArrayList(); if (pageStartRow > 0 ) { for ( int i = pageStartRow; i <= pageEndRow; i ++ ) { System.out.println( " al.get " + (i - 1 )); alt.add(al.get(i - 1 )); } } else { return null ; } return alt; } /** * getPageArrayList * 多一条页面设置参数 * 实例化后,真接执行此函数,正确传递参数,即可完成所有设置,与页面控制, * 返回根据分面计算得到的ArrayList * @param al ArrayList * @param cp int * @param pageSize int * @return ArrayList */ public ArrayList getPageArrayList(ArrayList al, int cp, int pageSize) { setPageController(al, cp, pageSize); ArrayList alt = new ArrayList(); if (pageStartRow > 0 ) { for ( int i = pageStartRow; i <= pageEndRow; i ++ ) { System.out.println( " al.get " + (i - 1 )); alt.add(al.get(i - 1 )); } } else { return null ; } return alt; } /以下公有获取页面状态的函数 public int getCurrentPage() { return currentPage; } public boolean getHasNext() { return hasNext; } public boolean getHasPrevious() { return hasPrevious; } public boolean getHasTop() { return hasTop; } public boolean getHasLast() { return hasLast; } public int getNextPage() { return nextPage; } public int getPreviousPage() { return previousPage; } public int getTotalPages() { return totalPages; } public String getD() { String description = " Total: " + totalRows + " items " + totalPages + " pages,Current page: " + this .currentPage + " Previous " + this .hasPrevious + " Next: " + this .hasNext + " start row: " + this .pageStartRow + " end row: " + this .pageEndRow; return description; } /以下私用工具函数 /** * setPageController * 设置本类的所有参数 * @param al ArrayList * @param cp int */ private void setPageController(ArrayList al, int cp) { // 以下几条程序顺序不可改变 setTotal_Rows_Pages(al.size()); // 设置记录总数,总页数 setCurrentPage(cp); // 设置当前页数 setPageStart_EndRow(); // 生成开始记录位置,结束记录位置 set_Next_Previous_Top_Last(); // 生成 下一页 上一页 第一页 最后一页 标志 } /** * setPageController * 多一条,页面大小的设置 * @param al ArrayList * @param cp int * @param pageSize int */ private void setPageController(ArrayList al, int cp, int pageSize) { this .pageSize = pageSize; setPageController(al, cp); } private void setCurrentPage( int i) { if (i < 1 ) { i = 1 ; } if (i > totalPages) { i = totalPages; } currentPage = i; nextPage = currentPage + 1 ; previousPage = currentPage - 1 ; } private void setTotal_Rows_Pages( int size) { totalRows = size; if (size % pageSize == 0 ) { totalPages = size / pageSize; } else { totalPages = size / pageSize + 1 ; } } private void setPageStart_EndRow() { if (currentPage * pageSize <= totalRows) { pageEndRow = currentPage * pageSize; pageStartRow = pageEndRow - pageSize + 1 ; } else { pageEndRow = totalRows; pageStartRow = currentPage * pageSize - pageSize + 1 ; } } private void set_Next_Previous_Top_Last() { if (nextPage > totalPages) { hasNext = false ; } if (previousPage < 1 ) { hasPrevious = false ; } if (currentPage == 1 ) { hasTop = false ; } if (currentPage == totalPages) { hasLast = false ; } }}
3 action 中部分代码 这个大家看一下大体的步骤就可以了,我写的这个为了大家看明白,以上的bean ,和 pagecontroller 的调用方法。具体到你的应用中时,可以灵活应用。
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DataSource dataSource = null ; Connection conn = null ; ActionErrors ae = new ActionErrors(); ResultSet rs = null ; Statement stmt = null ; ArrayList v_al = new ArrayList(); Object myObject = null ; int currentPage = 1 ; // / try { // 取得数据库连接 dataSource = getDataSource(request, " A " ); conn = dataSource.getConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); String sql = " select * from QGZX_xueshengshenqing " ; rs = stmt.executeQuery(sql); v_al = XueShengBean.getArrayList(rs); } catch (Exception e) { System.out.println( " 获得连接出错 " + e.toString()); return (mapping.findForward( " conniserror " )); } finally { try { rs.close(); stmt.close(); conn.close(); } catch (SQLException ex) { } } currentPage = ut.TypeConver.stringToInt(request.getParameter( " currentPage " )); System.out.println( " 当前页是 " + currentPage); db.PageController pageCon = new db.PageController(); v_al = pageCon.getPageArrayList(v_al, currentPage); HttpSession js = request.getSession(); Integer jsVaule = (Integer) js.getAttribute( " linkC " ); if (jsVaule == null ) { jsVaule = new Integer( 0 ); } else { jsVaule = new Integer(jsVaule.intValue() + 1 ); } js.setAttribute( " linkC " , jsVaule); request.setAttribute( " XueSheng " , v_al); request.setAttribute( " pc " , pageCon); System.out.println( " 设置完,开始转移到 show " ); return (mapping.findForward( " show " ));}
4 显示部分 ,大家一看就明白了吧,可以再美工一下。
< logic:present name = " pc " scope = " request " > 共有${pc.totalPages}页 | < logic:equal name = " pc " property = " hasTop " value = " true " > < html:link page = " /main.do " paramId = " currentPage " property = " 1 " > 首页 </ html:link > </ logic:equal > < logic:notEqual name = " pc " property = " hasTop " value = " true " > 首页 </ logic:notEqual > | < logic:equal name = " pc " property = " hasPrevious " value = " true " > < html:link page = " /main.do " paramId = " currentPage " paramName = " pc " paramProperty = " previousPage " > 上一页 </ html:link > </ logic:equal > < logic:notEqual name = " pc " property = " hasPrevious " value = " true " > 上一页 </ logic:notEqual > 《《 < font color = " bule " > ${pc.currentPage} </ font > 》》 < logic:equal name = " pc " property = " hasNext " value = " true " > < html:link page = " /main.do " paramId = " currentPage " paramName = " pc " paramProperty = " nextPage " > 下一页 </ html:link > </ logic:equal > < logic:notEqual name = " pc " property = " hasNext " value = " true " > 下一页 </ logic:notEqual > | < logic:equal name = " pc " property = " hasLast " value = " true " > < html:link page = " /main.do " paramId = " currentPage " paramName = " pc " paramProperty = " totalPages " > 尾页 </ html:link > </ logic:equal > < logic:notEqual name = " pc " property = " hasLast " value = " true " > 尾页 </ logic:notEqual > </ logic:present >
