关于分页的一个小demo

分页的思路是很简单的,它的复杂在于页面传输的属性太多,很容易把人搞糊涂,造成这样那样的错误。

 

一.分页的思路和用法

前台页面负责显示数据,后台servletControler)负责接收请求的页面数,再传送相关的数据。

要用到的参数有:int pageNum   请求的是几页

                            int pageCont    一共有多少页

                            int cont        一共有多少条数据

                            int mun        一页分几条数据

                            String path     跳到什么页面

 

DAO 对象负责将需要分页的数据从数据库中取出,放到一个list里面(具体的话大家发挥,也可以参照我下面的代码),然后将PagesBreak 实例化,调用它的break方法

 

public void break(List list ,int mun,String path,HttpServletRequset req,HttpServletResponse resp){……}

 

 

在前台页面的代码如下:

 

<%@ page contentType="text/html;charset=gb2312"%>

<%

       String message=(String)request.getAttribute("message");//打印错误的,可要可不要

%>

<%=message%>

<%

       //本段一定要保留

       String pageNum=(String)request.getAttribute("pageNum");

       String cont=(String)request.getAttribute("cont");

       String pageCont=(String)request.getAttribute("pageCont");

       String num=(String)request.getAttribute("num");

       int pageNums=0;

       int conts=0;

       int pageConts=0;

       int nums=0;

       try

       {

              if(pageNum!=null)

              {

              pageNums=Integer.parseInt(pageNum);

              conts=Integer.parseInt(cont);

              pageConts=Integer.parseInt(pageCont);

              nums=Integer.parseInt(num);

 

              }

       }

       catch(Exception e)

       {

              System.out.println(e);

       }

%>

<%

       List list=null;

       if(request.getAttribute("list")!=null)

       {

              Pages pages=null;//vo对象,改成自己的

              try

              {

                     list=(List)request.getAttribute("list");

                     for(int i=0;i<list.size();i++)

                     {

                            pages=(Pages)list.get(i);//pages改成你的vo

%>

//这里放你想显示的内容,可以加上表格和一些显示控制

<%

                     }

              }

              catch(Exception e)

              {

                     System.out.println(e);

              }

       }

 

%>

 

当前有<%=cont%>条数据,当前是第<%=pageNum%>页,共<%=pageCont%><br>

跳转页数:

<form name="form" method="post" action="admin_page.do">

<input type="text" name="pageNum">

<input type="submit" value="">

</form>

<br>

<%

       if(conts<nums)

       {

              //只有一页

       }

       if(pageNums==1&&pageNums<pageConts)

       {

       %>

       <a href="admin_page.do?pageNum=<%=pageNums+1 %>&action=show">下一页</a>

       <%

       }

       if(pageNums<pageConts&&pageNums!=1)

       {

%>

<a href="(这里写你的servlet名)?pageNum=<%=pageNums+1 %>&action=show">下一页</a>

<a href="(这里写你的servlet名)?pageNum=<%=pageNums-1%>&action=show">上一页</a>

<%

       }

       if(pageNums==pageConts&&pageNums>1)//最后一页

       {

%>

<a href="(这里写你的servlet名)?pageNum=<%=pageNums-1%>&action=show">上一页</a>

<%

       }

%>

 

 

而在PagesBeak里面,封装了一系列方法,考虑了一些页面请求会带来的问题,具体大家可以分析一下。

 

 

import java.util.*;

import javax.servlet.http.*;

public class BreakPages

{

       /*需要的参数有

        * num   一页有几条数据

        * list  需要分页的列表

        * pageNum  需要第几页

        * request

        * response

        * */

 

       private int pageNum;

       private List list;

       private String message="";

       //获取要求的页面数

       public int getPageNum(HttpServletRequest req,HttpServletResponse resp)

       {

              if(req.getParameter("pageNum")==null||"".equals(req.getParameter("pageNum")))//第一次请求

              {

                     this.pageNum=1;

              }

              else

              {

                     try

                     {

                            this.pageNum=Integer.parseInt(req.getParameter("pageNum"));

                     }

                     catch(Exception e)

                     {

                            System.out.println(e);

                            message="你输入的页面请求非法";

                            this.pageNum=1;

                            //this.getPageNum(req,resp);

                     }

              }

              return this.pageNum;

       }

      

       public int getCont(List list)

       {

              if(list!=null)

              {

                     return list.size();

              }

              else

              {

                     System.out.println("list为空");

              }

              return 0;

       }

       //一共有几页

       public int getPagesCont(int num,int cont)

       {

              int i=0;

              if(cont%num==0)

              {

                     i =cont/num;

              }

              else

              {

                     i=cont/num+1;

              }

              return i;

       }

       //开始分页

       public void breaks(List list,int num,String path,HttpServletRequest req,HttpServletResponse resp)

