无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
分页技术在web开发中是不可忽略的,也是非常重要的。其实传统分页跟新式分页还是各分千秋的,不能说老的不好,新的就好,要具体对待具体的项目。从网上看到某人的一段话,非常有效,相信这位仁兄也是经验之谈了:
“第一种方法是用select语句查询出所有的数据,再通过移动当前记录指针到当前页面需要显示的数据记录位置,再作显示。优点是程序比较简单,由于查询出来的结果较大,网络开销也较大。
第二种方法是先用一条select语句得到SQL查询的记录条数,因为数据库存执行"select count(*)"运算的速度是很快的,返回的数据集也仅一条记录,此开销可忽略不记。得到总记录数后,再计算出当前页面要显示的数据的SQL查询结果的起始位置和结束位置,再用SQL语句查询出当前页的数据。这种方法编写的程序的量相对较多,得到的数据量也相对较小,运行效率比第一种高,但并不能从根本上优化数据库的SQL查询,也不能从根本上解决网络开销大的问题。
第三种方法是使用存储过程。存储过程在数据库中会作预编译处理,所以执行速度较快。在JSP页面中要设定每页记录条数、当前的页码等参数,再将这些参数在调用存储过程时传入到存储过程中,由存储过程执行后得到指定页指定数目的记录数。这种方法优点烛效率最高,网络开销小,缺点不是程序员需要编写较多的程序,针对每个查询要编写不同的存储过程。”

三种分页我也都有用到过,我的一点感受:第一,三种方案对java程序设计师非常简单的。首先推翻一种说法,网上很多网友都说什么缓存数据查询结果集。乍一想很不过的想法。仔细一想,怎么可能。每当在数据库连接关闭时(PareparedStatement,Connection关闭),ResultSet 也都关闭了。看看下面的图就知道了:


 
分页一:
我是这样做的,首先我得到结果集(在我的项目里,结果集是解析xml而来的),然后都放到list中,传到view层(JSP),将这个list保存在HeepSession中。每次查询分页都是在这个list里截取。在数据量很小的情况下,这个还是非常方便的。只需要读取一次xml(一般连接DB的时候也只要连接一次)。同时缺点也是非常明显的:1.当这个结果集很大的时候无疑是非常耗内存的,效率也大减;2.实时性也很差,开始就将数据封装在list里了,得不到即时更新。
我在wap项目中的具体实现,wap用法很简单:
 注:为了方便我个人,有些无用信息我也不删除了,如果有读者看到,无用信息就忽略了吧。还有这里的list是我从后层解析xml封装的Listprize 集合。
JSP:
<%
        request.setCharacterEncoding(
"UTF-8");
        String lotid 
= request.getParameter("lotid"
);
        String name 
= request.getParameter("name"
);
        String pages 
= request.getParameter("pages"
);        
        
int pageI =
 Integer.parseInt(pages);
        
        String cpname 
= ""
;
        
if (lotid.equals("7")) 
{
            cpname 
= "福彩3D"
;
        }
 else if (lotid.equals("28")) {
            cpname 
= "大乐透"
;
        }
 else if (lotid.equals("8")) {
            cpname 
= "22选5"
;
        }
 else if (lotid.equals("20")) {
            cpname 
= "29选7"
;
        }
 else if (lotid.equals("5")) {
            cpname 
= "数字排列"
;
        }
 else if (lotid.equals("11")) {
            cpname 
= "七乐彩"
;
        }
 else if (lotid.equals("4")) {
            cpname 
= "七星彩"
;
        }
 else if (lotid.equals("26")) {
            cpname 
= "36选7"
;
        }
 else if (lotid.equals("12")) {
            cpname 
= "时时乐"
;
        }
 else if (lotid.equals("3")) {
            cpname 
= "双色球"
;
        }
 else if (lotid.equals("21")) {
            cpname 
= "15选5"
;
        }
 else if (lotid.equals("1")) {
            cpname 
= "胜负彩"
;
        }
 else if (lotid.equals("15")) {
            cpname 
= "半全场"
;
        }
 else if (lotid.equals("17")) {
            cpname 
= "进球彩"
;
        }
 else if (lotid.equals("29")) {
            cpname 
= "时时彩"
;
        }

    out.write(cpname 
+ "最新一期用户中奖信息<br/>"); 
    
    
//第一次访问排行榜的时候,初始化排行榜list,并將其放入session,供下次分頁。

    if(pageI == 1{
        List
<Listprize> list =
 prize.getPrize(lotid, name);
        session.setAttribute(
"list"
, list);        
    }

    
    List
<Listprize> listPrize = (List<Listprize>)session.getAttribute("list");    
    
    
int allpage = listPrize.size()/10 + (listPrize.size()%10==0?0:1
);
    
int allRec =
 listPrize.size();
    
int pagesize = 10
;
    
    out.write(
"" + allRec + "位中奖,第" + pageI + "/" + allpage + "页<br/>"
);
    
    
if(allRec <= pagesize) 
{
        
for(Listprize l: listPrize) 
{
            out.write(
"[" + cpname + "]" + l.getUsername() + "喜中" + l.getGetMoney() + "<br/>"
);
        }

    }
 else {
        
if(pageI == allpage)
{
            
for(int i = (pageI-1)*pagesize; i < allRec; i++
{
                Listprize prizeObject 
=
 listPrize.get(i);
                out.write(
"[" + cpname + "]" + prizeObject.getUsername() + "喜中" + prizeObject.getGetMoney() + "<br/>"
);
            }

            out.write(
"<anchor><go href='newaward.jsp'>上一页<postfield name='lotid' value='"+lotid+"'/><postfield name='name' value='"+name+"'/><postfield name='pages' value='"+(pageI-1)+"'/></go></anchor><br/>");
        }
else {        
            
for(int i = (pageI-1)*pagesize; i < pageI*pagesize; i++
{
                Listprize prizeObject 
=
 listPrize.get(i);
                out.write(
"[" + cpname + "]" + prizeObject.getUsername() + "喜中" + prizeObject.getGetMoney() + "<br/>"
);
            }

            
            
if(pageI > 1{
                out.write(
"<anchor><go href='newaward.jsp'>上一页<postfield name='lotid' value='"+lotid+"'/><postfield name='name' value='"+name+"'/><postfield name='pages' value='"+(pageI-1)+"'/></go></anchor>"
);
            }

            out.write(
"        <anchor><go href='newaward.jsp'>下一页<postfield name='lotid' value='"+lotid+"'/><postfield name='name' value='"+name+"'/><postfield name='pages' value='"+(pageI+1)+"'/></go></anchor><br/>");
        }

    }

     
%>


只有注册用户登录后才能发表评论。


网站导航: