【牛腩】真假分页

        牛腩新闻发布系统最后一讲讲了真假分页,其实分页我们并不陌生,在网页中我们会经常看到,界面中不可能一次显示所有的东西,这时候就需要分页来帮忙,就像优快云中评论页的显示就采用了分页。

        【知识点】

        1、是什么?如下:


          假分页:从数据库中一次性选择所有数据,再将所有数据根据每页显示多少条记录进行分类。其缺点就是在数据比较多第一次加载时时间比较长,但是可以减少与后台的交互次数。

          真分页:只从数据库中选择当前页的数据,跳转下一页是再次读取,每次加载的速度比较快,但是与后台交互次数比较多。

        2、如何实现?

           下面只说一下真分页的实现:
           首先需要添加控件:AspNetPager(下载:点击打开链接 )

          建立存储过程:

<span style="font-size:18px;">-- =============================================
-- Author:		<RU>
-- Create date: <2015-05-17>
-- Description:	<新闻分页>
-- =============================================
ALTER PROCEDURE [dbo].[procNewsSelectPage]
@start integer,
@end integer
AS
BEGIN
	with tempt as (
	select ROW_NUMBER() over(order by id desc)as row,*from news T)
	select * from tempt where row between @start and @end 
	SET NOCOUNT ON;
END</span>
          DAL层调用存储过程:(B层引用D层)

<span style="font-size:18px;"> #region 新闻分页显示
        public DataTable SelectPage(int start, int end)
        {
            DataTable dt = new DataTable();
            string cmdText = "procNewsSelectPage";
            SqlParameter[] paras = new SqlParameter[]{
                new SqlParameter("@start",start),
                new SqlParameter("@end",end)
            };
            dt = sqlhelper.ExecuteQuery(cmdText, paras, CommandType.StoredProcedure);
            return dt;
        }

        #endregion</span>
          Web层:

          在新闻管理newsmanager.aspx中编写如下代码:设置分页控件的样式

<span style="font-size:18px;"><webdiyer:AspNetPager ID="anp" runat="server" FirstPageText="首页" LastPageText="尾页" NextPageText="下一页" PrevPageText="上一页" OnPageChanged="anp_PageChanged" PageSize="5" AlwaysShow="true">
</webdiyer:AspNetPager></span>
          在新闻管理newsmanager.aspx.cs后台编写如下代码:

<span style="font-size:18px;">protected void Page_Load(object sender, EventArgs e)
    {
        //判断session里面是否存在管理员
        if (Session["admin"] != null && Session["admin"].ToString() == "ru")
        {
            //已登录
            if (!Page.IsPostBack)
            {
                DataTable dt = new DataTable();
                dt = new NewsManager().SelectAll();
                anp.RecordCount = dt.Rows.Count;
                BindNews();
            }
        }
        else
        {
            //未登录
            Response.Redirect("login.aspx");
        }
    }
   
    #region 绑定新闻列表
    private void BindNews()
    {
        int start = anp.StartRecordIndex;
        int end = anp.EndRecordIndex;
        repNews.DataSource = new NewsManager().SelectPage(start, end);
        repNews.DataBind();
    }
    #endregion
    protected void anp_PageChanged(object sender, EventArgs e)
    {
        BindNews();
    }  </span>

          这样就可以实现了,效果如下:


        【小结】

        真假分页开始本不想实现了,系统都发布成功了,最后听牛腩老师讲讲就算了,后来一想,还是实现一下吧!想想别的网页,分页的功能是必不可少的,以后肯定也会用到,早晚会用到,现在有机会为什么不实现一下呢。想半天也没用,还是自己动手试试比较实在,其实实现了之后也就觉得没什么了。

用法:不用写连接数据库等多余代码(在ConnLink.java文件中修改一下相关属性就可以了,如果不想写分页,在ConnLink.java文件中DBlink()方法可以返回一个Statement对象,然后就可以利用这个返回值去写你想要的代码了),只要建立一个Page对象,调用SelectRS()方法,将SQL语句当前页码和每页要显示的条数正确的写入。SelectRS()会自动返回一个结果集rs,然后用rs遍历输出结果。用getFrist()、getBack()、getLast()、getNext()等方法进行取得上一页的页码,下一面的页码就可以了。 看了之后是不是很心动呢~~~ HOHO~~其实我的代码有很多不足,例如:是不是可以做成通用的分页?也可以把DBlink()中的conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiuzhou","root","123456");用的连接参数写在xml中生成一个JAR包,这样才更有扩展性,你说呢~~。希望高手能继续改良,让这段代码更精一些。HOHO~~~~改完之的一定要发到网上供大家参考和使用。 刚刚才发现Page.java文件是空的,在这里我就加上吧!实在是不好意思了 package com.SpreadPage; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.DateBase.*; public class Page extends ConnLink{ private Statement stmt=null; private ResultSet rs=null; private int row=0; private int num=0; private int page=0; private int list=0; //搜索去向 搜索条件 当前第几页 每页条数 public ResultSet SelectRS(String select,int page_num,int page) { this.num=page_num; this.page=page; String sql=select+" limit "+(page_num*page)+","+(page_num*page+page); //System.out.println(sql); try { stmt=DBlink(); rs=stmt.executeQuery(select); rs.first(); rs.last(); this.row=rs.getRow(); System.out.println(sql); if(rs!=null) { rs.close(); } if(stmt==null) { System.out.println("Stmt无连接"); return null; } rs=stmt.executeQuery(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rs; } //获得总记录数 public int getRow() { return row; } //第一页 public int getFrist() { return 0; } //最后一页 public int getBack() { if(getRow()%page==0) { return getRow()/page; } return (getRow()/page)+1; } //上一页 public int getLast() { if(num<=0) { return 0; } return (num-1); } //下一页 public int getNext() { int back=getBack(); if(num>=back) { return num; } return (num+1); } //当前页的条数 public int getNow() { try { rs.first(); rs.last(); list=rs.getRow(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } //当前第几页 public int getPage() { int sum=(num*page-page)+1; if(getRow()<sum) return 0; return sum; } }
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值