6 基于Servlet 的分页

Posted 知行合一

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6 基于Servlet 的分页相关的知识,希望对你有一定的参考价值。

 

  实现上图的分页功能,每页显示3条数据,每页显示3页供用户访问,点击左右双箭头时,可以跳转至上一个或者下一个大页,如点击右双箭头显示如下:

  

 

  1 连接数据库的工具类

  1 package com.latiny.db;
  2 
  3 import java.io.*;
  4 import java.sql.*;
  5 import java.util.ArrayList;
  6 import java.util.Properties;
  7 
  8 /*
  9  *操作数据库的工具类
 10  */
 11 
 12 public class DBUtil {
 13 
 14     //定义需要的变量
 15     private static String driver =null;
 16     private static String url =null;
 17     private static String user=null;
 18     private static String password=null;
 19     
 20     private static Connection conn;
 21     //使用PreparedStatment可以防止sql注入
 22     private static PreparedStatement ps;
 23     private static ResultSet rs;
 24     private static CallableStatement cs;
 25     
 26     //读配置文件
 27     private static Properties pp=null;
 28     private static InputStream fis=null;
 29     
 30     //加载驱动,只需要执行一次
 31     static
 32     {
 33         try
 34         {
 35             pp = new Properties();
 36             
 37             //当我们使用java web的时候,读取文件要使用类加载器
 38             fis = DBUtil.class.getClassLoader().getResourceAsStream("dbinfo.properties");
 39             
 40             pp.load(fis);
 41             driver = pp.getProperty("DRIVER");
 42             url = pp.getProperty("URL");
 43             user = pp.getProperty("USER");
 44             password = pp.getProperty("PASSWORD");
 45             
 46             // 1 加载驱动
 47             Class.forName(driver);
 48             
 49         }
 50         catch(Exception e)
 51         {
 52             e.printStackTrace();
 53         }
 54         finally
 55         {
 56             try 
 57             {
 58                 fis.close();
 59             } catch (IOException e) {
 60                 // TODO Auto-generated catch block
 61                 e.printStackTrace();
 62             }
 63             fis = null;
 64         }
 65     }
 66     
 67     /*
 68      * 获取Connection连接
 69      */
 70     public static Connection getConn()
 71     {
 72         try 
 73         {
 74             // 2 获取数据库连接
 75             conn = DriverManager.getConnection(url, user, password);
 76         } 
 77         catch (SQLException e) 
 78         {
 79             // TODO Auto-generated catch block
 80             e.printStackTrace();
 81         }
 82         
 83         return conn;
 84     }
 85     
 86     /*
 87      * 直接返回rs结果,此方法不能关闭rs,因为后面调用它的类还会用到,如果关闭则不能正常使用
 88      */
 89     public static ResultSet queryResult(String sql, String[] parameters)
 90     {
 91         try 
 92         {
 93             conn = getConn();
 94             // 3 创建Statement对象
 95             ps = conn.prepareStatement(sql);
 96             // 4 给问号赋值,即给sql语句的条件参数赋值如果需要的话
 97             if(parameters!=null)
 98             {
 99                 for(int i=1; i<=parameters.length; i++)
100                 {
101                     ps.setString(i, parameters[i-1]);
102                 }
103             }
104             
105             // 5 执行sql获取返回结果
106             rs = ps.executeQuery();
107         } 
108         catch (SQLException e) 
109         {
110             // TODO Auto-generated catch block
111             e.printStackTrace();
112         }
113 
114         return rs;    
115     }
116     
117     /*
118      * 将rs结果封装成ArrayList,然后可以关闭rs,节省数据库访问资源
119      */
120     public static ArrayList queryResult2(String sql, String[] parameters)
121     {
122         ArrayList al = new ArrayList();
123         
124         try 
125         {
126             //2 获取数据库连接
127             conn = getConn();
128             //3 创建Statement对象
129             ps = conn.prepareStatement(sql);
130             
131             //4  给问号赋值,即给sql语句的条件参数赋值如果需要的话
132             if(parameters!=null)
133             {
134                 for(int i=1; i<=parameters.length; i++)
135                 {
136                     ps.setString(i, parameters[i-1]);
137                 }
138             }
139             
140             //5 执行sql语句获取返回结果
141             rs = ps.executeQuery();
142             
143             //获取rs的结构
144             ResultSetMetaData rsmd = rs.getMetaData();
145             //获取查询语句的列数
146             int column = rsmd.getColumnCount();
147             
148             while(rs.next())
149             {
150                 //对象数组,存储一行数据
151                 Object[] objs = new Object[column];
152                 for(int i=0; i<objs.length; i++)
153                 {
154                     objs[i] = rs.getObject(i+1);
155                 }
156                 al.add(objs);
157             }
158             
159         } 
160         catch (SQLException e) 
161         {
162             // TODO Auto-generated catch block
163             e.printStackTrace();
164         }
165         finally
166         {
167             //关闭资源
168             close(rs, ps, conn);
169         }
170 
171         return al;    
172     }
173 
174     //调用存储过程,带输入输出参数的
175     public static CallableStatement callProcedure(String sql, String[] inputPara, Integer[] outputPara)
176     {
177         
178         try 
179         {
180             conn = getConn();
181             cs = conn.prepareCall(sql);
182             for(int i=0; inputPara!=null && i<inputPara.length; i++)
183             {
184                 cs.setObject(i+1, inputPara[i]);
185             }
186             
187             //给output参数赋值
188             for(int j=0; outputPara!=null && j<outputPara.length; j++)
189             {
190                 cs.registerOutParameter(inputPara.length+1+j, outputPara[j]);
191             }
192             
193             cs.execute();
194             
195         } catch (SQLException e) {
196             // TODO Auto-generated catch block
197             e.printStackTrace();
198         }
199         finally
200         {
201             close(rs, ps, conn);
202         }
203         
204         return cs;
205         
206     }
207     
208     //update, insert, delete
209     public static Integer updateData(String sql, String[] parameters)
210     {
211         int result = 0;
212         try
213         {
214             conn = getConn();
215             ps = conn.prepareStatement(sql);
216             if(parameters!=null)
217             {
218                 for(int i=0; i<parameters.length; i++)
219                 {
220                     ps.setObject(i+1, parameters[i]);
221                 }
222             }
223             
224             //执行executeUpdate并且返回受影响的行数
225             result = ps.executeUpdate();
226             
227         }
228         catch(Exception e)
229         {
230             e.printStackTrace();
231         }
232         finally
233         {
234             close(rs, ps, conn);
235         }
236         
237         return result;
238     }
239     
240     //关闭对应的数据库连接资源
241     public static void close(ResultSet rs1, PreparedStatement ps1, Connection conn1)
242     {
243 
244         try 
245         {
246             if(rs1!=null)
247             {
248                 rs1.close();
249             }
250             if(ps1!=null)
251             {
252                 ps1.close();
253             }
254             if(conn1!=null)
255             {
256                 conn1.close();
257             }
258             
259         } catch (SQLException e) {
260             e.printStackTrace();
261         }
262         
263     }
264 }
View Code

 

  2 从数据库获取需要的数据用于计算与显示

 1 package com.latiny.dao;
 2 
 3 /*
 4  * 从数据库获取页面需要的数据:1 记录总数; 2 获取每页需要显示的数据
 5  */
 6 
 7 import java.sql.ResultSet;
 8 import java.util.ArrayList;
 9 import com.latiny.db.DBUtil;
10 import com.latiny.model.Users;
11 
12 public class UserDao {
13 
14     private ArrayList al;
15 
16     public ArrayList<Users> getUserByPage(int startIndex, int pageSize)
17     {
18         ArrayList<Users> array = new ArrayList<Users>();
19         //查询sql
20         String sql="select * from users order by user_id limit "+startIndex +","+pageSize;
21         ResultSet rs = DBUtil.queryResult(sql, null);
22         
23         ArrayList al2 = DBUtil.queryResult2(sql, null);
24         
25         //二次封装,将rs结果封装到array中
26         for(int i=0; i<al2.size(); i++)
27         {
28             Users user = new Users();
29             Object[] objs = (Object[])al2.get(i);
30             
31             //user.setUserId(Integer.parseInt(objs[0].toString()));
32             user.setUserId((Integer)objs[0]);
33             user.setUser_name((String)objs[1]);
34             user.setPasswd((String)objs[2]);
35             user.setEmail((String)objs[3]);
36             user.setGrade(Byte.parseByte(objs[4].toString()));
37             
38             //将user放入到array中
39             array.add(user);
40         }
41         return array;
42     }
43 
44     public int getTotalRows()
45     {
46         int rowCount=0;
47         
48         String sql="select count(1) from users";
49         al = DBUtil.queryResult2(sql, null);
50         
51         //注意需要将游标下移,之后才能获取到查询结果
52         try 
53         {
54             Object[] obj = (Object[])al.get(0);
55             rowCount = Integer.parseInt(obj[0].toString()); //获取数据库总的记录数
56             
57         } catch (Exception e) {
58             // TODO Auto-generated catch block
59             e.printStackTrace();
60         }
61         
62         return rowCount;
63     }
64 }
View Code

 

  3 通用分页类

  1 package com.latiny.bean;
  2 
  3 import java.util.List;
  4 
  5 public class PageBean<T> {
  6     
  7     //已知数据
  8     private int currentPage; //当前页
  9     private int pageSize;     //每页显示的数据条数
 10     private int totalRecord; //总的记录条数,查询数据库得到
 11     private int pageNum;      //当前页显示可访问的页数,如当前页面显示1,2,3,4,5页,则pageNum应设为5
 12     
 13     //根据已知数据计算
 14     private int totalPage;        //小页总的页数
 15     private int totalBigPage;   //大页的总页数
 16     
 17     //保存每页要显示的数据
 18     private List<T> list;
 19     
 20     //查询数据库的开始索引
 21     private int startIndex;
 22     
 23     //分页显示的页数,如当前页面显示1,2,3,4,5页,则start为1, end为5.
 24     private int start;
 25     private int end;
 26     
 27     int currentBigPage = 1; //当前所在大页序号
 28     int pageBigCount = 0;   //共有多少大页数
 29     
 30     public PageBean(int currentPage, int currentBigPage, int pageSize, int totalRecord, int pageNum)
 31     {
 32         this.currentPage = currentPage;
 33         this.currentBigPage = currentBigPage;
 34         this.pageSize = pageSize;
 35         this.totalRecord = totalRecord;
 36         
 37         //根据totalRecord 与 pageSize 计算总页数
 38         totalPage = (this.totalRecord-1)/this.pageSize+1;
 39         totalBigPage = (totalPage-1)/pageNum+1;
 40         
 41         startIndex = (currentPage-1)*pageSize;
 42         
 43         //根据小页数计算大页数(每页显示多少页可供用户选择跳转)
 44         pageBigCount = (totalPage-1)/pageNum+1;
 45         
 46         start = (currentBigPage-1)*pageNum+1;
 47         end = currentBigPage*pageNum<totalPage?currentBigPage*pageNum:totalPage;
 48     }
 49     
 50     public int getCurrentPage() {
 51         return currentPage;
 52     }
 53 
 54     public void setCurrentPage(int currentPage) {
 55         this.currentPage = currentPage;
 56     }
 57 
 58     public int getPageBigCount() {
 59         return pageBigCount;
 60     }
 61 
 62     public void setPageBigCount(int pageBigCount) {
 63         this.pageBigCount = pageBigCount;
 64     }
 65     
 66     public int getPageNum() {
 67         return pageNum;
 68     }
 69 
 70     public void setPageNum(int pageNum) {
 71         this.pageNum = pageNum;
 72     }
 73 
 74     public int getPageSize() {
 75         return pageSize;
 76     }
 77 
 78     public void setPageSize(int pageSize) {
 79         this.pageSize = pageSize;
 80     }
 81 
 82     public int getTotalRecord() {
 83         return totalRecord;
 84     }
 85 
 86     public void setTotalRecord(int totalRecord) {
 87         this.totalRecord = totalRecord;
 88     }
 89 
 90     public int getTotalPage() {
 91         return totalPage;
 92     }
 93 
 94     public void setTotalPage(int totalPage) {
 95         this.totalPage = totalPage;
 96     }
 97 
 98     public List<T> getList() {
 99         return list;
100     }
101 
102     public void setList(List<T> list) {
103         this.list = list;
104     }
105     
106     public int getStartIndex() {
107         return startIndex;
108     }
109 
110     public void setStartIndex(int startIndex) {
111         this.startIndex = startIndex;
以上是关于6 基于Servlet 的分页的主要内容,如果未能解决你的问题,请参考以下文章

使用基于 GraphQL 游标的分页避免代码重复

mysql——分页技术实现(基于layui框架)

基于jqgrid + ashx + nhibernate的分页

基于jQuery封装的分页组件(可自定义设置)

基于JPA的分页/排序实现

STU的分页操作