java web 分页技术总结

最近再做一个简易BBS,其中要用到分页技术,以前做过一个小型网上书店系统,记得当时是用弄了一个接口:PagingInterface,其中有得到总记录数、得到总页数、和一些根据当前页到结束页的查询方法。  然后再一个UserDAO类、BookDAO类中继承Paging方法,实现相应的“一些根据当前页到结束页的查询方法”等,然后再一个PagingServlet类中调用这些方法。。。。具体的类代码这里也不贴了,这种方法复用性不高,结构性差,不推荐使用。这次做这个BBS,经过几次的调试,终于弄成功了。下面是分页的主类:

/**
 * 分页对象,进行一系列分页操作
 * 
 * @author weiyiorng
 * @version 1.0 12/03/20
 * */
public class SplitPage {
	// 声明一些常量
	final public static String FIRSTPAGE = "first";// 请求的是首页
	final public static String PREVIOUSPAGE = "previous";// 请求上一页
	final public static String NEXTPAGE = "next";// 请求下一页
	final public static String LASTPAGE = "last";// 请求最后一页

	// 声明一些变量
	private int pageRow = 3;// 每页显示记录数
	private int totalRow = 0;// 总的记录数,有数据库操作类DAO提供
	private int currentPage = 1;// 当前的页面
	private int firstPage = 1;// 首页位置
	private int totalPage = 1;// 总的页面数,默认为一页

	public int getPageRow() {
		return pageRow;
	}

