⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java分页大全.txt

📁 java 技术参考汇集超值大礼包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
        function doQuery(){ 
            form1.actionType.value="doQuery"; 
            form1.submit(); 
    } 
    </script> 
    <form name=form1 method=get> 
      <input type=hidden name=actionType> 
      性别: 
      <input type=text name=gender size=1 value="<%=request.getParameter("gender")%>"> 
      <input type=button value=" 查询 " onclick="doQuery()"> 
<% 
    RowSetPage empPage = (RowSetPage)request.getAttribute("empPage"); 
    if (empPage == null ) empPage = RowSetPage.EMPTY_PAGE; 
%> 
    <table  cellspacing="0" width="90%"> 
        <tr>  <td>ID</td> <td>代码</td> <td>用户名 </td> <td>姓名</td>  </tr> 
<% 
    javax.sql.RowSet empRS = (javax.sql.RowSet) empPage.getRowSet(); 
    if (empRS!=null) while (empRS.next() ) { 
%> 
        <tr>   
            <td><%= empRS.getString("EMP_ID")%></td>  
            <td><%= empRS.getString("EMP_CODE")%></td>   
            <td><%= empRS.getString("USER_NAME")%></td>  
            <td><%= empRS.getString("REAL_NAME")%></td>   
        </tr> 
<% 
    }// end while 
%> 
        <tr> 
<% 
    //显示总页数和当前页数(pageno)以及分页代码。 
    //此处doQuery为页面上提交查询动作的javascript函数名, pageno为标识当前页码的参数名 
%> 
            <td colspan=4><%= empPage .getHTML("doQuery", "pageno")%></td> 
        </tr> 
    </table> 
    </form> 

  效果如图:


  因为分页显示一般都会伴有查询条件和查询动作,页面应已经有校验查询条件和提交查询的javascript方法(如上面的doQuery),所以 RowSetPage.getHTML()生成的分页代码在用户选择新页码时直接回调前面的处理提交查询的javascript方法。注意在显示查询结果的时候上次的查询条件也需要保持,如<input type=text name=gender size= 1 value="<%=request.getParameter("gender")%>">。同时由于页码的参数名可以指定,因此也支持在同一页面中有多个分页区。
  另一种分页代码实现是生成每一页的URL,将查询参数和页码作为QueryString附在URL后面。这种方法的缺陷是在查询条件比较复杂时难以处理,并且需要指定处理查询动作的servlet,可能不适合某些定制的查询操作。
  如果对RowSetPage.getHTML()生成的默认分页代码不满意可以编写自己的分页处理代码,RowSetPage提供了很多getter方法用于获取相关信息(如当前页码、总页数、 总记录数和当前记录数等)。
  在实际应用中可以将分页查询和显示做成jsp taglib, 进一步简化JSP代码,屏蔽Java Code。

附:分页工具类的源代码, 有注释,应该很容易理解。

1.Page.java
2.RowSetPage.java(RowSetPage继承Page)
3.PagedStatement.java
4.PagedStatementOracleImpl.java(PagedStatementOracleImpl继承PagedStatement)



您可以任意使用这些源代码,但必须保留author evan_zhao@hotmail.com字样


/////////////////////////////////// 
// 
//  Page.java 
//  author: evan_zhao@hotmail.com 
// 
/////////////////////////////////// 

package page; 

import java.util.List; 
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Collections; 


/** 
 * Title: 分页对象<br> 
 * Description:  用于包含数据及分页信息的对象<br> 
 *                Page类实现了用于显示分页信息的基本方法,但未指定所含数据的类型, 
 *               可根据需要实现以特定方式组织数据的子类,<br> 
 *                如RowSetPage以RowSet 封装数据,ListPage以List封装数据<br> 
 * Copyright:    Copyright (c) 2002 <br> 
 * @author evan_zhao@hotmail.com <br> 
 * @version 1.0 
 */ 
public  class Page implements java.io.Serializable { 
    public static final Page EMPTY_PAGE = new Page(); 
    public static final int  DEFAULT_PAGE_SIZE = 20; 
    public static final  int MAX_PAGE_SIZE = 9999; 

    private int myPageSize = DEFAULT_PAGE_SIZE; 

    private int start; 
    private int avaCount,totalSize; 
    private Object data; 

    private int currentPageno; 
    private int totalPageCount; 

    /** 
     * 默认构造方法,只构造空页 
     */ 
    protected Page(){ 
        this.init(0,0,0,DEFAULT_PAGE_SIZE,new Object()); 
    } 

