Java Web开发jsp显示高级分页效果详解

来源:互联网 发布:超级淘宝系统360118 编辑:程序博客网 时间:2024/06/08 02:43

     许多网站都文章或其他类内容的分页效果,初学者对于分页的开发有时只会用代码,而没有深入了解代码编写前的业务逻辑结构,掌握好这个,我想,任何的效果的分页都能自己解决……

     1、确立jsp分页的内部逻辑结构:

       现在就采用标准MVC模式下的分页做简单介绍。首先数据库里我们查询了一大堆的数据,列出来一个for循环(或者直接使用标签迭代输出<logic:interate),可能数据是一行一行,在一个表格标签中显示(或许是div的嵌套),不管怎么样,拿出来的的数据要规定显示多少行,超过了要分页,我们点击下一页,或者一个页码,将请求传递给servlet(action……)进行业务处理,将处理后得到的那几行数据(也就是点击的要显示的那一页数据)在服务器中转发到那个视图显示:

 request.getRequestDispatcher("xxx.jsp").forward(request, response);

servlet接受http地址的参数,通过request接受,要传递的参数主要有查询的表名,要得到的该页的页数(查询的内容更细时应该传递更多的其它参数),这些参数用于构建sql语句查询数据库中该页的内容,如下是这个处理查询一页的java类:这里为了方便操作,在bean中也放入两业务逻辑处理方法,实际应用时应该将他们打包在一个专门的java类中:

