分页的思路是很简单的,它的复杂在于页面传输的属性太多,很容易把人搞糊涂,造成这样那样的错误。
一.分页的思路和用法
前台页面负责显示数据,后台servlet(Controler)负责接收请求的页面数,再传送相关的数据。
要用到的参数有: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); } } |