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

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

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

    內蒙古java團隊

    j2se,j2ee開發組
    posts - 139, comments - 212, trackbacks - 0, articles - 65
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    我的struts分頁算法的實現

    Posted on 2006-11-26 13:25 帥子 閱讀(183) 評論(0)  編輯  收藏 所屬分類: j2se技術專區
    到分頁算法,一般WEB開發都會用到,我只是在我的實現技術上用了struts框架,其實原理都一樣的。
    看了網上相當多的分頁算法,有對的也有好多是錯的,更有好多是不太優化的。還有以前自己在augmentum做的一個分頁算法,總結了一些不足。決定重新再寫一個分頁算法。
    首先,應該寫個bean來記錄存儲一些頁面的屬性
    分頁大致需要如下屬性:

    ?private?int?currentPage?=?1;?//?當前頁

    ?private?int?totalPages?=?0;?//?總頁數

    ?private?int?pageRecorders?=?5;//?每頁5條數據?

    ?private?int?totalRows?=?0;?//?總數據數

    ?private?int?pageStartRow?=?0;//?每頁的起始數

    ?private?int?pageEndRow?=?0;?//?每頁顯示數據的終止數

    ?private?boolean?hasNextPage?=?false;?//?是否有下一頁

    ?private?boolean?hasPreviousPage?=?false;?//?是否有前一頁
    ?
    ?private?int?nextPage?=?0;//下一頁的頁碼
    ?
    ?private?int?previousPage?=?0;//上一頁的頁碼

    然后這些屬性之間是有聯系的,我們可以在構造函數的時候就初始化一些屬性
    有兩種方法:
    一,根據總的頁數,(假設當前頁為1)
    ?public?PageBean(int?totalRows){
    ??this.totalRows?=?totalRows;
    ??this.currentPage?=?1;
    ??hasPreviousPage?=?false;
    ??if?((totalRows?%?pageRecorders)?==?0)?{
    ???totalPages?=?totalRows?/?pageRecorders;
    ??}?else?{
    ???totalPages?=?totalRows?/?pageRecorders?+?1;
    ??}
    ??if?(totalRows?>=?pageRecorders)?{
    ???hasNextPage?=?true;
    ???nextPage?=?2;
    ???this.pageEndRow?=?pageRecorders;
    ??}?else?{
    ???this.pageEndRow?=?totalRows;
    ???hasNextPage?=?false;
    ???nextPage?=?1;
    ??}
    ???this.pageStartRow?=?0;??
    ???previousPage?=?1;
    ?}
    然后在按下一頁或者上一頁的時候需要如下函數處理:
    public?void?nextPage()?{
    ??if(hasNextPage?==?true)
    ??currentPage?=?currentPage?+?1;
    ??if?((currentPage?-?1)?>?0)?{
    ???hasPreviousPage?=?true;
    ??}?else?{
    ???hasPreviousPage?=?false;
    ??}
    ??if?(currentPage?>=?totalPages)?{
    ???hasNextPage?=?false;
    ???this.nextPage?=?currentPage;
    ??}?else?{
    ???hasNextPage?=?true;
    ???nextPage?=?currentPage+1;
    ??}
    ??this.pageStartRow?=?(currentPage?-1)?*?pageRecorders;
    ??if(hasNextPage?==?true)
    ??this.pageEndRow?=?pageStartRow?+?5;
    ??else{
    ???this.pageEndRow?=this.totalPages;
    ??}
    ??previousPage?=?currentPage?-?1;
    ?}
    ?
    ?public?void?previousPage()?{
    ??if(hasPreviousPage?==?true)
    ??currentPage?=?currentPage?-?1;
    ??if?(currentPage?==?0)?{
    ???currentPage?=?1;
    ??}
    ??if?(currentPage?>=?totalPages)?{
    ???hasNextPage?=?false;
    ??}?else?{
    ???hasNextPage?=?true;
    ??}
    ??nextPage?=?currentPage?+?1;
    ??if?((currentPage?-?1)?>?0)?{
    ???hasPreviousPage?=?true;
    ???previousPage?=?currentPage?-?1;
    ??}?else?{
    ???hasPreviousPage?=?false;
    ???previousPage?=?currentPage;
    ??}
    ??
    ??this.pageStartRow?=?(currentPage?-1)?*?pageRecorders;
    ??if(hasNextPage?==?true)
    ??this.pageEndRow?=?pageStartRow?+?5;
    ??else{
    ???this.pageEndRow?=this.totalPages;
    ??}
    ?}
    在HTML中按下一頁或者上一頁的時候有如下代碼:
    <logic:equal?name="page"?property="hasNextPage"?value="true">
    <html:link?page="/List.do?action=nextPage">
    nextPage
    </html:link>
    </logic:equal>
    <logic:equal?name="page"?property="hasPreviousPage"?value="true">
    <html:link?page="/List.do?action=previousPage">
    PreviousPage
    </html:link>
    </logic:equal>
    然后在Action中作如下處理:??
    ??String?currentPage?=?request.getParameter("currentPage");
    ??HttpSession?session?=?request.getSession();?
    ??EmployeeForm?employeeForm?=?(EmployeeForm)?form;
    ??String?queryString?=?null;
    ??String?queryCon?=?null;
    ??String?action?=?employeeForm.getAction();
    ??List?list?=?new?ArrayList();
    ??PageBean?pb?=?null;
    ??EmployeeDao?employeeDao?=?new?EmployeeDao();
    ??if(action?==?null?||?action.equals("null")){
    ???int?totalRows?=?employeeDao.getTotalRows();
    ??
    ????pb?=?new?PageBean(totalRows);
    ????session.removeAttribute("page");
    ????queryString?=?employeeForm.getQueryString();
    ????queryCon?=?employeeForm.getQueryCon();
    ????session.setAttribute("queryString",queryString);
    ????session.setAttribute("queryCon",queryCon);???
    ????list?=?employeeDao.getAllEmployee(queryString,?queryCon,
    ??????String.valueOf(pb.getPageStartRow()),
    ??????String.valueOf(pb.getPageRecorders()));
    ???????
    ??}else?if(action.equals("nextPage")){
    ???queryString?=?(String)session.getAttribute("queryString");
    ???queryCon?=?(String)session.getAttribute("queryCon");??????
    ???employeeForm.setQueryString(queryString);
    ???employeeForm.setQueryCon(queryCon);
    ???pb?=?(PageBean)session.getAttribute("page");
    ???pb.nextPage();
    ???list?=?employeeDao.getAllEmployee(queryString,?queryCon,
    ?????String.valueOf(pb.getPageStartRow()),
    ?????String.valueOf(pb.getPageRecorders()));
    ??}else?if(action.equals("previousPage")){
    ???queryString?=?(String)session.getAttribute("queryString");
    ???queryCon?=?(String)session.getAttribute("queryCon");
    ???employeeForm.setQueryString(queryString);
    ???employeeForm.setQueryCon(queryCon);
    ???pb?=?(PageBean)session.getAttribute("page");???
    ???pb.previousPage();
    ???list?=?employeeDao.getAllEmployee(queryString,?queryCon,
    ?????String.valueOf(pb.getPageStartRow()),
    ?????String.valueOf(pb.getPageRecorders()));
    ??}
    ????????
    ????????pb.description();
    ????????session.setAttribute("page",pb);????????
    ??request.setAttribute("admin",?"admin");
    ??request.setAttribute("employee",?list);
    ??return?mapping.findForward("showlist");
    ??然后在數據庫查詢中有如下代碼:
    /**
    *查詢總記錄數
    */
    ?public?int?getTotalRows()?{
    ??int?totalRows?=?0;
    ??String?sql?=?"select?count(*)?from?employee";//假設是員工表
    ??Database?db?=?new?Database();
    ??ResultSet?rs?=?db.executeQuery(sql);
    ??try?{
    ???while?(rs.next())?{
    ????String?id?=?(String)?rs.getString(1);
    ????totalRows?=?Integer.parseInt(id);
    ???}
    ??}?catch?(SQLException?e)?{
    ???e.printStackTrace();
    ??}
    ??db.close();
    ??return?totalRows;
    ?}
    ?
    /*
    *查詢每一頁需要查詢的頁碼
    */
    public?List?getAllEmployee(String?queryString,?String?queryCon,String?startRow,String?num)?{
    ??List?list?=?new?ArrayList();
    ??String?sql?=?null;
    ??if?(queryString?==?null?||?queryString.equals(""))?{
    ???sql?=?"select?*?from?employee,dept?"?+
    ?????"where?dept.Id?=?employee.deptId?"?+
    ?????"order?by?employee.id?asc"+?"?limit?"+startRow+","+num;
    ??}?else?{
    ???sql?=?"select?*?from?employee,dept?"?+
    ?????"where?dept.Id?=?employee.deptId?order?by?employee."
    ?????+?queryString?+?"?"?+?queryCon?+?"?limit?"+startRow+","+num;
    ??}
    ??Employee?employee?=?null;
    ??Database?db?=?new?Database();
    ??ResultSet?rs?=?db.executeQuery(sql);
    ??try?{
    ???while?(rs.next())?{
    ????String?id?=?(String)?rs.getString("employee.id");
    ????String?name?=?(String)?rs.getString("employee.name");
    ????String?deptId?=?(String)?rs.getString("employee.deptId");
    ????String?deptName?=?(String)?rs.getString("dept.deptName");
    ????employee?=?new?Employee();
    ????employee.setId(id);
    ????employee.setName(name);
    ????employee.setDeptId(deptId);
    ????employee.setDeptName(deptName);
    ????list.add(employee);
    ???}
    ??}?catch?(SQLException?e)?{
    ???e.printStackTrace();
    ??}
    ??db.close();
    ??return?list;
    ?}
    這里我用了hibernate進行數據庫操作,你也可以用jdbc進行操作,情況類似。

    二,根據總的頁數,當前頁
    這樣的話構造函數應該寫成:
    public?PageBean(int?totalRows,int?currentPage)?{
    ??this.totalRows?=?totalRows;
    ??this.currentPage?=?currentPage;
    ??if(currentPage?<?2)
    ???hasPreviousPage?=?false;
    ??else
    ???hasPreviousPage?=?true;
    ??if?((totalRows?%?pageRecorders)?==?0)?{
    ???totalPages?=?totalRows?/?pageRecorders;
    ??}?else?{
    ???totalPages?=?totalRows?/?pageRecorders?+?1;
    ??}
    ??if?(currentPage?<?totalPages)?{
    ???hasNextPage?=?true;
    ???nextPage?=?currentPage?+?1;
    ???pageStartRow?=?(currentPage?-?1)*pageRecorders;
    ???this.pageEndRow?=?pageStartRow?+?pageRecorders;
    ??}?else?if(currentPage?==?totalPages){
    ???pageStartRow?=?(currentPage?-?1)*pageRecorders;
    ???this.pageEndRow?=?totalRows;
    ???hasNextPage?=?false;
    ???nextPage?=?currentPage;
    ??}
    ??if(currentPage?<?2){
    ???previousPage?=?currentPage;
    ???hasPreviousPage?=?false;
    ??}else?if(currentPage?>?1){
    ???previousPage?=?currentPage-1;
    ???hasPreviousPage?=?true;
    ??}?
    ?}

    在action中應該寫成
    if(currentPage?==?null){
    ????pb?=?new?PageBean(totalRows);
    ????session.removeAttribute("page");
    ????queryString?=?employeeForm.getQueryString();
    ????queryCon?=?employeeForm.getQueryCon();
    ????session.setAttribute("queryString",queryString);
    ????session.setAttribute("queryCon",queryCon);???
    ????list?=?employeeDao.getAllEmployee(queryString,?queryCon,
    ??????String.valueOf(pb.getPageStartRow()),
    ??????String.valueOf(pb.getPageRecorders()));
    ????}
    ???else{
    ????pb?=?new?PageBean(totalRows,Integer.parseInt(currentPage));
    ????queryString?=?employeeForm.getQueryString();
    ????queryCon?=?employeeForm.getQueryCon();
    ????session.setAttribute("queryString",queryString);
    ????session.setAttribute("queryCon",queryCon);???
    ????list?=?employeeDao.getAllEmployee(queryString,?queryCon,
    ??????String.valueOf(pb.getPageStartRow()),
    ??????String.valueOf(pb.getPageRecorders()));
    ???}
    ??session.setAttribute("page",pb);????????
    ??request.setAttribute("admin",?"admin");
    ??request.setAttribute("employee",?list);
    ??return?mapping.findForward("showlist");

    在jsp中應該寫成:
    <logic:equal?name="page"?property="hasNextPage"?value="true">
    <a?href="List.do?currentPage=<bean:write?name="page"?property="nextPage"/>">
    nextPage
    </a>
    </logic:equal>
    <logic:equal?name="page"?property="hasPreviousPage"?value="true">
    ?|?
    <a?href="/test/List.do?currentPage=<bean:write?name="page"?property="previousPage"/>">
    PreviousPage
    </a>
    </logic:equal>
    數據庫查詢部分依然適用。



    盡管洋洋灑灑貼了一部分代碼,不過好像不太想看,包括我,也比較討厭看一些煩瑣的代碼,所以如果你想要源代碼進行探討研究的話,歡迎隨時找我。那就總結一下這兩種方法吧
    首先這兩種方法都是取需要顯示的數據顯示,這樣,在數據庫龐大的情況下,比一次性把所有數據都取出來的效率要高。
    第一種方法是把PageBean存在了一個HttpSession中,在進入到顯示列表的時候就進行了初始化,在jsp頁面傳遞的參數action是固定的三個值:null,nextPage,previousPage.這樣雖然比較容易理解,但是我發現一個BUG,就是如果你按刷新,他也會翻頁,因為他的url就是?.do?aciton=nextPage,這樣的話你傳進去的action還是有一個值,這樣就會導致翻頁。
    第二種方法是考慮了第一種方法的BUG,在jsp頁面傳遞的參數currentPage的值是bean中的nextPage的值或者previousPage里的值,用了struts標簽庫嵌套,把值賦予currentPage,這樣的話currentPage的值是:1,2,3,4...totalPages之間。這樣的話你即使按刷新按鈕,他也是當前頁,因為他的url就是.do?currentPage=someNumber(someNumber是1到totalPages中的一個值)。但是這樣的話Pagebean在每次訪問的時候都要重新生成一個對象,該對象也是根據totalRows(總數據數),currentPage(當前頁數)進行構造,從而設置其他的一些屬性。個人比較推薦第二種方法。
    主站蜘蛛池模板: 亚洲精品高清国产麻豆专区| 久久久久国产免费| 久久亚洲AV无码精品色午夜| 性做久久久久免费观看| 91青青国产在线观看免费| 男女交性无遮挡免费视频| 亚洲youjizz| 91精品国产亚洲爽啪在线影院| 国产精品亚洲产品一区二区三区| 在线免费观看毛片网站| 最近免费2019中文字幕大全| 国产午夜无码片免费| 国产精品亚洲二区在线| 最新国产精品亚洲| 久久亚洲国产精品成人AV秋霞 | 四虎永久精品免费观看| 成人免费黄色网址| 免费人妻无码不卡中文字幕系| 久久精品成人免费国产片小草| 国产成人综合亚洲一区| 亚洲熟妇自偷自拍另欧美| 亚洲人成网站在线观看播放动漫 | 中文字幕成人免费高清在线视频 | 永久久久免费浮力影院| 97免费人妻无码视频| 在免费jizzjizz在线播| 性xxxxx大片免费视频| 国产精品白浆在线观看免费| 久久免费99精品国产自在现线| 免费无码专区毛片高潮喷水| 国产成人精品亚洲| 黄色毛片免费网站| 免费人成动漫在线播放r18| 美女视频黄.免费网址| 美女免费精品高清毛片在线视| 性色av极品无码专区亚洲| 亚洲AV日韩综合一区| 狠狠入ady亚洲精品| 久久水蜜桃亚洲AV无码精品| 精品无码专区亚洲| 无忧传媒视频免费观看入口|