    /** 
     * 分页数据初始方法,由子类调用 
     * @param start 本页数据在数据库中的起始位置 
     * @param avaCount 本页包含的数据条数 
     * @param totalSize 数据库中总记录条数 
     * @param pageSize 本页容量 
     * @param data 本页包含的数据 
     */ 
    protected void init(int start, int avaCount, int totalSize, int pageSize, Object data){ 

        this.avaCount =avaCount; 
        this.myPageSize = pageSize; 

        this.start = start; 
        this.totalSize = totalSize; 

        this.data=data; 

        //System.out.println("avaCount:"+avaCount); 
        //System.out.println("totalSize:"+totalSize); 
        if (avaCount>totalSize) { 
            //throw new RuntimeException("记录条数大于总条数?!"); 
        } 

        this.currentPageno = (start -1)/pageSize +1; 
        this.totalPageCount = (totalSize + pageSize -1) / pageSize; 

        if (totalSize==0 && avaCount==0){ 
            this.currentPageno = 1; 
            this.totalPageCount = 1; 
        } 
        //System.out.println("Start Index to Page No: " + start + "-" + currentPageno); 
    } 

    public  Object getData(){ 
        return this.data; 
    } 

    /** 
     * 取本页数据容量(本页能包含的记录数) 
     * @return 本页能包含的记录数 
     */ 
    public int getPageSize(){ 
        return this.myPageSize; 
    } 

    /** 
     * 是否有下一页 
     * @return 是否有下一页 
     */ 
    public boolean hasNextPage() { 
      /* 
        if (avaCount==0 && totalSize==0){ 
            return false; 
        } 
        return (start + avaCount -1) < totalSize; 
       */ 
      return (this.getCurrentPageNo()<this.getTotalPageCount()); 
    } 

    /** 
     * 是否有上一页 
     * @return  是否有上一页 
     */ 
    public boolean hasPreviousPage() { 
      /* 
        return start > 1; 
       */ 
      return (this.getCurrentPageNo()>1); 
    } 

    /** 
     * 获取当前页第一条数据在数据库中的位置 
     * @return 
     */ 
    public int getStart(){ 
        return start; 
    } 

    /** 
     * 获取当前页最后一条数据在数据库中的位置 
     * @return 
     */ 
    public int getEnd(){ 
        int end = this.getStart() + this.getSize() -1; 
        if (end<0) { 
            end = 0; 
        } 
        return end; 
    } 

    /** 
     * 获取上一页第一条数据在数据库中的位置 
     * @return 记录对应的rownum 
     */ 
    public int getStartOfPreviousPage() { 
        return Math.max(start-myPageSize, 1); 
    } 


    /** 
     * 获取下一页第一条数据在数据库中的位置 
     * @return 记录对应的rownum 
     */ 
    public int getStartOfNextPage() { 
        return start + avaCount; 
    } 

    /** 
     * 获取任一页第一条数据在数据库中的位置,每页条数使用默认值 
     * @param pageNo 页号 
     * @return 记录对应的rownum 
     */ 
    public static int getStartOfAnyPage(int pageNo){ 
        return getStartOfAnyPage(pageNo, DEFAULT_PAGE_SIZE); 
    } 

    /** 
     * 获取任一页第一条数据在数据库中的位置 
     * @param pageNo 页号 
     * @param pageSize 每页包含的记录数 
     * @return 记录对应的rownum 
     */ 
    public static int getStartOfAnyPage(int pageNo, int pageSize){ 
        int startIndex = (pageNo-1) * pageSize + 1; 
        if ( startIndex < 1) startIndex = 1; 
        //System.out.println("Page No to Start Index: " + pageNo + "-" + startIndex); 
        return startIndex; 
    } 

    /** 
     * 取本页包含的记录数 
     * @return 本页包含的记录数 
     */ 
    public int getSize() { 
        return avaCount; 
    } 

    /** 
     * 取数据库中包含的总记录数 
     * @return 数据库中包含的总记录数 
     */ 
    public int getTotalSize() { 
        return this.totalSize; 
    } 

    /** 
     * 取当前页码 
     * @return 当前页码 
     */ 
    public int getCurrentPageNo(){ 
        return  this.currentPageno; 
    } 

    /** 
     * 取总页码 
     * @return 总页码 
     */ 
    public int getTotalPageCount(){ 
        return this.totalPageCount; 
    } 


