效果如下图

数据库中的数据                                                                                                  

                        页面效果

  首先,创建一个通用类Page,代码及注释如下

  

 import java.util.List;

 //分页类
 public class Page<T> {
     private List<T> pageList;// 存储当前页面的数据,查询数据库
     // private int totalPNum;//页面总数,计算得到
     // private int index; //表示当前索引值,计算得到
     private int pageIndex;// 当前页面位置 由服务器接收
     private int totalRecord;// 记录的总条数,查询数据库
     private int pageSize;// 当前页面要显示数据数量,服务器接收
     private int pageShowNum;// 要显示的页面数量,由服务器接收
     private String path;// 页面请求的路径,请求路径最好不要使用硬编码,即将不要将路径在页面直接显示写出
     //private int begin;// 要显示的页面数量的起始页面,计算得到
     //private int end;// 要显示的页面数量的终止页面,计算得到

     // 得到页面总数
     public int getTotalPageNum() {
         if (totalRecord % pageSize == 0)
             return totalRecord / pageSize;
         else
             return (totalRecord / pageSize) + 1;
     }

     // 得到搜索的起始位置(不包含该位置)
     public int getIndex() {
         return (getPageIndex() - 1) * pageSize;
     }

     //得到起始分页
     public int getBegin() {
         // 以下判断实现页面中显示的可供选择的分页起始和结束的值,这里实现的是自动改变可供选择的分页的显示,如从显示1,2,3,4,5到2,3,4,5,6
         if (getTotalPageNum() < pageShowNum) {// 总分页数小于要显示的可供选择的分页数
             return 1;
         } else if (getPageIndex() <= (pageShowNum / 2 + 1)) {// 当前分页的值小于等于要显示的可供选择的分页数的一般
             return 1;
         } else if ((getPageIndex() + pageShowNum / 2) > getTotalPageNum()) {// 当可供选择的分页的最大值已经等于分页总数量
             return (getTotalPageNum() - pageShowNum + 1);
         } else {// 一般情况
             return (getPageIndex() - pageShowNum / 2);
         }
     }

     //得到终止分页
     public int getEnd() {
         // 以下判断实现页面中显示的可供选择的分页起始和结束的值,这里实现的是自动改变可供选择的分页的显示,如从显示1,2,3,4,5到2,3,4,5,6
         if (getTotalPageNum() < pageShowNum) {// 总分页数小于要显示的可供选择的分页数
             return getTotalPageNum();
         } else if (getPageIndex() <= (pageShowNum / 2 + 1)) {// 当前分页的值小于等于要显示的可供选择的分页数的一般
             return pageShowNum;
         } else if ((getPageIndex() + pageShowNum / 2) > getTotalPageNum()) {// 当可供选择的分页的最大值已经等于分页总数量
             return (getTotalPageNum());
         } else {// 一般情况
             return (getPageIndex() + pageShowNum / 2);
         }
     }

     public List<T> getPageList() {
         return pageList;
     }

     public void setPageList(List<T> pageList) {
         this.pageList = pageList;
     }

     public int getPageIndex() { // 防止首页点击上一页,防止末页点击下一页,也可以在页面判断,直接禁止点击
         if (pageIndex < 1)
             return 1;
         else if (pageIndex > getTotalPageNum())
             return getTotalPageNum();
         else
             return pageIndex;
     }

     public void setPageIndex(int pageIndex) {
         this.pageIndex = pageIndex;
     }

     public int getTotalRecord() {
         return totalRecord;
     }

     public void setTotalRecord(int totalRecord) {
         this.totalRecord = totalRecord;
     }

     public int getPageSize() {
         return pageSize;
     }

     public void setPageSize(int pageSize) {
         this.pageSize = pageSize;
     }

     public int getPageShowNum() {
         return pageShowNum;
     }

     public void setPageShowNum(int pageShowNum) {
         this.pageShowNum = pageShowNum;
     }

     public String getPath() {
         return path;
     }

     public void setPath(String path) {
         this.path = path;
     }
 }

  接着是service层和dao层实现

 //service层实现
 public static Page<User> selectPageList(int pageIndex, int pageSize, int pageShowNum) {//接收servlet传过来的参数
         Page<User> page = new Page<>();//new一个page对象
         page.setPageIndex(pageIndex);
         page.setPageSize(pageSize);
         page.setPageShowNum(pageShowNum);//将收到的参数复制给page对象的属性
         page.setTotalRecord(UserDao.getTotalRecord());//调用dao层,获取数据库中的数据总数
         page.setPageList(UserDao.selectPageList(page.getIndex(), page.getPageSize()));//获取当页的数据集合
         return page;
     }
 //dao层的实现
 //获取数据库中记录总数
 public static int getTotalRecord() {
         Connection conn = JDBCUtils.getConnection();//JDBCUtils是已经自己写好的连接数据库的工具类
         String sql = "select count(*) from user";
         ResultSet rs = null;
         PreparedStatement ps = null;
         int totalRecord = 0;
         try {
             ps = conn.prepareStatement(sql);
             rs = ps.executeQuery();
             if(rs.next())
                 totalRecord=rs.getInt(1);
             if (rs != null)
                 rs.close();
             if (ps != null)
                 ps.close();
             if (conn != null)
                 conn.close();
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } finally {
             return totalRecord;
         }
     }
 //获取当前页面的数据集合
 public static List<User> selectAllUsers() {
         Connection conn = JDBCUtils.getConnection();
         String sql = "select * from user";
         ResultSet rs = null;
         PreparedStatement ps = null;
         List<User> list = new ArrayList<>();
         try {
             ps = conn.prepareStatement(sql);
             rs = ps.executeQuery();
             while (rs.next()) {
                 User user = new User();
                 user.setId(rs.getInt(1));
                 user.setUsername(rs.getString(2));
                 user.setPassword(rs.getString(3));
                 user.setSchool(rs.getString(4));
                 user.setEmail(rs.getString(5));
                 list.add(user);
             }
             if (rs != null)
                 rs.close();
             if (ps != null)
                 ps.close();
             if (conn != null)
                 conn.close();
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } finally {
             return list;
         }
     }
 