package com.xxx.bean;import java.sql.*;import java.util.Vector;import com.xxx.util.DB;/* * 肖力 * 2012-7-7 * 主要用于前台显示列表的分页 * */public class Lists {private static Connection con=null;//声明Connection引用private static Statement stat=null;//声明Statement引用private static ResultSet rs=null;//声明ResultSet引用private static int span=6;  //span每页显示多少行记录private int curPage = 1;   //当前页private String msgsql;      //private int totalPage; private int total;public int getTotal() {return total;}public void setTotal(int total) {this.total = total;}public int getCurPage(){//得到用户当前页return this.curPage;}public void setCurPage(int curPage){//记录用户当前页this.curPage = curPage;}public void setSql(String sql){this.msgsql = sql;}public String getSql(){return this.msgsql;}public int getTotalPage(){return this.totalPage;}public void setTotalPage(int totalPage){this.totalPage = totalPage;}public static int getSpan() {return span;}public static  void setSpan(int i) {span = i;}//获取要分页处理的总页数public static int getTotalPages(String sql){int totalPage=1;try{con=DB.getCon();stat=con.createStatement();rs=stat.executeQuery(sql); rs.next();int rows=rs.getInt(1);//System.out.println(rows);totalPage= rows/span;            if(rows%span!=0)            {            totalPage++;            }}catch(Exception e){e.printStackTrace();}finally{try{DB.closeCon();con.close();}catch(Exception e){e.printStackTrace();}}return totalPage;}//查询指定SQL中结果的指定页的结果集public  static Vector<String[]> getPageContent(int page,String sql){Vector<String[]> vcon = new Vector<String[]>();try{con=DB.getCon();stat=con.createStatement();//执行语句得到结果集            rs = stat.executeQuery(sql);            //获取结果集的元数据            ResultSetMetaData rsmt = rs.getMetaData();            //得到结果集中的总列数            int count = rsmt.getColumnCount();            int start = (page-1)*span;            if(start!=0)            {            rs.absolute(start);            }int temp=0;            while(rs.next()&&temp<span)            {            temp++;            String[] str = new String[count];            for(int i=0;i<str.length;i++)            {            str[i] = rs.getString(i+1);            }            vcon.add(str);            }}catch(Exception e){e.printStackTrace();}finally{try{DB.closeCon();rs.close();            stat.close();            con.close();}catch(Exception e){e.printStackTrace();}}return vcon;}}

以上的bean中保存了这个查询的总页数,当前页码,每页显示的数目等等属性,另外的两个操作方法是静态方法,实例化该对象时可以对象直接调用,其中的数据库代理类DB这里就不写了。
2、servlet处理客服端的查询页面请求并且回应

     大概步骤:接受参数;实例化List对象;构造sql语句并查询;转发结果集到前台显示;

      以下是示例代码:

String table=request.getParameter("table");String ftable=request.getParameter("ftable");int curPage =Integer.parseInt(request.getParameter("curPage")); //得到该栏目的数目String sql="";//得到该类的总页数String sqlpage = "";sql="select * from  "+table+" where Attribute='"+ftable+"' order by ID desc";sqlpage = "select count(*) from "+table+" where Attribute='"+ftable+"'";//获取总页数和总条数int totalpage =Lists.getTotalPages(sqlpage);int total=ProDB.getCounts(sqlpage);if(curPage==0||curPage>totalpage){curPage=1;//当上下页页数不符合规定时将当前页码数置为1}//将得到的页数和当前页码存到Bean中Lists list=new Lists();//实例化分页类list.setCurPage(curPage);list.setTotalPage(totalpage);list.setTotal(total);//得到该页的内容Vector<String[]> vlist=Lists.getPageContent(curPage,sql);if(vlist.size()==0){//没有搜索到该类问题的文章String msg= "还没有该类的列表项目!!!";request.setAttribute("msg",msg);}request.setAttribute("vlist",vlist);request.setAttribute("list",list);request.setAttribute("ftable", ftable);request.setAttribute("table",table);request.getRequestDispatcher("list.jsp").forward(request, response);

这里将查询的结果集转发到了list.jsp页面显示:以下展示list页面分页图标特殊效果。

3、关于前台分页点击效果展示

  大部分网站上的分页点击效果都是只有上一页、下一页、尾页、末页、或者加入一个提交文本框编写页码展示,那就是如下的示例代码了:

                  <a href="ShowServlet?action=listly&curPage=1&jsp=liuyan_list" class="aaa" title="首页">首页</a>   <a href="ShowServlet?action=listly&curPage=<%=curPage-1%>&jsp=liuyan_list" class="aaa" title="上一页">上一页</a>   <a href="ShowServlet?action=listly&curPage=<%=curPage+1%>&jsp=liuyan_list"  class="aaa" title="下一页">下一页</a>   <a href="ShowServlet?action=listly&curPage=<%=totalpage%>&jsp=liuyan_list" class="aaa" title="末页">末页</a> 

至于显示页码,并且页码随着页数变化而变化,就要处理一段较为复杂的业务逻辑结构,下面就此用许多scripted代码在jsp页面显示吧:

<%      if (totalpage <= 4) {      for (int i = 1; i <= totalpage; i++) {      if (i == curPage) {      %><b><u><%=i%></u>. </b><%} else {%><a href="ShowServlet?action=listly&curPage=<%=i%>&jsp=liuyan_list" title="第<%=i %>页"><%=i%></a>. <%}}%> (第<%=curPage%>/<%=totalpage%>页)<%} else {for (int i = curPage; i < curPage + 4; i++) {if (curPage == 1) {if (i == curPage) {%><b><u>1</u>. </b><%} else {%>    <a href="ShowServlet?action=listly&curPage=<%=i%>&jsp=liuyan_list"  title="第<%=i %>页"><%=i%></a>. <%}} else if (curPage > 1 && curPage < (totalpage - 1)) {if (i - 1 == curPage) {%> <b><u><%=i - 1%></u>. </b><%} else {%>   <a href="ShowServlet?action=listly&curPage=<%=i - 1%>&jsp=liuyan_list"  title="第<%=i-1 %>页"><%=i - 1%></a>. <%}} else if (curPage > 1 && curPage == totalpage - 1) {if (i - 2 == curPage) {%> <b><u><%=i - 2%></u>. </b><%} else {%>   <a href="ShowServlet?action=listly&curPage=<%=i - 2%>&jsp=liuyan_list"  title="第<%=i-2 %>页"><%=i - 2%></a>. <%}} else if (curPage == totalpage) {if (i - 3 == curPage) {%> <b><u><%=i - 3%></u>. </b><%} else {%>   <a href="ShowServlet?action=listly&curPage=<%=i - 3%>&jsp=liuyan_list"  title="第<%=i-3 %>页"><%=i - 3%></a>. <%}}}%>       (第<%=curPage%>/<%=totalpage%>页)<%      }   %>         共 <%=total %> 条记录    </td>  </tr>


只显示四个图标,可以更改代码实现更多。以上代码在jsp页面中,违背了MVC标准模式开发,有必要将它们封装,这里不详细讲述了。

效果图如下:



 谢谢参观。

原创粉丝点击