    /** 
     * 
     * @param queryJSFunctionName 实现分页的JS脚本名字,页码变动时会自动回调该方法 
     * @param pageNoParamName 页码参数名称 
     * @return 
     */ 
    public String getHTML(String queryJSFunctionName, String pageNoParamName){ 
        if (getTotalPageCount()<1){ 
            return "<input type='hidden' name='"+pageNoParamName+"' value='1' >"; 
        } 
        if (queryJSFunctionName == null || queryJSFunctionName.trim().length()<1) { 
            queryJSFunctionName = "gotoPage"; 
        } 
        if (pageNoParamName == null || pageNoParamName.trim().length()<1){ 
            pageNoParamName = "pageno"; 
        } 

        String gotoPage = "_"+queryJSFunctionName; 

        StringBuffer html = new StringBuffer("\n"); 
        html.append("<script language=\"Javascript1.2\">\n") 
             .append("function ").append(gotoPage).append("(pageNo){  \n") 
             .append(  "   var curPage=1;  \n") 
             .append(  "   try{ curPage = document.all[\"") 
             .append(pageNoParamName).append("\"].value;  \n") 
             .append(  "        document.all[\"").append(pageNoParamName) 
             .append("\"].value = pageNo;  \n") 
             .append(  "        ").append(queryJSFunctionName).append("(pageNo); \n") 
             .append(  "        return true;  \n") 
             .append(  "   }catch(e){ \n") 
//             .append(  "      try{ \n") 
//             .append(  "           document.forms[0].submit();  \n") 
//             .append(  "      }catch(e){   \n") 
             .append(  "          alert('尚未定义查询方法:function ") 
             .append(queryJSFunctionName).append("()'); \n") 
             .append(  "          document.all[\"").append(pageNoParamName) 
             .append("\"].value = curPage;  \n") 
             .append(  "          return false;  \n") 
//             .append(  "      }  \n") 
             .append(  "   }  \n") 
             .append(  "}") 
             .append(  "</script>  \n") 
             .append(  ""); 
        html.append( "<table  border=0 cellspacing=0 cellpadding=0 align=center width=80%>  \n") 
             .append( "  <tr>  \n") 
             .append( "    <td align=left><br>  \n"); 
        html.append(  "       共" ).append( getTotalPageCount() ).append( "页") 
             .append(  "       [") .append(getStart()).append("..").append(getEnd()) 
             .append("/").append(this.getTotalSize()).append("]  \n") 
             .append( "    </td>  \n") 
             .append( "    <td align=right>  \n"); 
        if (hasPreviousPage()){ 
             html.append( "[<a href='javascript:").append(gotoPage) 
             .append("(") .append(getCurrentPageNo()-1)  
             .append( ")'>上一页</a>]   \n"); 
        } 
        html.append(  "       第") 
             .append(   "        <select name='") 
             .append(pageNoParamName).append("' onChange='javascript:") 
             .append(gotoPage).append("(this.value)'>\n"); 
        String selected = "selected"; 
        for(int i=1;i<=getTotalPageCount();i++){ 
            if( i == getCurrentPageNo() ) 
                 selected = "selected"; 
            else selected = ""; 
            html.append( "      <option value='").append(i).append("' ") 
              .append(selected).append(">").append(i).append("</option>  \n"); 
        } 
        if (getCurrentPageNo()>getTotalPageCount()){ 
            html.append( "      <option value='").append(getCurrentPageNo()) 
            .append("' selected>").append(getCurrentPageNo()) 
            .append("</option>  \n"); 
        } 
        html.append( "    </select>页  \n"); 
        if (hasNextPage()){ 
             html.append( "    [<a href='javascript:").append(gotoPage) 
               .append("(").append((getCurrentPageNo()+1))  
               .append( ")'>下一页</a>]   \n"); 
        } 
        html.append( "</td></tr></table>  \n"); 

        return html.toString(); 

    } 
} 




/////////////////////////////////// 
// 
//  RowSetPage.java 
//  author: evan_zhao@hotmail.com 
// 
/////////////////////////////////// 
package page; 

import javax.sql.RowSet; 


/** 
 * <p>Title: RowSetPage</p> 
 * <p>Description: 使用RowSet封装数据的分页对象</p> 
 * <p>Copyright: Copyright (c) 2003</p> 
 * @author evan_zhao@hotmail.com 
 * @version 1.0 
 */ 

public class RowSetPage extends Page { 
    private javax.sql.RowSet rs; 

    /** 
     *空页 
     */ 
    public static final RowSetPage EMPTY_PAGE = new RowSetPage(); 

    /** 
     *默认构造方法,创建空页 
     */ 
    public RowSetPage(){ 
      this(null, 0,0); 
    } 

    /** 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -