• 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;
    112     }
    113     
    114     public int getStart() {
    115         return start;
    116     }
    117 
    118     public void setStart(int start) {
    119         this.start = start;
    120     }
    121 
    122     public void setEnd(int end) {
    123         this.end = end;
    124     }
    125     
    126     public int getEnd() {
    127         return end;
    128     }
    129     
    130     public int getTotalBigPage() {
    131         return totalBigPage;
    132     }
    133 
    134     public void setTotalBigPage(int totalBigPage) {
    135         this.totalBigPage = totalBigPage;
    136     }
    137     
    138     public int getCurrentBigPage()
    139     {
    140         return currentBigPage;
    141     }
    142     
    143 
    144 }
    View Code

      4 封装数据对象类

     1 package com.latiny.model;
     2 
     3 public class Users {
     4     
     5     private int userId;
     6     private String userName;
     7     private String passwd;
     8     private String email;
     9     private byte grade;
    10     
    11     public Users()
    12     {
    13         
    14     }
    15     
    16     public Users(int userId, String userName, String passwd, String email, byte grade)
    17     {
    18         this.userId = userId;
    19         this.userName = userName;
    20         this.passwd = passwd;
    21         this.email = email;
    22         this.grade = grade;
    23     }
    24     
    25     public int getUserId() {
    26         return userId;
    27     }
    28     public void setUserId(int userId) {
    29         this.userId = userId;
    30     }
    31     
    32     public String getUser_name() {
    33         return userName;
    34     }
    35     public void setUser_name(String user_name) {
    36         this.userName = user_name;
    37     }
    38     public String getPasswd() {
    39         return passwd;
    40     }
    41     public void setPasswd(String passwd) {
    42         this.passwd = passwd;
    43     }
    44     public String getEmail() {
    45         return email;
    46     }
    47     public void setEmail(String email) {
    48         this.email = email;
    49     }
    50     public byte getGrade() {
    51         return grade;
    52     }
    53     public void setGrade(byte grade) {
    54         this.grade = grade;
    55     }
    56     
    57 }
    View Code

    5 Serivce层 结合dao 层与Page工具类

     1 package com.latiny.service;
     2 
     3 import java.util.List;
     4 
     5 import com.latiny.dao.UserDao;
     6 import com.latiny.model.Page;
     7 import com.latiny.model.Users;
     8 
     9 public class UserService {
    10 
    11     UserDao userDao = new UserDao();
    12     
    13     public Page pageUsers(int currentPage, int pageBigCurrent, int pageSize, int pageNum){
    14         
    15         int totalRows = userDao.getTotalRows();
    16         //根据页面传递的参数初始化page对象
    17         Page<Users> page = new Page<Users>(currentPage, pageBigCurrent, pageSize, totalRows, pageNum);
    18         //将要显示的数据赋值给Page 的list属性
    19         List<Users> users = userDao.getUserByPage(page.getStartIndex(), pageSize);
    20         page.setList(users);
    21         
    22         return page;
    23     }
    24 }
    View Code

      6 Servlet 显示分页结果

      1 package com.latiny.view;
      2 
      3 import java.io.IOException;
      4 import java.io.PrintWriter;
      5 import java.sql.Connection;
      6 import java.sql.DriverManager;
      7 import java.sql.PreparedStatement;
      8 import java.sql.ResultSet;
      9 import java.util.ArrayList;
     10 import java.util.List;
     11 
     12 import javax.servlet.ServletException;
     13 import javax.servlet.http.HttpServlet;
     14 import javax.servlet.http.HttpServletRequest;
     15 import javax.servlet.http.HttpServletResponse;
     16 
     17 import com.latiny.model.Page;
     18 import com.latiny.model.Users;
     19 import com.latiny.service.UserService;
     20 
     21 public class ManagerUser2 extends HttpServlet {
     22 
     23     public void doGet(HttpServletRequest request, HttpServletResponse response)
     24             throws ServletException, IOException {
     25 
     26         response.setContentType("text/html;charset=utf-8");
     27         PrintWriter out = response.getWriter();
     28         
     29         out.println("<script type='text/javascript' languge='javascript'>");
     30         out.println("function gotoPageCurrent(){" +
     31                 "var pageCurrent=document.getElementById('pageCurrent'); " +
     32                 //"window.alert('pageCurrent='+pageCurrent.value);" +
     33                 "window.open('/Page/ManagerUser2?pageCurrent='+pageCurrent.value+'&pageBigCurrent='+parseInt(((pageCurrent.value-1)/3+1)),'_self');}" +
     34                 "function confirmOper()" +
     35                 "{return window.confirm('确认删除该用户?'); }");
     36         out.println("</script>");
     37         
     38         //当前页
     39         int pageCurrent=1;
     40         //当前页每页显示数据条数
     41         int pageSize = 3;
     42         //当前页显示多少页可供用户点击访问
     43         int pageNum = 3;
     44         //当前大页
     45         int pageBigCurrent = 1;
     46         
     47         //获取用户点击的页数(用户想要跳转到的页数),用户点击之后传递过来
     48         String sPageCurrent = request.getParameter("pageCurrent");
     49         
     50         if(sPageCurrent!=null)
     51         {
     52             pageCurrent = Integer.parseInt(sPageCurrent);
     53         }
     54         
     55         //获取用户点击的大页数(下一个大页界面)
     56         String sPageCurrent2 = request.getParameter("pageBigCurrent");
     57         if(sPageCurrent2!=null)
     58         {
     59             pageBigCurrent = Integer.parseInt(sPageCurrent2);
     60         }
     61         
     62         System.out.println(pageBigCurrent);
     63         System.out.println(pageCurrent+" "+ pageBigCurrent+" ");
     64         UserService useSer = new UserService();
     65         Page page = useSer.pageUsers(pageCurrent, pageBigCurrent, pageSize, pageNum);
     66         
     67         //返回一个页面(html技术)
     68         out.println("<html><br/>");
     69         out.println("<image src='images/logo1.jpg' /><hr/>");
     70         out.println("<head><br/>"+
     71                     "<title>ManagerUser</title> <br/>"+
     72                     "</head> <br/>");
     73         out.println("<body> <br/>");
     74         out.println("<h1>用户管理 </h1> <a href='/Page/OperUser?&type=goAddUser'>添加用户</a>");
     75         
     76         //定义一个table来显示数据
     77         out.println("<table border=1 width=500px>");
     78         //表头
     79         out.println("<tr><th>id</th><th>用户名</th><th>email</th><th>等级</th><th>删除</th><th>修改</th></tr>");
     80         
     81         //5 根据结果作处理
     82         List<Users> array = page.getList();
     83         for(Users u: array)
     84         {
     85             out.println("<tr><td>"+u.getUserId()+"</td>" +
     86                     "<td>"+u.getUser_name()+"</td>" +
     87                     "<td>"+u.getEmail()+"</td>" +
     88                     "<td>"+u.getGrade()+"</td> " +
     89                     "<td><a onClick='return confirmOper();' href='/Page/OperUser?userId="+u.getUserId()+"&type=del"+" '>删除</a> </td>" +
     90                     "<td><a href='/Page/OperUser?type=gotoUpView&userId="+u.getUserId()+"'>修改</a> </td>" +
     91                     "</tr>");
     92         }    
     93         out.println("</table><br/>");
     94         
     95         //上一大页超链接
     96         if(pageBigCurrent>1)
     97         {
     98             out.println("<a href='/Page/ManagerUser2?pageBigCurrent=" +(pageBigCurrent-1)+"&pageCurrent="+((pageBigCurrent-2)*pageNum+1)+"' style='text-decoration:none'> << </a>"+"     ");
     99         }
    100 
    101         //显示分页选项
    102         for(int i=page.getStart(); i<=page.getEnd();i++)
    103         {
    104             //此处需要传递两个参数到下一个分页页面,一个是小当前小页数,一个是当前大页数
    105             out.println("<a href='/Page/ManagerUser2?pageCurrent="+i+"&pageBigCurrent="+pageBigCurrent+"'>"+i+"</a> ");
    106         }
    107         
    108         //下一大页超链接
    109         if(pageBigCurrent<page.getTotalBigPage())
    110         {
    111             //此处需要传递两个参数,一个是下一个大页数,一个是下一个大页数的开始小页数
    112             out.println("<a href='/Page/ManagerUser2?pageBigCurrent=" +(pageBigCurrent+1)+"&pageCurrent="+((pageBigCurrent)*pageNum+1)+"' style='text-decoration:none'>>></a>"+"     ");
    113         }
    114         
    115         //显示当前页/总页数
    116         out.println("当前页"+pageCurrent+"/总页数"+page.getTotalPage()+"<br/>");
    117         out.println("跳转:<input type='text' id='pageCurrent' maxlength='6' name='pageCurrent'/><input type='button' value='跳' onClick='gotoPageCurrent()' /> <br/>");
    118         
    119         out.println("pageCurrent="+pageCurrent+" & "+"pageCurrent2="+pageBigCurrent);
    120         out.println("<br/><br/>");
    121         out.println("<a href='/Page/MainFrame'>返回主页</a>");
    122         out.println("</body> <br/>");
    123         out.println("</html>");    
    124     
    125     }
    126 
    127     public void doPost(HttpServletRequest request, HttpServletResponse response)
    128             throws ServletException, IOException {
    129 
    130         this.doGet(request, response);
    131     }
    132 
    133 }
    View Code
  • 相关阅读:
    PHP正则表达式
    PHP日期时间处理
    好文摘录
    Unix时间戳与C# DateTime时间类型互换
    dedecms表结构分析
    css默认值汇总
    jQuery offset,position,offsetParent,scrollLeft,scrollTop html控件定位 css position
    html中label宽度设置、非替换元素和替换元素
    css position, display, float 内联元素、块级元素
    CSS技巧(一):清除浮动
  • 原文地址:https://www.cnblogs.com/Latiny/p/8436288.html
Copyright © 2020-2023  润新知