“真分页”与“假分页”的实现方法

所谓的“真分页”与“假分页”,我想大概就是前者是在后台的时候就将数据给分好,前台显示,每一次的点击“前一页”、“下一页”就向后台发送一次请求。而后者便是后台将全部数据发送给前台,将数据绑定在控件上,利用jquery逻辑控制视图的渲染,控制数据的显隐来实现视觉上的分页效果。

两种方法都可以使用,各有利弊。“真分页”显然是效率更高,面对庞大的数据量也能够从容自若,但是缺点便是每次都需要和后台交互。“假分页”不需要和后台交互,但是一旦面对大数据量时,加载将十分缓慢,影响用户的体验。

由于是个人平时的练习,数据量不大,所以在我个人的项目中都使用了。下面记录我具体的实现方法。

“真分页”:利用mybatis逆向自带的分页方法实现,代码量十分的少,用起来也很方便。

1.在实体example类中,定义两个参数startRow、pageSize。getter\setter.

2.在对应实体类mapper.xml的selectByExample方法中加入如下限制条件:

 <if test="startRow != null and pageSize != null and pageSize != 0">
 limit #{startRow},#{pageSize}
 </if>
3.在sevice层的实现类方法中设置方法参数(我在这里固定了每页8条,也可以自行定义)
        @Override
	public List<News> selectNewsList(int startRow) {
		// TODO Auto-generated method stub
		NewsExample newsExample = new NewsExample();
		newsExample.setPageSize(8);//每页显示八条新闻
		newsExample.setStartRow(startRow);
		List<News> newsList = newsMapper.selectByExample(newsExample);
		return newsList;
	}
4.controller的逻辑判断和分页初始值的赋值
        @RequestMapping("selectNewsList")
	public String showNewsList(Integer pageNo,HttpSession session){
		int newsNums = newsService.countNews();//数据库中新闻的有效条目数
		int pageNums;//页码的最大值(总数)
		//如果能够整除,说明新闻最大页数是newsNums/8,不能够整除还需要加一页内容显示
		if (newsNums%8==0) {
			pageNums = newsNums/8;
		} else {
			pageNums = newsNums/8+1;
		}
		session.setAttribute("pageNums", pageNums);
		//判断当前页码,如果是首页,页面为空
		if (pageNo!=null) {
			//通过计算分页的第一条资讯的开始编号,来执行分页的方法
			List<News> newsList = newsService.selectNewsList((pageNo-1)*8);
			session.setAttribute("newsList", newsList);	
			session.setAttribute("pageNo", pageNo);
		} else {
			List<News> newsList = newsService.selectNewsList(0);
			session.setAttribute("newsList", newsList);
			session.setAttribute("pageNo", 1);//页码默认是从一开始的。
		}
		List<Type> typeList = typeService.selectTypeList();
		session.setAttribute("typeList", typeList);
		List<News> topList = newsService.selectNewsTop();
		session.setAttribute("topList", topList);
		return "news";
	}
jsp:
        <c:choose>  
          <c:when test="${pageNo>1}">          
          <a href="selectNewsList.action">首页</a>   
          <a href="selectNewsList.action?pageNo=${pageNo-1}">上一页</a>   
          </c:when>  
       </c:choose>  
	当前页数:[${pageNo}/${pageNums}]   
       <c:choose>  
          <c:when test="${pageNo!=pageNums}">  
          <a href="selectNewsList.action?pageNo=${pageNo+1}">下一页</a>   
          <a href="selectNewsList.action?pageNo=${pageNums}">末页</a>  
          </c:when>    
       </c:choose>  




“假分页”:利用jquery来实现。参考如下实例,很容易理解。

首页的效果利用jquery :gt选择器来实现:

语法

$(":gt(index)")
参数 描述
index

必需。规定要选择的元素。

会选取 index 值大于指定数的元素。



之后的分页效果主要是利用jquery的遍历来实现的:

参数 描述
function(index,element)

必需。为每个匹配元素规定运行的函数。

  • index - 选择器的 index 位置
  • element - 当前的元素(也可使用 "this" 选择器)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jquery伪分页效果</title>
<script src="js/jquery-1.7.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
 $(document).ready(function(){
   $("ul li:gt(3)").hide();//初始化,前面4条数据显示,其他的数据隐藏。
   var total_q=$("ul li").index()+1;//总数据
   var current_page=4;//每页显示的数据
   var current_num=1;//当前页数
   var total_page= Math.ceil(total_q/current_page);//总页数   
   var next=$(".next");//下一页
   var prev=$(".prev");//上一页
   $(".total").text(total_page);//显示总页数
   $(".current_page").text(current_num);//当前的页数
   //下一页
   $(".next").click(function(){
    if(current_num>=total_page){
      return false;//如果大于等于总页数就禁用下一页
     }
     else{
      $(".current_page").text(++current_num);//点击下一页的时候当前页数的值就加1
      $.each($('ul li'),function(index,item){
       var start = current_page* (current_num-1);//起始范围
       var end = current_page * current_num;//结束范围
       if(index >= start && index < end){//如果索引值是在start和end之间的元素就显示,否则就隐
        $(this).show();
       }else {
        $(this).hide(); 
       }
      });
     }
   });
   //上一页方法
   $(".prev").click(function(){
     if(current_num==1){
      return false;
     }else{
      $(".current_page").text(--current_num);
      $.each($('ul li'),function(index,item){
       var start = current_page* (current_num-1);//起始范围
       var end = current_page * current_num;//结束范围
       if(index >= start && index < end){//如果索引值是start和end之间的元素就显示,否则就隐藏
        $(this).show();
       }else {
        $(this).hide(); 
       }
      });  
     }
    })
 })
</script>
<style type="text/css">
 .main{width:800px;zoom:1;margin:0 auto;}
 .item{width:800px;overflow:hidden;}
 ul{padding:0;width:860px;zoom:1;}
 .clear{zoom:1;}
 .clear:after{content:"";display:block;height:0;clear:both;visibility:hidden;}
 ul li{list-style-type:none;float:left;background:#F69;font-size:60px;text-shadow:1px 1px 3px #555;width:380px;height:200px;margin:10px 40px 10px 0;line-height:200px;text-align:center;color:#fff;}
 .page_btn{padding-top:20px;}
 .page_btn a{cursor:pointer;padding:5px;border:solid 1px #ccc;font-size:12px;}
 .page_box{float:right;}
 .num{padding:0 10px;}
</style>
</head>
<body>
 <div class="main">
  <div class="item">
   <ul class="clear">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
    <li>9</li>
    <li>10</li>
    <li>11</li>
    <li>12</li>
    <li>13</li>
    <li>14</li>
    <li>15</li>
    <li>16</li>
    <li>17</li>
    <li>18</li>
    <li>19</li>
    <li>20</li>
    <li>21</li>
    <li>22</li>
    <li>23</li>
    <li>24</li>
    <li>25</li>
    <li>26</li>
    <li>27</li>
    <li>28</li>
   </ul>
  </div>
  <div class="page_btn clear">
   <span class="page_box">
    <a class="prev">上一页</a><span class="num"><span class="current_page">1</span><span style="padding:0 3px;">/</span><span class="total"></span></span><a class="next">下一页</a>
   </span>
  </div>
 </div><!--main-->
</body>
</html>

以上。

纯分页sql语句 参考:http://blog.csdn.net/qq_33764491/article/details/76691681




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值