查看完整版本: JSP中常用到的分页显示程序(mdwolf 收集整理 )

bufegar 2007-4-6 14:13

JSP中常用到的分页显示程序(mdwolf 收集整理 )

JSP中常用到的分页显示程序(mdwolf 收集整理 )
分页程序(一):
    这里我们介绍的分页程序的核心内容,并不是全部代码的讲解,只要理解分页的原理,你就能写出更好的分页程序;
    范例图片如下:
    分页.jpg
[img]http://www.newwhy.com/images/tietu/20070406/cut.jpg[/img]
1,首先我们来看分页程序中最基本的常量的存取,我已经抽出来了:

[java]

        package org.mdwolf.utils.pagination;
        
        /**
         * <p>Title: 分页程序的基础类 </p>
         * <p>Description: </p>
         * <p>Copyright: Copyright (c) 2003</p>
         * <p>Company: </p>
         * @author mdwolf
         * @version 1.0
         */
        
        public class PaginationBase {
          private int curPage; //当前是第几页
          private int maxPage; //一共有多少页
          private int maxRowCount; //一共有多少行
          private int rowsPerPage = 10; //每页有多少行
          private int pageStartFlag; //取得当前页面的起始 位置 ;
          private int pageEndFlag; //取得当前页面的结束 位置;
        
          /**
           * <p>Description:设置 页面 最后一条记录的位置
           * </p>
           * @param curPage
           */
          public void setPageEndFlag(int curPage){
              if (curPage < this.maxPage && curPage > 0) {//当前不是最后页
                  this.pageEndFlag = curPage*this.getRowsPerPage();
              }
              else if (curPage == this.maxPage){
                  this.pageEndFlag = this.getMaxRowCount();
              }
          }
        
          /**
           * <p>Description: 取得页面 最后一条记录的位置
           * </p>
           * @return
           */
          public int getPageEndFlag(){
              return this.pageEndFlag;
          }
        
          /**
           * <p>Description:设置 每页有多少行
           * </p>
           * @param rowsPerPage
           */
          public void setRowsPerPage(int rowsPerPage){
              this.rowsPerPage = rowsPerPage;
          }
        
          /**
           * <p>Description:得到 每页有多少行
           * </p>
           * @return
           */
          public int getRowsPerPage(){
              return this.rowsPerPage;
          }
        
          /**
           * <p>Description:设置 一共有多少行</p>
           * @param maxRowCount
           */
          public void setMaxRowCount(int maxRowCount){
              this.maxRowCount = maxRowCount;
          }
        
          /**
           * <p>Description:得到 一共有多少行</p>
           * @return
           */
          public int getMaxRowCount() {
              return this.maxRowCount;
          }
        
          /**
           * <p>Description:设置 页面 第一条 记录位置</p>
           * @param curPage
           */
          public void setPageStartFlag(int curPage){
              if (curPage <= this.maxPage && curPage > 0) {//当前不是最后页
                  this.pageStartFlag = (curPage-1)*this.getRowsPerPage()+1;
              }
              else if (curPage == 1 ){
                  this.pageStartFlag = 1;
              }
          }
        
          /**
           * <p>Description:取得 页面 第一条记录 位置</p>
           * @return
           */
          public int getPageStartFlag(){
              return this.pageStartFlag;
          }
        
        
          /**
           * <p>Description:设置 当前是第几页</p>
           * @param curPage
           */
          public void setCurPage(int curPage){
              this.curPage = curPage;
          }
        
          /**
           * <p>Description:返回 当前是第几页</p>
           * @return
           */
          public int getCurPage() {
              return this.curPage;
          }
        
          /**
           *<p>Description:根据总行数计算总页数</p>
           */
          public void setMaxPage() {
              if(this.getMaxRowCount() % this.getRowsPerPage()==0){
                  this.maxPage = this.getMaxRowCount()/this.getRowsPerPage();
              }else{
                  this.maxPage = this.getMaxRowCount()/this.getRowsPerPage() + 1;
              }
          }
        
          /**
           * <p>Description:取得 总页数</p>
           * @return
           */
          public int getMaxPage() {
              return this.maxPage;
          }
        
          public PaginationBase() {
          }
          public static void main(String[] args) {
            PaginationBase paginationBase1 = new PaginationBase();
          }
        
        }   [/java]
        
        上述类是分页程序中最基本的常量存取类了,那我们该如何存取它呢?
        看接下来的代码:[java]
            package org.mdwolf.utils.pagination;
            
            import java.util.Collection;
            import java.util.ArrayList;
            import java.sql.ResultSet;
            /**
             * <p>Title: 用jsp进行数据分页显示,适合于小数据量</p>
             * <p>Description:  一次取出全部数据</p>
             * <p>Copyright: </p>
             * <p>Company: </p>
             * @author mdwolf
             * @version 1.0
             */
            public class PaginationOne extends PaginationBase{
            
                /**
                 *<p>Description:设置 取指定 页面 记录 动作</p>
                 * @param rs
                 * @param curPage
                 */
                public PaginationOne(ResultSet rs,int curPage) {
                    try {
                        if (rs.last()) {//如果有记录 true
                            this.setMaxRowCount(rs.getRow());//得到 所有记录数
                            this.setMaxPage();//计算总页数
                            this.setCurPage(curPage);//设置 当前是第几页
                            this.setPageEndFlag(curPage);//设置 当前是第几页最后一条记录的位置
                            this.setPageStartFlag(curPage);//设置 当前是第几页第1条记录位置
                            rs.beforeFirst();// 返回 准备状态 ,开始 取记录操作
                        }else {
                            this.setPageStartFlag(1);
                            System.out.println("没有找到相应记录!");
                        }
                    }
                    catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            
                /**
                 * 设置 取指定 页面 记录 动作,增加了 设置每页显示的行数
                 * @param rs
                 * @param curPage 当前页数
                 * @param rowsPerPage 设置每页显示的行数
                 */
                public PaginationOne(ResultSet rs,int curPage,int rowsPerPage){
                    try {
                        if (rs.last()) {//如果有记录 true
                            if (rowsPerPage > 0) this.setRowsPerPage(rowsPerPage);//设置行数
                            this.setMaxRowCount(rs.getRow());//得到 所有记录数
                            this.setMaxPage();//计算总页数
                            this.setCurPage(curPage);//设置 当前是第几页
                            this.setPageEndFlag(curPage);//设置 当前是第几页最后一条记录的位置
                            this.setPageStartFlag(curPage);//设置 当前是第几页第1条记录位置
                            rs.beforeFirst();// 返回 准备状态 ,开始 取记录操作
                        }else {
                            System.out.println("没有找到相应记录!");
                        }
                    }
                    catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            
                /**
                 *空构建器
                 */
                public PaginationOne(){
                }
            
            }
            [/java]
            这里我们写的第1个分页程序PaginationOne 继承了PaginationBase类,它只有3个构件器,其中2个带参数;
            用来设置分页程序中的所用的参数;
            
            现在我们来具体讲解一下这两个带参数的构件器:
            
            public PaginationOne(ResultSet rs,int curPage)
            这里我们的第1个分页程序传入的是结果集,你需要在Connection 关闭之前传入才有效,
            curPage当前用户想要浏览的页码号;
            
            public PaginationOne(ResultSet rs,int curPage,int rowsPerPage)
            第2个带参数的构件器只比第1个多1个参数,就是rowsPerPage:每页我们要显示的行数,没有这个参数我们
            程序就会使用默认的参数来显示每页的行数10条;
            
    2.设置好分页程序中所必须的参数后,我们来看程序如何取得用户所需要的查看记录资料的,这里我们把记录放入
    容器中返还给客户端,然后在JSP层通过分页的JSP显示组件来显示记录:
   
        下面是查询的方法:[java]
        public class PageOneExample {
        
          private ConnectionMgr conMgr;
          private PreparedStatement pst;
          private Collection coll;
          private Connection conn;
          private Statement st;
          private ResultSet rs;
          private PaginationOne pgo = new PaginationOne();
          private PageOneExampleModel poModel;
        
          public PaginationOne getPaginationOne(){
            return this.pgo;
          }
          /**
           * <p>Description:实现 分类操作,使用默认的每页行数</p>
           * @param sql
           * @param paginationFlag 为用户指定的页码
           * @return
           */
          public Collection queryPageOne(int paginationFlag) throws AppException {
            try {
              conn = conMgr.getInstance().getConnection();
              coll = new ArrayList();
              String sql = " SELECT PASSWORD,CODE,NAME FROM MYEXAMPLE ORDER BY CODE ";
        
              st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
              rs = st.executeQuery(sql);
        
              this.pgo = new PaginationOne(rs, paginationFlag);
              if (rs.absolute(pgo.getPageStartFlag())) { //定位 指定页 的第一条记录
                do {
                  poModel = new PageOneExampleModel();
                  poModel.setPassword(rs.getString(1));
                  poModel.setCode(rs.getString(2));
                  poModel.setName(rs.getString(3));
                  coll.add(poModel);
        
                } while (rs.next() && rs.getRow() <= pgo.getPageEndFlag()); //到 最后行 操作 一次 退出
              } //end ifb
        
              return coll;
        
            } catch (Exception ex) {
              throw new AppException("分页程序取记录错误!");
            } finally {
        //      conMgr.closeAll(conn, pst, st, rs);
              conMgr.closeConn(conn);
            } //end trycf
          }
        
          /**
           * <p>Description:实现 分类操作,使用可以设置的每页行数</p>
           * @param sql
           * @param paginationFlag 为用户指定的页码
           * @return
           */
          public Collection queryPageOneFlag(int paginationFlag,int curPageNum) throws AppException {
            try {
              conn = conMgr.getInstance().getConnection();
              st = conn.createStatement();
              coll = new ArrayList();
        
              String sql =
                " SELECT PASSWORD,CODE,NAME FROM MYEXAMPLE ORDER BY CODE ";
        
              System.out.println("sql:"+sql);
        
              rs = st.executeQuery(sql);
        
        
              this.pgo = new PaginationOne(rs,paginationFlag,curPageNum);//传入指定 页码 并设置 类成员,设置 每页 总的行数
        
              if (rs.absolute(pgo.getPageStartFlag())) { //定位 指定页 的第一条记录
                do {
                  poModel = new PageOneExampleModel();
                  poModel.setPassword(rs.getString(1));
                  poModel.setCode(rs.getString(2));
                  poModel.setName(rs.getString(3));
                  coll.add(poModel);
        
                } while (rs.next() && rs.getRow() <= pgo.getPageEndFlag()); //到 最后行 操作 一次 退出
              } //end ifb
              return coll;
        
            } catch (Exception ex) {
              throw new AppException("分页程序取记录错误!");
            } finally {
              conMgr.closeAll(conn, pst, st, rs);
            } //end trycf
          }
        
        
          /**
           * 增加记录
           * @param paginationFlag
           * @param curPageNum
           * @return
           * @throws AppException
           */
          public String add() throws AppException {
            try {
              conn = conMgr.getInstance().getConnection();
              coll = new ArrayList();
        //      conMgr.beginTransaction(conn);
        
              String name ="00000";
              String password ="000000";
              String code = SecManager.instance().getUniteCode();
              System.out.println("****code:"+code);
              String sql =
                " INSERT INTO MYEXAMPLE (PASSWORD,CODE,NAME) VALUES (?,?,?) ";
        
              pst = conn.prepareStatement(sql);
              pst.setString(1,name);
              pst.setString(2,code);
              pst.setString(3,password);
              int a = pst.executeUpdate();
              String msg = "记录添加成功!";
        
              if (a ==0 ) return "没有记录被更新!";
        //      conMgr.endTransaction(conn);
              return msg;
        
            } catch (Exception ex) {
        //      conMgr.rollbackTransaction(conn);
              ex.printStackTrace();
              throw new AppException("添加数据出错!!");
            } finally {
              conMgr.closeAll(conn, pst, st, rs);
            } //end trycf
          }
        
        
          public PageOneExample() {
          }
          public static void main(String[] args) {
            PageOneExample pageOneExample1 = new PageOneExample();
          }
        
        }
        [/java]
        这里有2个查询的方法,1个是没有设定行数的查询方法,1个已经设定行数的查询方法;
        我们只介绍没有设定行数的方法,另一个方法读者一看就明白了,这里不多说:[java]
              this.pgo = new PaginationOne(rs, paginationFlag);
              if (rs.absolute(pgo.getPageStartFlag())) { //定位 指定页 的第一条记录
                do {
                  poModel = new PageOneExampleModel();
                  poModel.setPassword(rs.getString(1));
                  poModel.setCode(rs.getString(2));
                  poModel.setName(rs.getString(3));
                  coll.add(poModel);
        
                } while (rs.next() && rs.getRow() <= pgo.getPageEndFlag()); //到 最后行 操作 一次 退出
              } //end ifb[/java]
   
        取到结果以后,程序从用户指定要查看的页码paginationFlag,取出该页面的第1条记录和最后一条记录,放入
        容器返还给客户端;
        
    3.下面介绍如何显示数据:
        用到的显示组件:
        paginationCtl.jsp[java]
            每页<%=thePageOneExample.getPaginationOne().getRowsPerPage()%>行&nbsp;
            共<%=thePageOneExample.getPaginationOne().getMaxRowCount()%>行&nbsp;
            第<%=thePageOneExample.getPaginationOne().getCurPage()%>页&nbsp;
            共<%=thePageOneExample.getPaginationOne().getMaxPage()%>页
            <%if(thePageOneExample.getPaginationOne().getCurPage()==1){
            //    out.print(" 首页 上一页");
            %>
            首页 上一页
            <%
            }else{
            %>  
             <A HREF="javascript:gotoPage(1)">首页</A>
             <A HREF="javascript:gotoPage(<%=thePageOneExample.getPaginationOne().getCurPage()-1%>)">上一页</A>
            <%
                }
                if (thePageOneExample.getPaginationOne().getCurPage()==thePageOneExample.getPaginationOne().getMaxPage()){
            //        out.print("下一页 尾页");
            %>
            下一页 尾页
            <%
                }else{
            %>  
             <A HREF="javascript:gotoPage(<%=thePageOneExample.getPaginationOne().getCurPage()+1%>)">下一页</A>
             <A HREF="javascript:gotoPage(<%=thePageOneExample.getPaginationOne().getMaxPage()%>)">尾页</A>
            <%}%>
            转到第&nbsp;
            <SELECT class="input1" name="curPage" onchange="Jumping(this)">
            <%
            for(int i=1; i<=thePageOneExample.getPaginationOne().getMaxPage(); i++) {
                if (i== thePageOneExample.getPaginationOne().getCurPage()){
            %>
             <OPTION selected value=<%=i%>><%=i%></OPTION>
            <%}else{%>
             <OPTION value=<%=i%>><%=i%></OPTION>
            <%}}%>
            </SELECT>
             页    [/java]
            
            接下来是如何显示数据和运用显示组件的:
            [java]
            <%
              PageOneExampleModel poModel = null;
              PageOneExample thePageOneExample = new PageOneExample();
            
              int ii = 0;
              String msg = "";
              String curPage = Utils.doRequestTrim(request,"curPage");
              String operate = Utils.doRequestTrim(request,"operate");
              if (curPage.equals("")) curPage = "1";
              Collection coll = null;
            
              try {
                if (operate.equals("add")) {
                    msg = thePageOneExample.add();
                    coll = thePageOneExample.queryPageOne(Integer.parseInt(curPage));
                }
                else coll = thePageOneExample.queryPageOne(Integer.parseInt(curPage));
            
              }
              catch (Exception ex) {
                throw ex;
              }
            
              if (coll == null) coll = new ArrayList();
              Iterator it = coll.iterator();
            %>
            
            <script language="javascript" src="./javascript/jsfaq.js"></script>
            <link rel="stylesheet" href="./javascript/index.css" type="text/css">
            <script >
            function submitOperation(){//提交操作
                document.form1.submit();
            }
            
            function gotoPage(curPage){// 页面 链接 页码 提交动作
                document.form1.curPage.value=curPage;
                submitOperation();
            }
            
            function Jumping() {//下拉框 页码 提交动作
                submitOperation();
            }
            
            function addOn() {//下拉框 页码 提交动作
                document.form1.operate.value = "add";
                submitOperation();
            }
            </script >
            <form name="form1" method="post" action="">
            <input type="hidden" name="operate" value="">
              <table width="100%" border="0">
                <tr>
                  <td width="11%">&nbsp;</td>
                  <td width="80%"><div align="center"></div></td>
                  <td width="9%">&nbsp;</td>
                </tr>
                <tr>
                  <td>&nbsp;</td>
                  <td><table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
                      <tr>
                        <td bgcolor="#CCCCCC"><div align="center">分页程序</div></td>
                      </tr>
                      <tr>
                        <td bgcolor="#FFFFFF">&nbsp;说明: 取出全部记录,但是没有放入内存,必须每次都查询</td>
                      </tr>
                      <tr>
                        <td bgcolor="#FFFFFF">
            
              <table width="80%" border="1" align="center" cellspacing="1" bordercolordark="#ffffff">
                <tr>
                  <td align="right" colspan="7">
            
                  <%if (thePageOneExample.getPaginationOne().getMaxPage() != 1 && thePageOneExample.getPaginationOne().getMaxPage() != 0) {%>
                    <%@ include file="./pagination/paginationCtl.jsp"%>
                   <%}%>
            
                        </td>
                      </tr>
                      <tr bgcolor="#CCCCCC">
                        <td width="4%">&nbsp;</td>
                        <td width="7%"><div align="center">序列号</div></td>
                        <td width="19%"><div align="center">password</div></td>
                        <td width="17%"><div align="center">code</div></td>
                        <td width="20%"><div align="center">name</div></td>
                        <td width="18%"><div align="center">操作</div></td>
                      </tr>
            
                      <%
                          while (it.hasNext()) {
                              ii++;
                              poModel = (PageOneExampleModel)it.next();
                      %>
            
                      <tr>
                        <td bgcolor="#CCCCCC"><input type="checkbox" name="recordId" value="<%=poModel.getCode()%>"></td>
                        <td>&nbsp;<%=ii%></td>
                        <td>&nbsp;<%=poModel.getPassword()%></td>
                        <td>&nbsp;<%=poModel.getCode()%></td>
                        <td>&nbsp;<%=poModel.getName()%></td>
                        <td align="center">修改</td>
                      </tr>
                      <%}%>
                      <tr>
                        <td colspan="7"><div align="center">
                            <input class="input1" type="button" name="button2" value="增加" onclick="addOn();">
                            <input class="input1" type="submit" name="button1" value="查询" >
                            <input class="input1" type="submit" name="button3" value="查询" >
                            <input class="input1" type="submit" name="button4" value="查询" ><%=msg%>
                          </div></td>
                      </tr>
                    </table>
            
                        </td>
                      </tr>
                      <tr>
                        <td bgcolor="#FFFFFF">&nbsp;</td>
                      </tr>
                      <tr>
                        <td bgcolor="#FFFFFF">&nbsp;</td>
                      </tr>
                    </table></td>
                  <td>&nbsp;</td>
                </tr>
                <tr>
                  <td>&nbsp;</td>
                  <td><table width="60%" border="0" align="center">
                      <tr>
                        <td> <div align="center">
            
                            <input  name="fff"  type="button" class="input1"  onClick="javascript: location.href='index.html'" value="首页">
                            <input  class="input1" type="button" name="Submit3" value="刷新" onClick="reloadOn();">
                            <input  class="input1" type="button" name="Submit" value="后退" onClick="backOn();">
                            <input  class="input1" type="button" name="Submit4" value="关闭" onClick="closeOn();">
                          </div></td>
                      </tr>
                    </table></td>
                  <td>&nbsp;</td>
                </tr>
              </table>
            </form>            
            [/java]
            取得数据后,我们把分页参数放入显示组件页面:
[java]
                  <%if (thePageOneExample.getPaginationOne().getMaxPage() != 1 && thePageOneExample.getPaginationOne().getMaxPage() != 0) {%>
                    <%@ include file="./pagination/paginationCtl.jsp"%>
                   <%}%>
[/java]
            如果所取得的记录只有1页的话,这个显示组件的页面将不显示;
            至于上页下页首页等的跳转方法这里就不多说了,大伙一看就知道;
            好了,今天讲的分页程序就到这里,当然这个分页程序每次查看都要查寻数据库,太费资源,下次我们会针对
            MYSQL、ORACLE分别取部分数据来进行分页;有任何问题的朋友可以跟帖,欢迎大家来讨论,我的邮箱是[email]mdwolf@sina.com.cn[/email],再会!

7媛q 2008-10-22 18:44

音乐家刘冰《警察忠诚》专辑歌曲,大家支持一下!

下载地址:[url=http://www.hsooo.com/mp3/段钊-流星.mp3]http://www.hsooo.com/mp3/段钊-流星.mp3[/url]

视听专辑地址:[url=http://wwww.hsooo.com/]http://wwww.hsooo.com/[/url]

[align=center][img=430,384]http://wwww.hsooo.com/bbs/attachments/month_0810/20081022_32492076ae72c1f9f1bcbjcgiab6ovzl.jpg[/img][/align][align=left]音乐家刘冰《警察忠诚》[/align][align=left]
唱片名称:音乐家刘冰《警察忠诚》 [/align][align=left]制作人:许传龙[/align][align=left]版权代理:艺星时尚文化信息传播有限公司[/align][align=left]出版公司:天赋唱片 [/align][align=left]发行时间:2008年10月 [/align][align=left]推荐单曲:《流星》、《警察忠诚》、《相聚北京》、 [/align][align=left]这张专辑“由内地音乐家刘冰独立创作完成”,音乐制作许传龙,演唱队伍则汇聚了众多当[/align][align=left]今歌坛最具影响力的实力派唱将:王子辰、段钊、王云、张峻铭、王坤、姚莉、吴憾等歌手[/align][align=left]纷纷加盟,为这张专辑献声。唱片中收录了十首风格完全不同的原创歌曲。[/align][align=left]
专辑歌曲列表: [/align][align=left]
01、王子辰-东方姑娘[/align][align=left]02、段钊-流星[/align][align=left]03、王云 张峻铭-北京2008[/align][align=left]04、王坤-大河源头[/align][align=left]05、张峻铭-警察忠诚[/align][align=left]06、群星-希望[/align][align=left]07、张峻铭-相聚[/align][align=left]08、张峻铭-祖国统一[/align][align=left]09、张峻铭 姚莉-生日快乐[/align][align=left]10、刘冰-相聚北京[/align][align=left] [/align]
页: [1]
查看完整版本: JSP中常用到的分页显示程序(mdwolf 收集整理 )