       {

              //判断请求是否合法

              int cont=this.getCont(list);

              int pageNums=this.getPageNum(req, resp);

              int pageCont=this.getPagesCont(num, cont);

              if(cont==0)

              {

                     message="没有数据";

              }

              if(pageNum<=0||pageNum>pageCont)

              {

                     message="你请求的页面不存在";

                     this.pageNum=1;

              }

              if(pageNum<=pageCont)

              {

                     this.list=new ArrayList();

                     int i;

                     for(i=(pageNum-1)*num;i<pageNum*num;i++)

                     {

                            if(i>=cont)break;

                            try

                            {

                                   this.list.add(list.get(i));

                            }

                            catch(Exception e)

                            {

                                   System.out.println("返回分页数据失败"+e);

                            }

                     }

                     //System.out.println(this.list);

                     req.setAttribute("list",this.list);

                     req.setAttribute("message",message);

                     req.setAttribute("num",String.valueOf(num));

                     try

                     {

                     req.setAttribute("pageNum",String.valueOf(pageNum));

                     req.setAttribute("pageCont",String.valueOf(pageCont));

                     req.setAttribute("cont",String.valueOf(cont));

                     req.getRequestDispatcher(path).forward(req, resp);

                     //System.out.println("<------->");

                     }

                     catch(Exception e)

                     {

                            System.out.println("页面跳转失败"+e);

                     }

              }

             

       }

}

二.个人分析和小结

写这个类是为了实现分页的功能,因为在个人的前期开发中分页是令自己相当烦的一个模块。利用这个类和前台的页面代码可以把分页的基本功能实现。但是还是有一些Bug

如下:

1

servlet里不能再doPost()或doGet()方法最后再写一个forward()方法,不然报异常说response不能再提交前返回。自己重写的forward()方法不知道有没有这个问题。问题产生于我在PagesBreak里用了forward()方法,而在一个servlet里只能在一次请求里调用一次forward();解决的办法可以参照下面的代码:

 

if("details".equals(action)&&id!=null)//发送页面

              {

                     path="/admin/temp_page.jsp";//如何找到根目录下的temp_page.jsp

                     dao=new PagesDAOImpl();

                     Pages page=null;

                     try

                     {

                            page=dao.get(Integer.parseInt(id));

                            req.setAttribute("path",page.getPath());

                            req.getRequestDispatcher(path).forward(req, resp);

                //注意这里,放在一个判断里面.处理不同的请求分别用不同的forward()

                     }

                     catch (Exception e)

                     {

                            System.out.println(e);

                     }

              }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1、支持通过Url进行分页: AspNetPager除提供默认的类似于DataGrid和GridView的PostBack分页方式外,还支持通过Url进行分页,象大多数asp程序中分页一样, Url分页方式允许用户通过在浏览器地址栏中输入相应的地址即可直接进入指定页面,也可以使搜索引擎搜索到所有分页的页面的内容,因此具有用户友好和搜索引擎友好的优点,关于Url分页与PostBack分页方式的差异,请参考Url与PostBack分页方式的对比。 2、支持Url分页方式下的Url重写(UrlRewrite)功能 Url重写技术可以使显示给用户的Url不同于实际的Url,Url重写技术被广泛应用于搜索引擎优化(SEO)、网站重组后重定向页面路径以及提供用户友好的Url等方面, AspNetPager支持Url重写技术使您可以自定义分页导航的Url格式,实现Url重写; 3、支持使用用户自定义图片做为导航元素: 您可以使用自定义的图片文件做为分页控件的导航元素,而不仅仅限于显示文字内容。 4、功能强大灵活、使用方便、可定制性强: AspNetPager分页控件的所有导航元素都可以由用户进行单独控制,从6.0版起,AspNetPager支持使用主题(Theme)与皮肤(Skin)统一控件的整体样式,配合asp.net 2.0中的DataSource控件,AspNetPager只需要编写短短几行代码,甚至无需编写任何代码,只需设置几个属性就可以实现分页功能。 5、增强的 Visual Studio 2005/2008设计时支持 增强的设计时支持使控件在设计时更加直观,易于使用,开发快捷方便。 6、兼容IE6.0+及FireFox 1.5+等浏览器 7、丰富而完整的控件文档和示例项目: 控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉AspNetPager控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。 Demo的主要功能有: 基本功能 分页按钮属性效果 使用自定义信息区 居中当前页索引按钮 Repeater分页 DataList分页 Url分页 使用Url重写技术 Url逆向分页 N层结构应用 使用XML文件数据源 图片浏览示例 使用AccessDataSource 使用SqlDataSource 使用ObjectDataSource 自定义数据呈现逻辑 使用图片按钮 查询结果分页 查询结果Url分页 克隆属性及事件 页索引输入/选择框 自定义导航按钮 在用户控件中实现分页
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值