java开发中通用分页类代码

java开发中通用分页类代码

在java中要分页我们必须要有数据库教程,所以我们先准备下数据库,其数据库脚步如下:

--以下是创建数据库和数据库表以及向数据库插入数据   use master 

Go 
if exists(select * from sysdatabases where name='pagination') 
drop database pagination 
Go 
create database pagination 
Go 
use pagination 
Go 
create table userInfo ( 
    [userID] int identity(1,1) primary key not null, 
    [userName] nvarchar(50) not null, 
    [userPassword] nvarchar(50) not null, 

Go 
insert userInfo  values('xuyesheng','8888') 
insert userInfo  values('jiaojiao','8888') 
insert userInfo  values('administrator','888') 
insert userInfo  values('xuyesheng1','123') 
insert userInfo  values('xuyesheng2','123') 
insert userInfo  values('xuyesheng3','123') 
insert userInfo  values('xuyesheng4','123') 
insert userInfo  values('xuyesheng5','123') 
insert userInfo  values('xuyesheng6','123') 
Go 
select * from userInfo

二: 通用分页的存储过程,如下:

 

    ---------------创建存储过程-------------- 
    Go 
    set ANSI_NULLS ON 
    set QUOTED_IDENTIFIER ON 
    go 
    ------------------------------------ 
    -- 
    --用途:用于需要分页显示的数据 
    --时间:2009年08月22日 
    --描述:通用的存储过程分页程序 
    -- 
    ------------------------------------- 
    create PROCEDURE [dbo].[GetData] 
    @tblName varchar(255), -- 表名 
    @fldName varchar(255), -- 字段名 
    @OrderfldName varchar(255), -- 排序字段名 
    @PageSize int = 10, -- 页尺寸 
    @PageIndex int = 1, -- 页码 
    @IsCount bit = 0, -- 返回记录总数, 非 0 值则返回 
    @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 
    @strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where) 
    AS 
    declare @strSQL varchar(6000) -- 主语句 
    declare @strTmp varchar(500) -- 临时变量 
    declare @strOrder varchar(400) -- 排序类型 
    if @OrderType != 0 
    begin 
      set @strTmp = '<(select min' 
      set @strOrder = ' order by [' + @OrderfldName +'] desc' 
    end 
    else 
    begin 
      set @strTmp = '>(select max' 
      set @strOrder = ' order by [' + @OrderfldName +'] asc' 
    end 
      set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from [' 
      + @tblName + '] where [' + @OrderfldName + ']' + @strTmp + '([' 
      + @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
      + @OrderfldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)' 
      + @strOrder 
      if @strWhere != '' 
      set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from [' 
      + @tblName + '] where [' + @OrderfldName + ']' + @strTmp + '([' 
      + @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
      + @OrderfldName + '] from [' + @tblName + '] where ' + @strWhere + ' ' 
      + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder 
      if @PageIndex = 1 
      begin 
       set @strTmp = '' 
       if @strWhere != '' 
          set @strTmp = ' where ' + @strWhere 
          set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldName + ' from [' 
          + @tblName + ']' + @strTmp + ' ' + @strOrder 
      end 
      if @IsCount != 0 
      begin 
           if @strWhere != '' 
            set @strSQL = 'select count(' + @OrderfldName + ') as Total from [' + @tblName + ']'+ ' where ' + @strWhere   
            else 
            set @strSQL = 'select count(' + @OrderfldName + ') as Total from [' + @tblName + ']'     
      end 
    exec (@strSQL) 
    --测试下 
    Go 

    ----参数说明exec [GetData] '表明','查找的列名* 表示查找所有信息','主键',页大小,第几页,非 
    --表示返回记录数,[排序类型,非则降序排列],条件 
    --得到分页的数据 
    exec [GetData] 'userInfo','*','userID',5,1,0,0,null 
    --得到总共的条数 
    exec [GetData] 'userInfo','*','userID',5,1,1,0,null 
    --根据条件查询 
    exec [GetData] 'userInfo','*','userID',5,1,0,0,' userID like ''%2%'' '

存储过程我们有了我们只要给一下几个参数就OK了

@tblName varchar  -- 表名
@fldName varchar  -- 字段名
@OrderfldName     -- 排序字段名
@PageSize int     -- 页尺寸
@PageIndex int    -- 页码
@IsCount bit      -- 返回记录总数, 非 0 值则返回
@OrderType bit    -- 设置排序类型, 非 0 值则降序
@strWhere varchar -- 查询条件 (注意: 不要加 where)

三 通用包

到这里我们先不用急,先将一下三个Java类(Pagination.java Call.java AutoSetData.java)封装一下,然后打成JAR包,以后我们直接导入JAR包即可

Pagination.java

存储过程我们有了我们只要给一下几个参数就OK了

@tblName varchar  -- 表名
@fldName varchar  -- 字段名
@OrderfldName     -- 排序字段名
@PageSize int     -- 页尺寸
@PageIndex int    -- 页码
@IsCount bit      -- 返回记录总数, 非 0 值则返回
@OrderType bit    -- 设置排序类型, 非 0 值则降序
@strWhere varchar -- 查询条件 (注意: 不要加 where)

到这里我们先不用急,先将一下三个Java类(Pagination.java Call.java AutoSetData.java)封装一下,然后打成JAR包,以后我们直接导入JAR包即可

Pagination.java

 

 

import java.util.List;  
public class Pagination {  
    // 总共的数据量  
    private int totle;  
    // 每页显示多少条  
    private int pageSize;  
    // 共有多少页  
    private int totlePage;  
    // 当前是第几页  
    private int index;  
    // 数据  
    private List data;  
    // 连接路径  
    private String path;  
    public void setTotle(int totle) {  
        this.totle = totle;  
    }  
    public void setPageSize(int pageSize) {  
        this.pageSize = pageSize;  
    }  
    public void setIndex(int index) {  
        this.index = index;  
    }  
    public void setPath(String path) {  
        this.path = path;  
    }  
    public int getTotle() {  
        return totle;  
    }  
    public int getPageSize() {  
        return pageSize;  
    }  
    public int getTotlePage() {  
        return (this.totle + this.pageSize - 1) / this.pageSize;  
    }  
    public int getIndex() {  
        return index;  
    }  
    public List getData() {  
        return data;  
    }  
    public void setData(List data) {  
        this.data = data;  
    }  
    public String getPageDisplay() {  
        StringBuffer displayInfo = new StringBuffer();  
        if (index == 0 || pageSize == 0) {  
            displayInfo.append("没有分页的信息!");  
        } else {  
            displayInfo.append("<div class='pager'>");  
            displayInfo.append("共" + totle + "条记录每页<span style="color:#FF0000" mce_style="color:#FF0000">" + pageSize  
                    + "</span>条");  
            displayInfo.append("第<span style="color:#FF0000" mce_style="color:#FF0000">" + index  
                    + "</span>页/共"  
                    + this.getTotlePage() + "页");  
            // 判断如果当前是第一页 则“首页”和“第一页”失去链接  
            if (index == 1) {  
                displayInfo.append("  首页 ");  
                displayInfo.append("上一页 ");  
            } else {  
                displayInfo.append("  <a href="" + path  
                        + "index=1" mce_href="" + path  
                        + "index=1">首页</a> ");  
                displayInfo.append("<a href="" + path + "index=" + (index - 1)  
                        + "" mce_href="" + path + "index=" + (index - 1)  
                        + "">上一页</a> ");  
            }  
            if (index >= this.getTotlePage()) {  
                displayInfo.append("下一页 ");  
                displayInfo.append("最后一页 ");  
            } else {  
                displayInfo.append("<a href="" + path + "index=" + (index + 1)  
                        + "" mce_href="" + path + "index=" + (index + 1)  
                        + "">下一页</a> ");  
                displayInfo.append("<a href="" + path + "index="  
                        + this.getTotlePage() + "" mce_href="" + path + "index="  
                        + this.getTotlePage() + "">最后一页</a> ");  
            }  
            displayInfo.append("</div>");  
        }  
        return displayInfo.toString();  
    }  
}    

 
Pagination.java文件源码我们有了,下面的是Call.java类的源码:

 

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.util.ArrayList;  
import java.util.Collection;  
import java.util.Iterator;  
import java.util.List;  
public class Call {  
    private AutoSetData auto = new AutoSetData();  
     
    public List execProcedure(String driver, String url, String userName,  
            String pwd, Object[] ob, Class c) {  
        try {  
            Class.forName(driver);  
            Connection conn = DriverManager.getConnection(url, userName, pwd);  
            String sql = "exec GetData ?,?,?,?,?,?,?,null";  
            List list = new ArrayList();  
            // Ltest是我测试用类,实际操作请注入相关对象,支持set,get,is,read,writer为前缀数据对,更多请继续添加。  
            Collection collection = auto.get(conn, c.newInstance().getClass(),  
                    sql, ob);  
            for (Iterator it = collection.iterator(); it.hasNext();) {  
                Object obj = c.newInstance();  
                list.add(it.next());  
            }  
            return list;  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
     
}  

 
AutoSetData.java 自动将数据封装到实体类中

 

import java.lang.reflect.Method;  
import java.lang.reflect.Modifier;  
import java.sql.CallableStatement;  
import java.sql.Connection;  
import java.sql.ResultSet;  
import java.sql.ResultSetMetaData;  
import java.sql.SQLException;  
import java.util.ArrayList;  
import java.util.Collection;  
public class AutoSetData {  
     
    private Object[] beanMatch(Class clazz, String beanProperty) {  
        Object[] result = new Object[2];  
        char beanPropertyChars[] = beanProperty.toCharArray();  
        beanPropertyChars[0] = Character.toUpperCase(beanPropertyChars[0]);  
        String s = new String(beanPropertyChars);  
        String names[] = { ("set" + s).intern(), ("get" + s).intern(),  
                ("is" + s).intern(), ("write" + s).intern(),  
                ("read" + s).intern() };  
        Method getter = null;  
        Method setter = null;  
        Method methods[] = clazz.getMethods();  
        for (int i = 0; i < methods.length; i++) {  
            Method method = methods[i];  
            // 只取公共字段  
            if (!Modifier.isPublic(method.getModifiers()))  
                continue;  
            String methodName = method.getName().intern();  
            for (int j = 0; j < names.length; j++) {  
                String name = names[j];  
                if (!name.equals(methodName))  
                    continue;  
                if (methodName.startsWith("set")  
                        || methodName.startsWith("read"))  
                    setter = method;  
                else  
                    getter = method;  
            }  
        }  
        result[0] = getter;  
        result[1] = setter;  
        return result;  
    }  
     
    private void beanRegister(Object object, String beanProperty, String value) {  
        Object[] beanObject = beanMatch(object.getClass(), beanProperty);  
        Object[] cache = new Object[1];  
        Method getter = (Method) beanObject[0];  
        Method setter = (Method) beanObject[1];  
        try {  
            // 通过get获得方法类型  
            String methodType = getter.getReturnType().getName();  
            if (methodType.equalsIgnoreCase("long")) {  
                cache[0] = new Long(value);  
                setter.invoke(object, cache);  
            } else if (methodType.equalsIgnoreCase("int")  
                    || methodType.equalsIgnoreCase("integer")) {  
                cache[0] = new Integer(value);  
                setter.invoke(object, cache);  
            } else if (methodType.equalsIgnoreCase("short")) {  
                cache[0] = new Short(value);  
                setter.invoke(object, cache);  
            } else if (methodType.equalsIgnoreCase("float")) {  
                cache[0] = new Float(value);  
                setter.invoke(object, cache);  
            } else if (methodType.equalsIgnoreCase("double")) {  
                cache[0] = new Double(value);  
                setter.invoke(object, cache);  
            } else if (methodType.equalsIgnoreCase("boolean")) {  
                cache[0] = new Boolean(value);  
                setter.invoke(object, cache);  
            } else if (methodType.equalsIgnoreCase("java.lang.String")) {  
                cache[0] = value;  
                setter.invoke(object, cache);  
            } else if (methodType.equalsIgnoreCase("java.io.InputStream")) {  
            } else if (methodType.equalsIgnoreCase("char")) {  
                cache[0] = (Character.valueOf(value.charAt(0)));  
                setter.invoke(object, cache);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
     
    public Collection get(final Connection connection, final Class clazz,  
             String sql,Object[] obj) {  
        // 创建PreparedStatement  
        CallableStatement  ptmt = null;  
        // 创建resultset  
        ResultSet rset = null;  
        // 创建collection  
        Collection collection = null;  
        try {  
            // 赋予实例  
            ptmt = connection.prepareCall(sql);  
            for (int i = 1; i <= obj.length; i++) {  
                ptmt.setObject(i,obj[i-1]);  
            }  
            rset = ptmt.executeQuery();  
            collection = get(rset, clazz);  
        } catch (SQLException e) {  
            System.err.println(e.getMessage());  
        } finally {  
            try {  
                // 关闭rs并释放资源  
                if (rset != null) {  
                    rset.close();  
                    rset = null;  
                }  
                // 关闭ps教程并释放资源  
                if (ptmt != null) {  
                    ptmt.close();  
                    ptmt = null;  
                }  
            } catch (SQLException e) {  
                System.err.println(e.getMessage());  
            }  
        }  
        return collection;  
    }  
    public Collection get(final ResultSet result, final Class clazz) {  
        // 创建collection  
        Collection collection = null;  
        try {  
            ResultSetMetaData rsmd = result.getMetaData();  
            // 获得数据列数  
            int cols = rsmd.getColumnCount();  
            // 创建等同数据列数的arraylist类型collection实例  
            collection = new ArrayList(cols);  
            // 遍历结果集  
            while (result.next()) {  
                // 创建对象  
                Object object = null;  
                try {  
                    // 从class获得对象实体  
                    object = clazz.newInstance();  
                } catch (Exception e) {  
                }  
                // 循环每条记录  
                for (int i = 1; i <= cols; i++) {  
                    beanRegister(object, rsmd.getColumnName(i), result  
                            .getString(i));  
                }  
                // 将数据插入collection  
                collection.add(object);  
            }  
        } catch (SQLException e) {  
            System.err.println(e.getMessage());  
        } finally {  
        }  
        return collection;  
    }  
}  

 
看这里我们引入了jstl.jar standard.jar sqljdbc.jar pagination.jar四个jar包 缺一不可奥。

下面我们创建一个实体类,代码如下:

public class UserInfo {  
    private int userID;  
    private String userName;  
    private String userPassword;  
 public int getUserID() {  
  return userID;  
 }  
 public void setUserID(int userID) {  
  this.userID = userID;  
 }  
 public String getUserName() {  
  return userName;  
 }  
 public void setUserName(String userName) {  
  this.userName = userName;  
 }  
 public String getUserPassword() {  
  return userPassword;  
 }  
 public void setUserPassword(String userPassword) {  
  this.userPassword = userPassword;  
 }  
     
}  

  
 

实体类我们创建完毕,现在我们创建servlet:

 

import java.io.IOException;  
import java.util.ArrayList;  
import java.util.List;  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import com.ant.util.Call;  
import com.ant.util.Pagination;  
import com.xuyesheng.entity.UserInfo;  
public class PageServlet extends HttpServlet {  
   
 public void doGet(HttpServletRequest request, HttpServletResponse response)  
   throws ServletException, IOException {  
  this.doPost(request, response);  
 }  
 public void doPost(HttpServletRequest request, HttpServletResponse response)  
   throws ServletException, IOException {  
  //取得jsp教程页面传递来的页数,参数名 index 不可更改  
  String index = request.getParameter("index");  
  int num = 0;  
  if (index == null) {  
   num = 1;  
  } else {  
   num = Integer.parseInt(index);  
  }  
  //创建封装数据类的对象 call  
  Call call = new Call();  
  //创建数组存储 存储过程的参数  
  Object obj[] = { "userInfo", "*", "userID", 5, num+"", 0+"", 0+"" };  
  //调用执行存储过程的方法  
  List li = call.execProcedure(  
    "com.microsoft.sqlserver.jdbc.SQLServerDriver",  
    "jdbc:sqlserver://localhost:1433;databaseName=pagination",  
    "sa", "as", obj, UserInfo.class);  
  //保存用户名  
  List<String> list = new ArrayList<String>();  
  //便利集合  
  for (int i = 0; i < li.size(); i++) {  
   UserInfo ui = (UserInfo) li.get(i);  
   list.add(ui.getUserName());  
   list.add(ui.getUserPassword());  
  }  
  //创建 分页对象  
  Pagination p = new Pagination();  
  //设置页数  
  p.setIndex(num);  
  //设置页大小  
  p.setPageSize(Integer.parseInt(obj[3].toString()));  
  //设置总共的条数  
  p.setTotle(call.getTotle());  
  //设置数据  
  p.setData(list);  
  //跳转的路径  
  p.setPath("page.do?");  
  request.setAttribute("page", p);  
  request.getRequestDispatcher("index.jsp").forward(request, response);  
 }  
}  
  

 

到这里我们就差一个页面了:

页面代码如下:

<%@ page language="java"  pageEncoding="GBK"%>  
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<html>  
  <head>  
    <title>java通用分页显示数据</title>  
  </head>  
  <body>  
 <table width="507" height="160" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#999900">  
         <tr>  
           <td  height="40" align="center" valign="middle" bgcolor="#FF9999"><h2>许业生用java实现通用分页功能</h2></td>  
         </tr>  
         <tr>  
           <td  height="35" align="center" valign="middle" bgcolor="#FF9999"><h3>用户名</h3></td>  
           
         </tr>  
          <c:forEach items="${requestScope.page.data}" var="li" >  
         <tr>  
           <td height="35" align="center" valign="middle" bgcolor="#CC99CC" >  
      <c:out value="${li}"/>  
    </td>  
         </tr>  
         </c:forEach>  
         <tr>  
           <td height="40"  align="center" valign="middle" ><c:out value="${requestScope.page.pageDisplay}" escapeXml="false"/></td>  
         </tr>  
       </table>  
  </body>  
</html>  

 
其中web.xml文件中的servlet的路径配置如下:

 

 

  <?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.4"  
 xmlns="http://java.sun.com/xml/ns/j2ee"  
 xmlns:xsi="http://www.zhuitiai.com /2001/XMLSchema-instance"  
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  <servlet>  
    <description>通用分页Servlet</description>  
    <servlet-name>PageServlet</servlet-name>  
    <servlet-class>com.xuyesheng.servlet.PageServlet</servlet-class>  
  </servlet>  
  <servlet-mapping>  
    <servlet-name>PageServlet</servlet-name>  
    <url-pattern>/page.do</url-pattern>  
  </servlet-mapping>  
  <welcome-file-list>  
    <welcome-file>index.jsp</welcome-file>  
  </welcome-file-list>  
</web-app>  

时间: 2024-11-02 08:40:03

java开发中通用分页类代码的相关文章

php通用分页类代码实例

php教程通用分页类代码 */ class dividepage  //分页类 {  private $page ; //当前页  private $total ; //总的记录数  private $pagesize;  //每页的记录数  private $prepage ;  //前一页  private $nextpage; //后一页  private $lastpage ; //最后一页  private $url;   //url  private $start; //当页显示记录

php通用分页类代码

   代码如下 复制代码 class dividepage{//分页类  private $total;//要显示的总记录数  private $url;//请求的url地址  private $displaypg;//每页显示的记录数,默认为每页显示10条记录  private $page;//当前页码  private $lastpg;//总页数,即最后一页的页码  private $prepg;//前一页  private $nextpg;//后一页  private $firstcoun

java分页类代码

java分页类代码 首先,最主要的一个类是 pageview ,其中封装了构造一个页面所需全部信息.如下: public class pageview<t> {     /** 分页数据 **/     private list<t> records;     /** 页码开始索引和结束索引 **/     private pageindex pageindex;     /** 总页数 **/     private long totalpage = 1;     /** 每页显

Java开发中异常处理的最佳实践

异常处理是Java 开发中的一个重要部分.它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建于语言自身之中.Java 编程语言也允许你创建新的异常,并通过使用 throw 和 throws关键字抛出它们.事实上,在Java编程中,Java的异常处理不单单是知道语法这么简单,它必须遵循标准的JDK库,和几个处理错误和异常的开源代码.这里我们将讨论一些关于异常处

Android开发中滑动分页功能实例详解

本文实例讲述了Android开发中滑动分页功能.分享给大家供大家参考,具体如下: android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: Java代码: package cn.anycall.ju; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import andro

转:java.util中的Date类

java.util中的Date类 www.linuxaid.com.cn 01-09-20 23:03 496p 处处--------------------------------------------------------------------------------     在JSP中,我们经常要处理有关日期和时间的信息,这时候你可以使用java.util中的Date类,在编写Java源程序时,情况很明显,你必须通过"import java.util.*"引入java.ut

Java开发中的23种设计模式详解(转)

Java开发中的23种设计模式详解(转) 设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合

java开发中基于JDBC连接数据库实例总结_java

本文实例讲述了java开发中基于JDBC连接数据库的方法.分享给大家供大家参考,具体如下: 创建一个以JDBC连接数据库的程序,包含7个步骤:   1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ;

Java开发中方法调用出现 Java.Lang.NoSuchMethod 错误如何解决

Java开发中调用webservice,方法调用报了 Java.Lang.NoSucheMethod..........,印象中记得是jar包冲突,maven项目,一看,这一堆jar包...用eclipse的pom可视化界面,Dependency Hierarchy 看到了不少包冲突,先从webservice 依赖的jar开始,顺着这一思路,一顿排除,没管用. 网上搜了几篇文章,梳理了下解决问题的思路: 1.你调的类里缺少该方法,可能是由于jar包的版本不对 2.项目依赖的jar包,A包和B包有