接下来是servlet层和页面

 //servlet使用了反射机制
 //实现反射的基类
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;

 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;

 /**
  * Servlet implementation class BaseServlet
  * 通过反射的方式实现用户对servlet请求的不同的操作
  */
 @WebServlet("/BaseServlet")
 public class BaseServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;

     /**
      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
      */
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // TODO Auto-generated method stub
         //设置响应编码格式
         response.setContentType("text/html;charset=utf-8");
         //获取用户要进行的操作
         String oper=request.getParameter("oper");
         //获取当前类的对象
         Class<?> clas=this.getClass();
         //获取clas的方法
         try {
             //获取clas的方法
             Method method=clas.getDeclaredMethod(oper, HttpServletRequest.class,HttpServletResponse.class);
             //设置方法的访问权限
             method.setAccessible(true);
             //调用方法   invoke(调用对象,参数)
             method.invoke(this, request,response);
         } catch (NoSuchMethodException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (SecurityException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (IllegalAccessException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (IllegalArgumentException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (InvocationTargetException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }

     /**
      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
      */
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // TODO Auto-generated method stub
         //设置请求编码格式,get请求在web.xml中设置
         request.setCharacterEncoding("utf-8");
         doGet(request, response);
     }

 }

 //继承自己写的反射基类
 import java.io.IOException;
 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;

 import com.neuedu.bean.User;
 import com.neuedu.service.UserService;
 import com.neuedu.util.Page;

 /**
  * Servlet implementation class MyServlet
  */
 @WebServlet("/MyServlet")
 public class MyServlet extends BaseServlet {
     private static final long serialVersionUID = 1L;

     protected void select(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         Page<User> page=UserService.selectPageList(Integer.parseInt(request.getParameter("pageIndex")),3,5);//调用service层获取数据
                 //获取请求地址,避免硬编码
         String url = request.getRequestURI()+"?"+request.getQueryString();
         if(url.contains("&pageIndex"))
                         //截取地址,否则pageIndex参数会重复
             url = url.substring(0, url.indexOf("&pageIndex"));
         page.setPath(url);
         request.setAttribute("page", page);
         request.getRequestDispatcher("/WEB-INF/views/showUser.jsp").forward(request, response);//转发到页面
     }

 }
 <!--页面获取数据,使用了el表达式和jstl标签-->
 <div id="page_nav" align="center">
                 <a href="${page.path}&pageIndex=1">首页</a> <a
                     href="${page.path}&pageIndex=${page.pageIndex -1 }">上一页</a>
                 <c:forEach begin="${page.begin }" end="${page.end }" var="num">
                     <c:if test="${page.pageIndex == num }">
                         【${num}】<!--当前分页-->
                     </c:if>
                     <c:if test="${page.pageIndex != num }">
                         <a href="${page.path}<!--非当前分页-->&pageIndex=${num}">${num }</a>
                     </c:if>
                 </c:forEach>
                 <a href="${page.path}&pageIndex=${page.pageIndex +1}">下一页</a> <a
                     href="${page.path}&pageIndex=${page.totalPageNum}">末页</a>
                 共${page.totalPageNum }页,${page.totalRecord }条记录,到第<input name="pn"
                     id="pn_input" />页 去<input type="button" value="确定" id="btn_id" />

                 <script type="text/javascript">
                     $("#btn_id").click(function(){
                     var value= $("#pn_input").val();
                     window.location="${page.path}&pageIndex="+value;
                     });
                 </script>
             </div>

Javaweb分页功能简单实现的更多相关文章

  1. php对文本文件进行分页功能简单实现

    php对文本文件进行分页功能简单实现 <!DOCTYPE> <html> <head> <meta http-equiv="Content-type ...

  2. 简单封装分页功能pageView.js

    分页是一个很简单,通用的功能.作为一个有经验的前端开发人员,有义务把代码中类似这样公共的基础性的东西抽象出来,一来是改善代码的整体质量,更重要的是为了将来做类似的功能或者类似的项目,能减少不必要的重复 ...

  3. jsp、js分页功能的简单总结

    一.概述 首先,我们要明确为何需要分页技术,主要原因有以下: 1.分页可以提高客户体验度,适当地选择合适的数据条数,让页面显得更有条理,使得用户体验感良好,避免过多数据的冗余. 2.提高性能的需要.分 ...

  4. jQuery实现的简单分页功能的详细解析

    分页功能在项目开发中不可或缺,老司机操作起来就和呼吸一样简单,新手恐怕就会吃力一些. 今天我回顾了一下具体的操作步骤,决定详细的分析一下每一步的实现目的及原理. 我们会创建一个简单的json文件来模拟 ...

  5. AngularJS实现简单的分页功能

    本篇文章由:http://xinpure.com/angularjs-simple-paging-functionality/ 初学 AngularJS, 尝试着写一些小功能 代码逻辑写得略粗糙,仅仅 ...

  6. 简单的beego分页功能代码

    一个简单的beego分页小插件(源代码在最下面): 支持条件查询 支持参数保留 支持自定义css样式 支持表/视图 支持参数自定义 默认为pno 支持定义生成链接的个数 使用方式: 1)action中 ...

  7. DataGridView使用BindingNavigator实现简单分页功能

    接上一篇<DataGridView使用自定义控件实现简单分页功能>,本篇使用BindingNavigator来实现简单分页功能.其实也只是借用了一个BindingNavigator空壳, ...

  8. Python odoo中嵌入html简单的分页功能

    在odoo中,通过iframe嵌入 html,页面数据则通过controllers获取,使用jinja2模板传值渲染 html页面分页内容,这里写了判断逻辑 <!-- 分页 -->< ...

  9. Django实现简单分页功能

    使用django的第三方模块django-pure-pagination 安装模块: pip install django-pure-pagination 将'pure_pagination'添加到s ...

随机推荐

  1. nyoj_600:花儿朵朵(树状数组+坐标离散化)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=600 只附代码好了 #include<bits/stdc++.h> using name ...

  2. 【NOIP模拟】matrix(简化矩阵)

    题目背景 SOURCE:NOIP2016-RZZ-1 题目描述 给出两个 N×N 的矩阵 A.B,矩阵每行每列标号 0-N-1 .定义这两个矩阵的乘积 AB 为

  3. Spring mybatis源码篇章-SqlSessionFactoryBean

    前言:通过实例结合源码的方式解读,其中涉及到的文件来自于博主的Github毕设项目SchoolActivity_WxServer,引用的jar包为mybatis-spring-1.3.0.jar Sp ...

  4. 来一手 AOP 注解方式进行日志记录

    系统日志对于定位/排查问题的重要性不言而喻,相信许多开发和运维都深有体会. 通过日志追踪代码运行状况,模拟系统执行情况,并迅速定位代码/部署环境问题. 系统日志同样也是数据统计/建模的重要依据,通过分 ...

  5. 关于javascript在OJ系统上编程的注意事项

    ① 牛客网输入流: var line=readline().split(' '); ② 赛码网输入流: var line=read_line().split(' '); ③ 输出流: print(); ...

  6. ORACLE - 管理重做日志文件

    ORACLE重做日志文件用于在数据库崩溃等情况下用于恢复数据,默认情况下为三个文件redo01.log/redo02.log/redo03.log,文件组循环使用,在录入与更新操作比较多的应用中,日志 ...

  7. Python网络数据采集2-wikipedia

    Python网络数据采集2-wikipedia 随机链接跳转 获取维基百科的词条超链接,并随机跳转.可能侧边栏和低栏会有其他链接.这不是我们想要的,所以定位到正文.正文在id为bodyContent的 ...

  8. [补档][NOIP2015] 斗地主

    [NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...

  9. 《开发技巧》WEB APP开发调试技巧

    前言 随着html5和nodejs的兴起.web APP越来越火,一套代码可以多平台使用.减少了很大的开发成本.很多APP中也集成了很多的html5页面,增强很高的应用体验.所以移动端页面也事关重要! ...

  10. 带着SMART原则重新出发

    很久以来,对分布式系统都比较感兴趣,但工作中却接触不到,“虽不能至,心向往之”,于是打算自己学.分布式系统领域概念很多,错综复杂,一些理论也比较难以理解,要想学习的话还是得下一番功夫.于是在来两个月前 ...