在JSP页面中,访问数据库并读取一个数据结果集时,如果记录太多,一方面会占用服务器较大的内存,造成服务器负荷过重,数据传输和显示速度也慢得难以忍受;另一方面,一个JSP页面的显示空间有限,不可能同时列出所有的记录,一次传输所有的数据到客户端也非常不合理。因此,当检索的数据很多时,通常需要分页显示数据,并要实现翻页。
分页技术的设计思路
在JSP开发中,实现分页的方法有很多种,每一种方法的优点和缺点如下:
1.在JSP页面中直接分页:这种方法将分页代码统一编写在JSP页面中,开发比较简单,但在页面比较多时,维护比较困难。
2.在Servlet中实现分页:这种方法采用JSP+Servlet进行开发,页面显示和分页逻辑相分离。
3.在JavaBean中实现分页:这种方法采用JSP+JavaBean进行开发,页面显示和分页逻辑相分离。
4.万能分页技术:针对任意的数据库表进行分页。
5.结合不同的数据库实现分页:根据不同的数据库提供的SQL语言,设计针对该种数据库的分页程序,上述4种分页方法都是基于ResultSet中的数据进行分页的,存在一定的性能和资源占用问题,结合具体的数据库,可以设计出良好的、占用资源少的分页程序。
-------
6.结合相关框架实现
上述1-5设计方案网上很容易找到对应的实现过程,这里就不赘述了。
现在,详细讲解应用struts+ibatis框架结合MySQL数据库的实现过程。。。
1.jsp页面
<%@page contentType="text/html;charset=utf-8"%>
<%@include file="common.jsp"%>
<%@ page import="java.sql.*,java.util.*"%>
<p id="whereami"></p>
<h1>
员工列表
</h1>
<table class="table">
<tr class="table_header">
<td valign="middle" align="left">
编号
</td>
<td valign="middle" align="left">
职位描述
</td>
<td valign="middle" align="left">
姓名
</td>
<td valign="middle" align="left">
入职时间
</td>
<td valign="middle" align="left">
部门编号
</td>
<td>
</td>
</tr>
<logic:iterate id="emp" name="empList" indexId="index">
<tr class="row${index%2+1}">
<td valign="middle" align="left">
<bean:write name="emp" property="id" />
</td>
<td valign="middle" align="left">
<bean:write name="emp" property="position" />
</td>
<td valign="middle" align="left">
<bean:write name="emp" property="name" />
</td>
<td valign="middle" align="left">
<bean:write name="emp" property="hireDate" format="yyyy年M月d日" />
</td>
<td valign="middle" align="left">
<bean:write name="emp" property="deptId" />
</td>
<td valign="middle" align="left">
<a href="operate.do?id=${emp.id}&option=delete">删除</a>
</td>
</tr>
</logic:iterate>
</table>
<%
response.setHeader("Pragam", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Expires", "0");
int intPageSize = 5;//每页5条
int currPageBegin;//起开记录索引
int intPageCount;//总页数
int intPage;//要显示的页的页号(从1号页开始)
String strPage;//用户请求页号
strPage = request.getParameter("page");
if (strPage == null)
intPage = 1;
else
intPage = Integer.parseInt(strPage);
if (intPage < 1)
intPage = 1;
String strPageSize = (String) request.getAttribute("intPageSize");
if (strPageSize == null)
intPageSize = 5;
else
intPageSize = Integer.parseInt(strPageSize);
if (intPageSize < 1)
intPageSize = 5;
String strPageCount = (String) request.getAttribute("totalPageNum");
intPageCount = Integer.parseInt(strPageCount);
%>
<table width="40%" border="0" cellpadding="0" cellspacing="0"
align="center">
<tr>
<td>
<a href="listEmp.do?page=1"%>首页</a>
</td>
<td>
<a href="listEmp.do?page=<%=(intPage > 1 ? intPage - 1 : 1)%>"%>上一页</a>
</td>
<td>
第<%=intPage%>页
</td>
<td>
共<%=intPageCount%>页
</td>
<td>
<a
href="listEmp.do?page=<%=(intPage < intPageCount ? intPage + 1 : intPageCount)%>"%>下一页</a>
</td>
<td>
<a href="listEmp.do?page=<%=intPageCount%>"%>尾页</a>
</td>
</tr>
</table>
<p>
<input type="button" class="button" value="新建"
onClick="location='operate.do?option=show'" />
</p>
2.action类文件
package action;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class ListEmpAction extends BaseAction {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//每页显示记录数
int pagesize = 5;
String page = request.getParameter("page");
if (page == null) {
page = "1";
}
//起始记录行数
int startPage = Integer.parseInt(page);
startPage = (startPage - 1) * pagesize;
Map map = new HashMap();
map.put("startPage", startPage);
map.put("pagesize", pagesize + "");
// 获取总记录数
String totalNum = empDAO.getAll();
// 获取页面显示记录列表
List list = empDAO.getEmpList(map);
// 每页显示记录数
int intPage = 1;
if (page != null) {
intPage = Integer.parseInt(page);
}
int totalPageNum = (totalNum + pagesize - 1) / pagesize;// 得到记录总数
request.setAttribute("totalPageNum", ("" + totalPageNum));
request.setAttribute("intPageSize", ("" + pagesize));
request.setAttribute("empList", list);
return new ActionForward("EmpListView");
}
}
3.xml文件
<select id="findEmpList" resultClass="Emp">
select id, name, position,
hire_date as hireDate, dept_id as
deptId from t_emp limit
$startPage$,$pagesize$
</select>
注:
select * from auth_user SELECT FOUND_ROWS() //返回查询记录的总数 select sql_calc_found_rows col_name from table_name limit 5,3; SELECT语句中加上修饰SQL_CALC_FOUND_ROWS 加上SQL_CALC_FOUND_ROWS之后,即使你用了limit n,m ,SELECT FOUND_ROWS() 仍会返回满足条件记录的总数。这样,你执行完 select SQL_CALC_FOUND_ROWS 之后,再取一下记录总数就行了。 SQL code
|