<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA—咖啡館

    ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks
    名聲顯赫而招搖的數據持久層框架Hibernate,通過query.setFirstResult和query.setMaxResult來實現了對數據的分頁,這個分頁的實質在SqlServer中是TOP N的方法,Oracle是rownum<n方法。即直接通過SQL語句,來得到當前頁所需的數據。

    但是,Hibernate分頁,并不能得到頁腳,所以尚不通用。承接Jpage分頁的方便性,寫了這版分頁,以方便已與群眾。

    下面,就是在Hibernate下的通用分頁,屬于Jpage分頁的第三項功能。思路是定義一個Dao類,讓其它數據庫的dao都繼承這個Dao類。


    Dao類源文件:


     

    package com.xdf.dao;

    import java.io.*;
    import java.sql.*;
    import java.util.*;
    import javax.servlet.http.*;
    import org.hibernate.*;
    import org.hibernate.criterion.Projections;

    import com.xdf.hibernate.HibernateSessionFactory;

    public class Dao {

     HttpServletRequest request;

     HttpServletResponse response;

     Session session;

     //定義List集合
     private List list;

     public int intCountic;

     public int PageSize;

     public int intPageCount;

     public int intPage;

     public String nowPage;

     public String HttpFile;
     


     //取得網址是的參數
     String PageParameter;

     public Dao(HttpServletRequest request, HttpServletResponse response) {

      this.request = request;
      this.response = response;
     }

     /*
      *******得到Session**********
      */
     public Session getSession() {
      session = HibernateSessionFactory.getSession();
      return session;

     }

     //添加數據
     public void add(Object obj) {
     }

     //修改數據
     public void mod(Object obj) {
     }

     //普通查詢
     public List list() {
      return null;
     }

     
     
     public List jlist(Object query, String countsql)
     {

      
      Query q=null;
      Criteria cri=null;
      List li=null;
       
     
      boolean bool=false;;
      
      //得到記錄總數
            if(query instanceof Query) {
             q=(Query)query;
             bool=true;
       intCountic = getCountJsql(countsql);
       
      }
           
            else if(query instanceof Criteria) {
             
             cri=(Criteria)query;
             li=cri.list();
             
          
             if(li.size()==0)
              intCountic=0;
             else
              intCountic=li.size();
           
      }
            else
            {
             
             System.out.println("出錯提示:參數不正確");
             return null;
            }
           
        
           
      try
      {
      //每頁記錄數
          if (PageSize == 0)
       PageSize = 20;

      //獲得url,如 /user/china.jsp
      HttpFile = request.getRequestURI();

      //獲得當前頁數
      nowPage = request.getParameter("pages");

      //取得網址是的參數
      PageParameter = this.urlPath(request);

      //如果沒有pages參數,則讓頁數為1
      if (nowPage == null) {
       intPage = 1;
      }

      else {
       intPage = Integer.parseInt(nowPage);
       if (intPage < 1) {
        intPage = 1;
       }
      }

      

      //得到分頁總數
      intPageCount = ((intCountic + PageSize) - 1) / PageSize;

      if (intPage > intPageCount) {
       intPage = intPageCount;
      }
        
    //  得到list集合
      
       if(bool)
       list = q.setFirstResult((intPage - 1) * PageSize).setMaxResults(PageSize).list();    
       else
          list =cri.setFirstResult((intPage - 1) * PageSize).setMaxResults(PageSize).list(); 
      
     
      
      }
      catch(Exception ex)
      {
       ex.printStackTrace();
      }
      finally
      {
         
      }
      
      //將分頁和頁腳傳到request中
            request.setAttribute("list", list);
            request.setAttribute("foot", PageFooter());
      return list;
     }
     
     
     
     
     
     
     public List jlist(Query query)
     {
      
        String[] str = query.getQueryString().split("from");  
        String countsql ="select count(*) from "+str[1].trim();  
        return jlist(query,countsql);  
      
     }
     
     public List jlist(Criteria query)
     {
      
      return jlist(query,"");
      
      
     }
     
     
     
     

     //匯總語句,得到記錄總數
     public int getCountJsql(String countsql) {
      Query q = getSession().createQuery(countsql);
     
      List cc = q.list();
      Integer a = (Integer) cc.get(0);
      return a.intValue();
      
     
     }

     //頁腳顯示
     /**
      * 顯示分頁內容
      * @return
      */
     public String PageFooter() {

     
      if (list.size() <= 0) {
           return "<span style=\"color:#FF3300;font-size:14px;\">對不起,暫無記錄!</span>";
            }
      
      String style = "<style> \n";
      style += ".page {color: #333333; background-color: #F3F3F3; height: 18px;width: 36px;";
      style += "border: 1px solid #333333;margin-right: 1px; margin-left: 1px;} \n";
      style += " .fytd {font-size: 12px; color: #333333;}\n";
      style += ".fy:link {color: #333333;text-decoration: underline;font-size: 12px;} \n";
      style += ".fy:visited {color: #333333;text-decoration: underline;font-size: 12px;} \n";
      style += ".fy:hover{color: #000000;text-decoration: none;border: 1px solid #999999;";
      style += "background-position: center center;font-size: 12px; background-color: #FFFFFF;} \n";
      style += ".fy:active {color: #000000;text-decoration: none;border: 1px solid #999999;";
      style += "background-position: center center;padding: 1px 1px 0px;font-size: 12px;background-color: #FFFFFF;} \n";
      style += "</style> \n";

      String str = "";
      int prev = intPage - 1;
      int next = intPage + 1;
      str = str
        + "<table width=100% border=0 cellspacing=0 cellpadding=1 class=fytd>";
      str = str + "<tr><td width=45%>共計:<font color=#FF3300>[" + intCountic
        + "]</font>條 <font color=#FF3300> [" + intPageCount
        + "]</font>頁";
      str = str + " 第<font color=#FF3300>[" + getIntPage()
        + "]</font>頁</td><td width=55%>";
      str = str
        + "<table width=275 border=0 align=right cellpadding=0 cellspacing=0 class=fytd>";
      //*******
      String pstr = HttpFile + "?" + PageParameter.replace("&pages=", "");
      pstr = pstr.replace("?pages=", "");
      str = str + "<form action=" + pstr
        + " name=formin method=post><tr><td width=195>";
      if (intPage > 1) {
       str = str + " <A href=../../" + HttpFile + "?" + PageParameter + "1"
         + " class=fy>[首頁]</A> ";
      } else {
       str = str + " [首頁] ";
      }
      if (intPage > 1) {
       str = str + " <A href=../../" + HttpFile + "?" + PageParameter + prev
         + " class=fy>[上一頁]</A> ";
      } else {
       str = str + " [上一頁] ";
      }
      if (intPage < intPageCount) {
       str = str + " <A href=../../" + HttpFile + "?" + PageParameter + next
         + " class=fy>[下一頁]</A> ";
      } else {
       str = str + " [下一頁] ";
      }
      if (intPageCount > 1 && intPage != intPageCount) {
       str = str + " <A href=../../" + HttpFile + "?" + PageParameter
         + intPageCount + " class=fy>[尾頁]</A>";
      } else {
       str = str + " [尾頁]";
      }
      str = str
        + "</td><td width=80 align=right><input name=pages type=text class=page value="
        + intPage
        + " size=3 maxlength=5 onkeyup=javascript:value=value.replace(/[^\\d]/g,'')>";
      str = str
        + "<input name=Submit2 type=submit class=page value=轉到></td></tr></form></table>";
      str+="</td></tr></table>";
      return style + str;
     }

     /**
      * 對有參數的網址進行改造。。
      * 如 index.jsp?id=23&class=23
      */

     public String urlPath(HttpServletRequest request) {
      String path = "";
      String pagepath = "pages=";
      String url = request.getQueryString();

      //如果無參數
      if (url == null || url.equals("")) {
       return pagepath;
      }

      List lista = new ArrayList();
      StringTokenizer ss = new StringTokenizer(url, "&");

      while (ss.hasMoreTokens()) {
       String s = ss.nextToken();
       if (s.indexOf("pages") == -1)
        lista.add(s);
      }

      for (int i = 0; i < lista.size(); i++) {
       String param = "";
       try {
        param = new String(lista.get(i).toString().getBytes(
          "iso-8859-1"), "gb2312");
       } catch (UnsupportedEncodingException e) {

        e.printStackTrace();
       }
       path += param + "&";
      }

      return path + pagepath;

     }

     public int getIntCountic() {
      return intCountic;
     }

     public void setIntCountic(int intCountic) {
      this.intCountic = intCountic;
     }

     public int getIntPage() {
      return intPage;
     }

     public void setIntPage(int intPage) {
      this.intPage = intPage;
     }

     public int getIntPageCount() {
      return intPageCount;
     }

     public void setIntPageCount(int intPageCount) {
      this.intPageCount = intPageCount;
     }

     public String getNowPage() {
      return nowPage;
     }

     public void setNowPage(String nowPage) {
      this.nowPage = nowPage;
     }

     public int getPageSize() {
      return PageSize;
     }

     public void setPageSize(int pageSize) {
      PageSize = pageSize;
     }
    }

    /**
     * 注意事項:
     * 1、可傳遞Query或Critera參數
     * 2、傳遞Query對象時,不能使用包括?號的HQL語句。
     * 3、使用Critera時,是將所有數據讀到List中,從而獲得記錄數,經測試5萬條記錄內,差別不明顯
      *
     */


    產品dao類(具體dao):


     

     

    package com.xdf.dao;
    import java.util.List;
    import javax.servlet.http.*;
    import org.hibernate.*;
    import org.hibernate.Transaction;
    import com.xdf.bean.PInfo;
    import com.xdf.hibernate.HibernateSessionFactory;
    import com.xdf.struts.form.*;
    import javax.servlet.http.*;


    public class PinfoDao extends Dao {
     
     public PinfoDao(HttpServletRequest request,HttpServletResponse response)
     {
      super(request,response);
     }
     

     //添加產品  
     public void add(Object po) { }
     //修改產品  
     public void mod(Object po) { }

      //分頁查詢
      public List list() {  
      Query query =getSession().createQuery("from PInfo");

      //想使用分頁,將Query作為參數,傳給jlist方法就可以了,這時就可以得到列表和頁腳。
      //HQL查詢、條件查詢都返回Query對象,所以都可以。
       List li=jlist(query);
       //或者 List li=jlist(query,PInfo);
      return li;  
      }


     //匯總查詢
    public List count()
    {
    return null;
    }

      
    }



    3、Struts的Action調用dao:

     
    public ActionForward execute(ActionMapping mapping, ActionForm form,
       HttpServletRequest request, HttpServletResponse response) {
      System.out.println("aabbcc");
      PinfoDao dao = new PinfoDao(request,response);
      dao.list();
      return mapping.findForward("list");
      
     }



    4、在JSP中顯示:這里采用的是DIV布局

     
      <ul>
       <li>產品名稱</li>
       <li>產品類別</li>
       <li>產品價格</li>
       <li>操    作</li>
       </ul>
      
     
       <logic:iterate id="da" name="list">
        <ul>
       <li><bean:write name="da" property="PName" /></li>
       <li><bean:write name="da" property="PType" /></li>
       <li><bean:write name="da" property="PPrice" /></li>
       <li><a href="prod.do id=<bean:write name="da" property="PId" />">刪除</a></li>
       </ul>
       </logic:iterate>
      
       <ul>
       <li>
        <bean:write name="foot" filter="false"></bean:write>
       </li>
       </ul>




    示例下載:
    upload/2007_05/07051911442616.rar



    也就是說,你把Dao類,拷過去,讓你自己的具體的dao繼承這個類,就可以了。
    posted on 2007-11-01 21:32 rogerfan 閱讀(1236) 評論(2)  編輯  收藏 所屬分類: 【Java知識】【開源技術】

    Feedback

    # re: Jpage分頁——hibernate分頁[未登錄] 2007-11-26 16:44 GoKu
    string的+=操作太多了,建議用stringbulider,連接字符串性能差距很大  回復  更多評論
      

    # re: Jpage分頁——hibernate分頁 2008-06-11 19:34 大五
    呵呵,樓上的朋友言之不無道理。。
    但對于現在硬件,個人電腦大多是1G內存了,這點差別不足以論。
      回復  更多評論
      

    主站蜘蛛池模板: 97免费人妻在线视频| 国产真人无码作爱免费视频| 91精品国产免费久久久久久青草| 亚洲av无码片在线播放| 91福利免费网站在线观看| 国产偷国产偷亚洲高清日韩 | 亚洲AV永久无码区成人网站| 一级a性色生活片久久无少妇一级婬片免费放 | 在线观看亚洲成人| a级毛片高清免费视频| 亚洲成AV人片一区二区密柚| 很黄很污的网站免费| 亚洲国产精品不卡在线电影| 亚洲精品视频免费看| 亚洲国产精品综合福利专区| 无码永久免费AV网站| 亚洲精品精华液一区二区| 国产成人免费A在线视频| 四虎精品免费永久免费视频| 久久久亚洲精品蜜桃臀| 国产精品免费高清在线观看| 亚洲免费观看在线视频| 免费精品一区二区三区在线观看| 美美女高清毛片视频黄的一免费| 毛茸茸bbw亚洲人| 亚洲免费视频网站| 亚洲日韩一区精品射精| 亚洲片国产一区一级在线观看| a级毛片毛片免费观看久潮| 亚洲自偷自拍另类图片二区| 成年女人免费视频播放体验区| 国产精品亚洲а∨无码播放麻豆| 国产精品亚洲片在线| 国产h肉在线视频免费观看| 久久精品国产亚洲AV天海翼| 国产亚洲精品激情都市| 精品国产无限资源免费观看| 久久精品国产亚洲AV未满十八| 久久九九亚洲精品| 在线观看免费为成年视频| 一级毛片免费一级直接观看|