Javaweb分页功能简单实现
效果如下图
数据库中的数据
页面效果
首先,创建一个通用类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分页功能简单实现的更多相关文章
- php对文本文件进行分页功能简单实现
php对文本文件进行分页功能简单实现 <!DOCTYPE> <html> <head> <meta http-equiv="Content-type ...
- 简单封装分页功能pageView.js
分页是一个很简单,通用的功能.作为一个有经验的前端开发人员,有义务把代码中类似这样公共的基础性的东西抽象出来,一来是改善代码的整体质量,更重要的是为了将来做类似的功能或者类似的项目,能减少不必要的重复 ...
- jsp、js分页功能的简单总结
一.概述 首先,我们要明确为何需要分页技术,主要原因有以下: 1.分页可以提高客户体验度,适当地选择合适的数据条数,让页面显得更有条理,使得用户体验感良好,避免过多数据的冗余. 2.提高性能的需要.分 ...
- jQuery实现的简单分页功能的详细解析
分页功能在项目开发中不可或缺,老司机操作起来就和呼吸一样简单,新手恐怕就会吃力一些. 今天我回顾了一下具体的操作步骤,决定详细的分析一下每一步的实现目的及原理. 我们会创建一个简单的json文件来模拟 ...
- AngularJS实现简单的分页功能
本篇文章由:http://xinpure.com/angularjs-simple-paging-functionality/ 初学 AngularJS, 尝试着写一些小功能 代码逻辑写得略粗糙,仅仅 ...
- 简单的beego分页功能代码
一个简单的beego分页小插件(源代码在最下面): 支持条件查询 支持参数保留 支持自定义css样式 支持表/视图 支持参数自定义 默认为pno 支持定义生成链接的个数 使用方式: 1)action中 ...
- DataGridView使用BindingNavigator实现简单分页功能
接上一篇<DataGridView使用自定义控件实现简单分页功能>,本篇使用BindingNavigator来实现简单分页功能.其实也只是借用了一个BindingNavigator空壳, ...
- Python odoo中嵌入html简单的分页功能
在odoo中,通过iframe嵌入 html,页面数据则通过controllers获取,使用jinja2模板传值渲染 html页面分页内容,这里写了判断逻辑 <!-- 分页 -->< ...
- Django实现简单分页功能
使用django的第三方模块django-pure-pagination 安装模块: pip install django-pure-pagination 将'pure_pagination'添加到s ...
随机推荐
- 制作Docker镜像
编写DockerFile 这个DockerFile是一个制作镜像的配方,用于描述这些文件,环境,和命令.在Linux.macOS的窗口终端中,或者windows的命令提示符下,执行下面的步骤,切记如果 ...
- java多线程系列(三)---等待通知机制
等待通知机制 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解 ...
- Vue.js之深入浅出
介绍引言 Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上 ...
- jenkins-APP打包页面展示二维码
背景: 客户要求在APP打包页面展示二维码.虽然感觉这个功能很鸡肋,但是还是加上吧. 效果展示: 配置: 在上图中,106对应的内容是BuildName,我们可以通过build-name-setter ...
- easyui复选框树动态加载后台数据,实现自动选中数据库中数据。后台语言是.NET
最近公司做项目用到了easyui复选框树来实现加载不同类型产品.因为我刚刚毕业,现在也算是实习吧,所以一脸懵逼啊.在公司里的一个哥的帮助下 ,我写出来这个EasyUi复选框树了,虽然东西不难,但也是自 ...
- Scikit-Learn与决策树
Scikit-Learn(决策树)可以用于方法分类和回归. 一.分类 sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='b ...
- unrecognized font family "iconfont2"
起因:使用React Native开发App,需要使用自定义字体iconfont2.ttf,要在xCode中引入该字体 步骤:将字体文件拷贝到项目工程中,在Info.plist文件中添加Fonts p ...
- c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
来源:http://www.jb51.net/article/44231.htm 作者: 字体:[增加 减小] 类型:转载 时间:2013-12-08我要评论 vector是向量类型,它可以容纳许多类 ...
- Python网络数据采集4-POST提交与Cookie的处理
Python网络数据采集4-POST提交与Cookie的处理 POST提交 之前访问页面都是用的get提交方式,有些网页需要登录才能访问,此时需要提交参数.虽然在一些网页,get方式也能提交参.比如h ...
- nginx实现请求的负载均衡 + keepalived实现nginx的高可用
前言 使用集群是网站解决高并发.海量数据问题的常用手段.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求.这种 ...