熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

我的struts分頁算法的實現

2013-11-23 20:37:45  來源: Java開源技術 

  說到分頁算法一般WEB開發都會用到我只是在我的實現技術上用了struts框架其實原理都一樣的
看了網上相當多的分頁算法有對的也有好多是錯的更有好多是不太優化的還有以前自己在augmentum做的一個分頁算法總結了一些不足決定重新再寫一個分頁算法
首先應該寫個bean來記錄存儲一些頁面的屬性
分頁大致需要如下屬性

 private int currentPage = ; // 當前頁

 private int totalPages = ; // 總頁數

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

 private int totalRows = ; // 總數據數

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

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

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

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

然後這些屬性之間是有聯系的我們可以在構造函數的時候就初始化一些屬性
有兩種方法
根據總的頁數(假設當前頁為
 public PageBean(int totalRows){
  thistotalRows = totalRows;
  thiscurrentPage = ;
  hasPreviousPage = false;
  if ((totalRows % pageRecorders) == ) {
   totalPages = totalRows / pageRecorders;
  } else {
   totalPages = totalRows / pageRecorders + ;
  }
  if (totalRows >= pageRecorders) {
   hasNextPage = true;
   nextPage = ;
   thispageEndRow = pageRecorders;
  } else {
   thispageEndRow = totalRows;
   hasNextPage = false;
   nextPage = ;
  }
   thispageStartRow = ;  
   previousPage = ;
 }
然後在按下一頁或者上一頁的時候需要如下函數處理
public void nextPage() {
  if(hasNextPage == true)
  currentPage = currentPage + ;
  if ((currentPage  ) > ) {
   hasPreviousPage = true;
  } else {
   hasPreviousPage = false;
  }
  if (currentPage >= totalPages) {
   hasNextPage = false;
   thisnextPage = currentPage;
  } else {
   hasNextPage = true;
   nextPage = currentPage+;
  }
  thispageStartRow = (currentPage ) * pageRecorders;
  if(hasNextPage == true)
  thispageEndRow = pageStartRow + ;
  else{
   thispageEndRow =thistotalPages;
  }
  previousPage = currentPage  ;
 }
 
 public void previousPage() {
  if(hasPreviousPage == true)
  currentPage = currentPage  ;
  if (currentPage == ) {
   currentPage = ;
  }
  if (currentPage >= totalPages) {
   hasNextPage = false;
  } else {
   hasNextPage = true;
  }
  nextPage = currentPage + ;
  if ((currentPage  ) > ) {
   hasPreviousPage = true;
   previousPage = currentPage  ;
  } else {
   hasPreviousPage = false;
   previousPage = currentPage;
  }
  
  thispageStartRow = (currentPage ) * pageRecorders;
  if(hasNextPage == true)
  thispageEndRow = pageStartRow + ;
  else{
   thispageEndRow =thistotalPages;
  }
 }

  在HTML中按下一頁或者上一頁的時候有如下代碼
<logic:equal name=page property=hasNextPage value=true>
<html:link page=/Listdo?action=nextPage>
nextPage
</html:link>
</logic:equal>
<logic:equal name=page property=hasPreviousPage value=true>
<html:link page=/Listdo?action=previousPage>
PreviousPage
</html:link>
</logic:equal>
然後在Action中作如下處理  
  String currentPage = requestgetParameter(currentPage);
  HttpSession session = requestgetSession(); 
  EmployeeForm employeeForm = (EmployeeForm) form;
  String queryString = null;
  String queryCon = null;
  String action = employeeFormgetAction();
  List list = new ArrayList();
  PageBean pb = null;
  EmployeeDao employeeDao = new EmployeeDao();
  if(action == null || actionequals(null)){
   int totalRows = employeeDaogetTotalRows();
  
    pb = new PageBean(totalRows);
    sessionremoveAttribute(page);
    queryString = employeeFormgetQueryString();
    queryCon = employeeFormgetQueryCon();
    sessionsetAttribute(queryStringqueryString);
    sessionsetAttribute(queryConqueryCon);   
    list = employeeDaogetAllEmployee(queryString queryCon
      StringvalueOf(pbgetPageStartRow())
      StringvalueOf(pbgetPageRecorders()));
       
  }else if(actionequals(nextPage)){
   queryString = (String)sessiongetAttribute(queryString);
   queryCon = (String)sessiongetAttribute(queryCon);      
   employeeFormsetQueryString(queryString);
   employeeFormsetQueryCon(queryCon);
   pb = (PageBean)sessiongetAttribute(page);
   pbnextPage();
   list = employeeDaogetAllEmployee(queryString queryCon
     StringvalueOf(pbgetPageStartRow())
     StringvalueOf(pbgetPageRecorders()));
  }else if(actionequals(previousPage)){
   queryString = (String)sessiongetAttribute(queryString);
   queryCon = (String)sessiongetAttribute(queryCon);
   employeeFormsetQueryString(queryString);
   employeeFormsetQueryCon(queryCon);
   pb = (PageBean)sessiongetAttribute(page);   
   pbpreviousPage();
   list = employeeDaogetAllEmployee(queryString queryCon
     StringvalueOf(pbgetPageStartRow())
     StringvalueOf(pbgetPageRecorders()));
  }
        
        pbdescription();
        sessionsetAttribute(pagepb);        
  requestsetAttribute(admin admin);
  requestsetAttribute(employee list);
  return mappingfindForward(showlist);
  然後在數據庫查詢中有如下代碼
/**
*查詢總記錄數
*/
 public int getTotalRows() {
  int totalRows = ;
  String sql = select count(*) from employee;//假設是員工表
  Database db = new Database();
  ResultSet rs = dbexecuteQuery(sql);
  try {
   while (rsnext()) {
    String id = (String) rsgetString();
    totalRows = IntegerparseInt(id);
   }
  } catch (SQLException e) {
   eprintStackTrace();
  }
  dbclose();
  return totalRows;
 }
 
/*
*查詢每一頁需要查詢的頁碼
*/
public List getAllEmployee(String queryString String queryConString startRowString num) {
  List list = new ArrayList();
  String sql = null;
  if (queryString == null || queryStringequals()) {
   sql = select * from employeedept  +
     where deptId = employeedeptId  +
     order by employeeid asc limit +startRow++num;
  } else {
   sql = select * from employeedept  +
     where deptId = employeedeptId order by employee
     + queryString +   + queryCon +  limit +startRow++num;
  }
  Employee employee = null;
  Database db = new Database();
  ResultSet rs = dbexecuteQuery(sql);
  try {
   while (rsnext()) {
    String id = (String) rsgetString(employeeid);
    String name = (String) rsgetString(employeename);
    String deptId = (String) rsgetString(employeedeptId);
    String deptName = (String) rsgetString(deptdeptName);
    employee = new Employee();
    employeesetId(id);
    employeesetName(name);
    employeesetDeptId(deptId);
    employeesetDeptName(deptName);
    listadd(employee);
   }
  } catch (SQLException e) {
   eprintStackTrace();
  }
  dbclose();
  return list;
 }
這裡我用了hibernate進行數據庫操作你也可以用jdbc進行操作情況類似

  二根據總的頁數當前頁
這樣的話構造函數應該寫成:
public PageBean(int totalRowsint currentPage) {
  thistotalRows = totalRows;
  thiscurrentPage = currentPage;
  if(currentPage < )
   hasPreviousPage = false;
  else
   hasPreviousPage = true;
  if ((totalRows % pageRecorders) == ) {
   totalPages = totalRows / pageRecorders;
  } else {
   totalPages = totalRows / pageRecorders + ;
  }
  if (currentPage < totalPages) {
   hasNextPage = true;
   nextPage = currentPage + ;
   pageStartRow = (currentPage  )*pageRecorders;
   thispageEndRow = pageStartRow + pageRecorders;
  } else if(currentPage == totalPages){
   pageStartRow = (currentPage  )*pageRecorders;
   thispageEndRow = totalRows;
   hasNextPage = false;
   nextPage = currentPage;
  }
  if(currentPage < ){
   previousPage = currentPage;
   hasPreviousPage = false;
  }else if(currentPage > ){
   previousPage = currentPage;
   hasPreviousPage = true;
  } 
 }

在action中應該寫成
if(currentPage == null){
    pb = new PageBean(totalRows);
    sessionremoveAttribute(page);
    queryString = employeeFormgetQueryString();
    queryCon = employeeFormgetQueryCon();
    sessionsetAttribute(queryStringqueryString);
    sessionsetAttribute(queryConqueryCon);   
    list = employeeDaogetAllEmployee(queryString queryCon
      StringvalueOf(pbgetPageStartRow())
      StringvalueOf(pbgetPageRecorders()));
    }
   else{
    pb = new PageBean(totalRowsIntegerparseInt(currentPage));
    queryString = employeeFormgetQueryString();
    queryCon = employeeFormgetQueryCon();
    sessionsetAttribute(queryStringqueryString);
    sessionsetAttribute(queryConqueryCon);   
    list = employeeDaogetAllEmployee(queryString queryCon
      StringvalueOf(pbgetPageStartRow())
      StringvalueOf(pbgetPageRecorders()));
   }
  sessionsetAttribute(pagepb);        
  requestsetAttribute(admin admin);
  requestsetAttribute(employee list);
  return mappingfindForward(showlist);

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



    盡管洋洋灑灑貼了一部分代碼不過好像不太想看包括我也比較討厭看一些煩瑣的代碼所以如果你想要源代碼進行探討研究的話歡迎隨時找我那就總結一下這兩種方法吧
首先這兩種方法都是取需要顯示的數據顯示這樣在數據庫龐大的情況下比一次性把所有數據都取出來的效率要高
    第一種方法是把PageBean存在了一個HttpSession中在進入到顯示列表的時候就進行了初始化在jsp頁面傳遞的參數action是固定的三個值:nullnextPagepreviousPage這樣雖然比較容易理解但是我發現一個BUG就是如果你按刷新他也會翻頁因為他的url就是 do?aciton=nextPage這樣的話你傳進去的action還是有一個值這樣就會導致翻頁
    第二種方法是考慮了第一種方法的BUG在jsp頁面傳遞的參數currentPage的值是bean中的nextPage的值或者previousPage裡的值用了struts標簽庫嵌套把值賦予currentPage這樣的話currentPage的值是totalPages之間這樣的話你即使按刷新按鈕他也是當前頁因為他的url就是do?currentPage=someNumber(someNumber是到totalPages中的一個值)但是這樣的話Pagebean在每次訪問的時候都要重新生成一個對象該對象也是根據totalRows(總數據數)currentPage(當前頁數)進行構造從而設置其他的一些屬性個人比較推薦第二種方法


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28793.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.