	/**
	 * 重新设置每页显示的记录数
	 * 
	 * @param pageRow
	 *            新的每页显示记录数
	 */
	public void setPageRow(int pageRow) {
		if (pageRow == 0) {
			try {
				throw new Exception();// 如果pageRow被设置为零,应当抛出异常.
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		this.pageRow = pageRow;// 修改每页的记录数
		this.totalPage = this.totalRow / this.pageRow
				+ ((this.totalRow % this.pageRow == 0) ? 0 : 1);
	}

	public int getTotalRow() {
		return totalRow;
	}

	public void setTotalRow(int totalRow) {// 设置分页对象的总记录属性后,就应该根据每页面显示记录数,计算得到总的页面数
		this.totalRow = totalRow;
		this.totalPage = this.totalRow/this.pageRow+((this.totalRow%this.pageRow==0)?0:1);
		System.out.println("当前页"+this.currentPage);

	}

	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public int getFirstPage() {
		return firstPage;
	}

	public void setFirstPage(int firstPage) {
		this.firstPage = firstPage;
	}

	public int getTotalPage() {
		return totalPage;
	}
	//不应该提供方法设置总页面数,它是计算得到的 

	/**
	 * 根据请求的标示符参数重新计算要现实的页面
	 * 
	 * @param flag
	 *            请求转向的页面标示符
	 * @return int 返回新页
	 */
	public int toNewPage(String flag) {
		int newPage = this.currentPage;
		if (flag != null && !"".equals(flag)) {
			if (SplitPage.FIRSTPAGE.equals(flag)) {
				newPage = 1;
			} else if (SplitPage.LASTPAGE.equals(flag)) {
				newPage = this.totalPage;
			} else if (SplitPage.NEXTPAGE.equals(flag)) {
				newPage = this.currentPage
						+ ((this.currentPage == this.totalPage) ? 0 : 1);// 如果当前页面与总的页面数相等则不再向后(+1)
			} else if (SplitPage.PREVIOUSPAGE.equals(flag)) {
				newPage = this.currentPage
						- ((this.currentPage == this.firstPage) ? 0 : 1);// 如果当前页面与首页相等则不再向前(-1)
			} else {
				// 传入的是个数字字符串参数
				newPage = Integer.parseInt(flag.trim());
			}
		} else {// 请求的参数为空,则当前页码不变
			newPage = this.currentPage;
		}
		this.setCurrentPage(newPage);// 记得重新设置当期页面
		return newPage;
	}
}

为什么说这个类重要呢?因为你在想要分页的时候,所有的分页参数都可以在这里面设置,动态静态的都可以实现,复用性很高!

下面声明一个分页接口,设置具体的分页对象(比如你要分页的是用户列表还是帖子列表)等:

public interface PageInterface {
	/**
	 * 查询所有的记录,调用分页生成器类中的分页方法查询数据
	 * 
	 * @param splitPage
	 *            分页对象
	 * @return List<Object>
	 * */
	public List<UserInfoVo> findUserAll(SplitPage splitPage);//查询用户列表
	/**
	 * 查询所有的记录,调用分页生成器类中的分页方法查询数据
	 * 
	 * @param splitPage
           *            分页对象
	 * @return List<Object>
	 * */
	public List<ForumInfoVo> findForumAll(SplitPage splitPage);//查询帖子
	/**
	 * 提供总的记录数
	 * */

	public int getTotalRows();
	/**
	 * 查询所有的记录,调用分页生成器类中的分页方法查询数据
	 * 
	 * @param splitPage
	 *            分页对象
	 * @return List<Object>
	 * */
	public List<ReforumInfoVo> findReforumAll(SplitPage splitPage);
}


然后在各个DAO类(用户DAO、帖子DAO、RefoumDAO等)中实现此接口相应方法,注意在各个DAO类中应该有一个totalRow总记录数的获取和设置方法,得到指定记录数方法,简单起见,我这里是直接得到所有记录getAllRecord()(可以再分页显示时调用以设置分页类别,如查询某一个昵称的所有用户等)。

接下咱废话少说,直接上显示分页效果的代码:

forumList.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsf/core"%>
<%@page import="com.weiyi.bbs.dao.ForumInfoDAO"%>
<%@page import="com.weiyi.bbs.util.*"%>
<%@page import="com.weiyi.bbs.domain.*"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>帖子列表</title>

		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<script type="text/javascript" src="js/common.js" charset="utf-8"></script>
		<script type="text/javascript" charset="utf-8">
		function goPage(){
		   var v = document.getElementById("selectPage").value;
		   var u = document.getElementById("userId").value;
		   window.location.href="forumList.jsp?flag="+v+"&userId="+u;
		}
		</script>
	</head>
	<!--spage分页对象,保存分页的详细信息 ,存在Session中,每次查询或者是分页数据时只要设置此对象的当前页 -->
	<!-- dao帖子操作类,主要用来获取总记录数-->
	<jsp:useBean id="spage" class="com.weiyi.bbs.util.SplitPage"
		scope="session"></jsp:useBean>
	<jsp:useBean id="dao" class="com.weiyi.bbs.dao.ForumInfoDAO"
		scope="session"></jsp:useBean>
	<%
		String flag = request.getParameter("flag");
		int newPage = spage.toNewPage(flag.trim());
		dao.setTotalRows(dao.getAllRecord());
		int totalRows = dao.getTotalRows();
		spage.setTotalRow(totalRows);
	%>
	<body>
		<div id="wrap">
			<h3>
				查看帖子列表
			</h3>
			<input type="hidden" name="userId" id="userId" value="<%=request.getParameter("userId")%>"/>
			<a href="destroyservlet">退出</a>   
			<a
				href="forumcontroller?type=toNewForum&userId=<%=request.getParameter("userId")%>&power=user">发新帖</a>
			<table border="border">
				<thead>
					<tr>
						<th>
							ID
						</th>
						<th>
							标题
						</th>
						<th>
							发帖人
						</th>
						<th>
							发帖时间
						</th>
						<th>
							操作
						</th>
					</tr>
				</thead>
				<tbody>
					<%
						List<ForumInfoVo> list = dao.findForumAll(spage);
						for (ForumInfoVo forum : list) {
					%>
					<tr>
						<td><%=forum.getId()%></td>
						<td><%=forum.getTitle()%></td>
						<td><%=forum.getAuthorName()%></td>
						<td><%=forum.getCreateTime()%></td>
						<td>
							<a
								href="forumcontroller?type=look&power=user&userId=<%=request.getParameter("userId")%>&id=<%=forum.getId()%>">查看</a>  
						</td>
					</tr>
					<%
						}
					%>
				</tbody>
			</table>
			<div id="foot">
				<a href="forumList.jsp?flag=<%=SplitPage.FIRSTPAGE%>&userId=<%=request.getParameter("userId")%>">首页</a> 
				<a href="forumList.jsp?flag=<%=SplitPage.PREVIOUSPAGE%>&userId=<%=request.getParameter("userId")%>">上一页</a> 
				<a href="forumList.jsp?flag=<%=SplitPage.NEXTPAGE%>&userId=<%=request.getParameter("userId")%>">下一页</a> 
				<a href="forumList.jsp?flag=<%=SplitPage.LASTPAGE%>&userId=<%=request.getParameter("userId")%>">末页</a> 
				<select id="selectPage" name="selectPage" οnchange="goPage();">
					<%
						for (int i = 1; i <= spage.getTotalPage(); ++i) {
					%>
					<option value="<%=i%>"
						<%=(spage.getCurrentPage() == i) ? "selected='selected'"
						: ""%> ><%=i%></option>
						<%
							}
						%>
					
				</select>
				<label><%=spage.getCurrentPage()%>/<%=spage.getTotalPage()%>页
				</label>
			</div>
		</div>
	</body>
</html>


 

 运行效果:

有什么地方有不足之处,往各位同行多多指教哈!

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java Web 实现分页查询通常需要以下步骤: 1. 在数据库中查询总记录数。 2. 根据当前页码和每页显示的记录数计算出需要查询的记录的起始位置。 3. 在数据库中查询需要显示的记录。 4. 将查询结果封装成一个 JavaBean 或者 List 的形式,传递给前端页面。 5. 在前端页面上显示查询结果,并且生成分页导航栏。 以下是一个简单的分页查询实现的代码示例: ``` // 获取当前页码和每页显示的记录数 int currentPage = Integer.parseInt(request.getParameter("currentPage")); int pageSize = Integer.parseInt(request.getParameter("pageSize")); // 在数据库中查询总记录数 int totalCount = dao.getTotalCount(); // 计算需要查询的记录的起始位置 int start = (currentPage - 1) * pageSize; // 在数据库中查询需要显示的记录 List<User> userList = dao.getUserList(start, pageSize); // 将查询结果封装成一个 JavaBean 或者 List 的形式,传递给前端页面 request.setAttribute("userList", userList); // 在前端页面上显示查询结果,并且生成分页导航栏 int totalPage = (totalCount + pageSize - 1) / pageSize; String pageNav = PageUtils.getPageNav(currentPage, totalPage); request.setAttribute("pageNav", pageNav); ``` 其中,`dao` 是数据访问对象,`User` 是一个 JavaBean 类,`PageUtils` 是一个工具类,用来生成分页导航栏。在 `dao` 中,`getTotalCount` 方法用来获取总记录数,`getUserList` 方法用来获取需要显示的记录。在前端页面上,通过 `userList` 和 `pageNav` 来显示查询结果和分页导航栏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值