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 ...
随机推荐
- css display:box 新属性
一.display:box; 在元素上设置该属性,可使其子代排列在同一水平上,类似display:inline-block;. 二.可在其子代设置如下属性 前提:使用如下属性,必须在父代设置displ ...
- JavaScript中的设计模式:状态模式
前几天写了一个贪吃蛇小游戏,正好用到了状态模式. 定义 当一个对象内部状态发生改变时候,会导致其行为的改变,这看起来像是改变了对象. 简单的例子 如果一个函数要更具某一个对象的状态来判断该对象应该执行 ...
- 【转载】接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点
来源: http://www.cnblogs.com/asxinyu/p/Basic_Matlab_Experience.html 接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些 ...
- Java并发编程(2):线程中断(含代码)
使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回.这 ...
- InnoDB关键特性之change buffer
一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主 ...
- ibatis 参数和结果的映射处理
SqlMapClient对象 这个对象是iBatis操作数据库的接口(执行CRUD等操作),它也可以执行事务管理等操作.这个类是我们使用iBATIS的最主要的类.它是线程安全的.通常,将它定义为单例. ...
- 【Django】学习资料
一.基础 http://www.ibm.com/developerworks/cn/linux/l-django/ 安装.数据库连接.url路由转发 http://djangobook.py3k.cn ...
- 微信小程序框架探究和解析
何为框架 你对微信小程序的技术框架了解多少? 对wepy 框架进行一系列的深入了解 微信小程序框架解析和探究 小程序组件化框架WePY 在性能调优上做出的探究 开发者培训班上海专场PPT分享:小程序框 ...
- WCF Cookie处理
wcf操作cookie看似很简单,如果不对Wcf研究一把还是很难的,基本上无从下手. 这里上一图 上面的结果,岂止是坑爹,简直就是坑爹!!! 废话不多说,直接上代码: cookie读取 var req ...
- javascript编程解决黑化的牛牛问题
问题描述 时间限制:1秒 空间限制:32768K 牛牛变得黑化了,想要摧毁掉地球.但他忘记了开启地球毁灭器的密码.牛牛手里有一个字符串S,牛牛还记得从S中去掉一个字符就恰好是正确的密码,请你帮牛牛求出 ...