無線&移動互聯網技術研發

          換位思考·····
          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/>");
                  }

              }

               
          %>

          主站蜘蛛池模板: 香格里拉县| 周宁县| 丘北县| 乃东县| 曲阳县| 唐海县| 即墨市| 绥化市| 桂阳县| 田林县| 师宗县| 花莲市| 洛阳市| 河南省| 望城县| 洪江市| 沂源县| 农安县| 西乌珠穆沁旗| 郴州市| 长泰县| 土默特右旗| 临朐县| 城步| 毕节市| 应城市| 娱乐| 平江县| 海晏县| 昌乐县| 蓝田县| 宝丰县| 攀枝花市| 彭泽县| 韶山市| 武威市| 汶上县| 琼海市| 阿克陶县| 新巴尔虎右旗| 通山县|