JSP页面分页技术的实现(struts+ibatis+MySQL)


    在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>


注: 

 

mysql 同时返回查询总数及分页数据

 

select * from auth_user

SELECT FOUND_ROWS() //返回查询记录的总数

select sql_calc_found_rows col_name from table_name limit 5,3;
select found_rows()



SELECT语句中加上修饰SQL_CALC_FOUND_ROWS  

加上SQL_CALC_FOUND_ROWS之后,即使你用了limit n,m ,SELECT FOUND_ROWS() 仍会返回满足条件记录的总数。这样,你执行完 select SQL_CALC_FOUND_ROWS 之后,再取一下记录总数就行了。


SQL code
        
        
mysql > select * from calendar; + -- ----------+ | d | + -- ----------+ | 2006 - 11 - 01 | | 2006 - 11 - 02 | | 2006 - 11 - 03 | | 2006 - 11 - 04 | | 2006 - 11 - 05 | | 2006 - 11 - 06 | | 2006 - 11 - 07 | | 2006 - 11 - 08 | | 2006 - 11 - 09 | | 2006 - 11 - 10 | | 2006 - 11 - 11 | | 2006 - 11 - 12 | | 2006 - 11 - 13 | | 2006 - 11 - 14 | | 2006 - 11 - 15 | | 2006 - 11 - 16 | | 2006 - 11 - 17 | | 2006 - 11 - 18 | | 2006 - 11 - 19 | | 2006 - 11 - 20 | + -- ----------+ 20 rows in set ( 0.00 sec) mysql > select * from calendar order by d limit 10 , 5 ; + -- ----------+ | d | + -- ----------+ | 2006 - 11 - 11 | | 2006 - 11 - 12 | | 2006 - 11 - 13 | | 2006 - 11 - 14 | | 2006 - 11 - 15 | + -- ----------+ 5 rows in set ( 0.00 sec) mysql > select FOUND_ROWS() ; + -- ------------+ | FOUND_ROWS() | + -- ------------+ | 15 | + -- ------------+ 1 row in set ( 0.03 sec) mysql > mysql > select SQL_CALC_FOUND_ROWS * from calendar order by d limit 10 , 5 ; + -- ----------+ | d | + -- ----------+ | 2006 - 11 - 11 | | 2006 - 11 - 12 | | 2006 - 11 - 13 | | 2006 - 11 - 14 | | 2006 - 11 - 15 | + -- ----------+ 5 rows in set ( 0.00 sec) mysql > select FOUND_ROWS() ; + -- ------------+ | FOUND_ROWS() | + -- ------------+ | 20 | + -- ------------+ 1 row in set ( 0.00 sec) mysql >

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值