转载

重构Struts2 JSP分页

前两天的Struts2 JSP分页由于过于关注框架实现,导致结构比较混乱。经过一些改动,再次发布。

环境是JDK1.6+mysql5.0+jboss4.0+struts 2.0.11

已经实现上一版没实现的功能。

首先来看UML图,为了简洁性,其中的setter & getter并没有标出。

重构Struts2 JSP分页

  1. public classShowActionextendsActionSupport{  
  2. privateintcurrentPage = 1;  
  3. privateinttotalPages;  
  4. privatebooleanhasNext =false;  
  5. privatebooleanhasPre = false;  
  6. private ArrayList pageContentList;  
  7. private ArrayList<PageIndex> indexList  
  8. private PageRetrieval pr;  
  9. public String execute(){  
  10. init();  
  11. returnSUCCESS;  
  12. }     
  13. privatevoid init(){  
  14. pr = new PageRetrieval(currentPage);  
  15. setPageContentList(pr.getPageContentList());  
  16. setndexList(pr.getIndexList());  
  17. setHasNext(pr.getHasNext());  
  18. setHasPre(pr.getHasPre());  
  19. setTotalPages(pr.getTotalPages());  
  20. }  
  21. //other getters and setters  
  22. }  
  23. publicclass PageRetrieval {  
  24. private PageInformation pi;  
  25. public PageRetrieval(int currentPage){  
  26. pi = new PageInformationFactory().create(currentPage);  
  27.  }  
  28. publicint getTotalPages(){  
  29. returnpi.getPti().getTotalPages();  
  30. //other getters and setters  
  31. }  
  32. publicclass PageInformationFactory {  
  33. private DatabaseServices dataServ;  
  34. public PageInformationFactory(){  
  35. dataServ = MyDatabaseServices.getInstance();  
  36. }  
  37. public PageInformation create(int currentPage){  
  38. PageInformation pi = new PageInformation();  
  39. PageTotalInfo pti = getNewPageTotalInfo();          
  40. pi.setPti(pti);  
  41. if(currentPage < pti.getTotalPages()){  
  42.    pi.setHasNext(true);  
  43. }  
  44.  if(currentPage !=1){  
  45.   pi.setHasPre(true);  
  46.    }   
  47. pi.setPageContentList(((MyDatabaseServices)dataServ).getPageContent(currentPage, pti.getPageSize()));  
  48. ArrayList<PageIndex> indexTemp = getIndexList(currentPage,pti.getTotalPages());  
  49. pi.setIndexList(indexTemp);  
  50.   return pi;  
  51.  }  
  52. private PageTotalInfo getNewPageTotalInfo(){  
  53. int pageSize = 20;  
  54. int totalRows = ((MyDatabaseServices)dataServ).getRowCount();  
  55. int totalPages = (totalRows + pageSize-1)/pageSize;  
  56.  returnnew PageTotalInfo(pageSize,totalPages,totalRows);  
  57.  }  
  58. private ArrayList<PageIndex> getIndexList(int currentPage,int totalPages){  
  59.    int up = 0;  
  60.    if((currentPage+20)<=totalPages){  
  61.    up = currentPage+20;  
  62.   }  
  63.    else {up = totalPages+1;}  
  64. ArayList<PageIndex> result = new ArrayList<PageIndex>();  
  65. for(int i=currentPage ;i<up; i++){  
  66. PageIndex temp = new PageIndex(i);  
  67.  result.add(temp);  
  68.    }  
  69.     return result;  
  70.        }  
  71. }  
  72. publicclass PageInformation {  
  73. privateintcurrentPage;  
  74. privatebooleanhasNext = false;  
  75. privatebooleanhasPre = false;  
  76. private ArrayList pageContentList;  
  77. private ArrayList<PageIndex> indexList;  
  78. private PageTotalInfo pti;  
  79. //other getters and setters  
  80. }  
  81. publicclass MyDatabaseServices implements DatabaseServices{  
  82. private DataSource ds;  
  83. private InitialContext ic;  
  84. private Connection conn;  
  85. private PreparedStatement ps;  
  86. private ResultSet rs;  
  87. privatestatic MyDatabaseServices dgs = new MyDatabaseServices();  
  88. private MyDatabaseServices(){//use singleton pattern, so the constructor is private  
  89. try{  
  90. ic = new InitialContext ();  
  91. ds = (DataSource)ic.lookup("java:jdbc/jsp");//get database source  
  92.   }catch(NamingException e){  
  93.    e.printStackTrace();  
  94.   }  
  95. }  
  96. public Connection getConnection(){  
  97.   try{  
  98.     returnds.getConnection();  
  99. }catch(SQLException e){  
  100. e.printStackTrace();  
  101. }  
  102. returnnull;  
  103. }  
  104. public void closeConnection(ResultSet rs,PreparedStatement ps,Connection conn){  
  105.    try{  
  106.    if(rs!=null){  
  107.         rs.close();  
  108.    }  
  109.  if(ps!=null){  
  110.      ps.close();  
  111.     }  
  112.       if(conn!=null){  
  113.     conn.close();  
  114.  }  
  115. }catch(SQLException e ){  
  116. e.printStackTrace();  
  117. }  
  118. }  
  119. public ArrayList<User> getPageContent(int currentPage,int pageSize){  
  120.  ArrayList<User> list=new ArrayList<User>();  
  121.  conn = getConnection();  
  122.  try{  
  123. ps = conn.prepareStatement("SELECT * FROM jsptest LIMIT ?,?");  
  124.  int temp = (currentPage-1)*20;  
  125.   ps.setInt(1, temp);  
  126.    ps.setInt(2, pageSize);  
  127.    rs = ps.executeQuery();  
  128.     while (rs.next()){  
  129.       User user = new User();  
  130.       user.setId(rs.getString(1));  
  131.       user.setName(rs.getString(2));  
  132.       list.add(user);  
  133.     }  
  134.    return list;  
  135. }catch(SQLException e){  
  136.    e.printStackTrace();  
  137. }finally{  
  138.   dgs.closeConnection(rs, ps, conn);  
  139. }  
  140. returnnull;  
  141. }  
  142. publicint getRowCount(){  
  143.   conn = getConnection();  
  144. try{  
  145. ps = conn.prepareStatement("SELECT * FROM jsptest");  
  146. rs = ps.executeQuery();  
  147. rs.last();  
  148. int result = rs.getRow();  
  149. rs.first();  
  150. return result;  
  151. }catch(SQLException e){  
  152.     e.printStackTrace();  
  153. }finally{  
  154.     dgs.closeConnection(rs, ps, conn);  
  155. }  
  156. return 0;  
  157. }  
  158. publicstaticsynchronized MyDatabaseServices getInstance()//get the sigleton instance  
  159. {  
  160.    if(null==dgs){  
  161.        dgsnew MyDatabaseServices();  
  162.        }   
  163.    returndgs;  
  164. }  
 

PageIndex 和PageTotalInfo 只要对照UML图加上set和get方法就可以了。

代码可能有点乱,对照UML图看吧。

如果要重用,只要改变Struts2 JSP页面,以及下面的MyDatabaseServices的具体实现,还有就是把USER替换成你需要显示的数据。

最后以下是JSP页面代码。

  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
  2.     pageEncoding="ISO-8859-1"%> 
  3. <%@ taglib prefix="s" uri="/struts-tags" %> 
  4. <html> 
  5. <head> 
  6. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
  7. <title>Insert title here</title> 
  8. </head> 
  9. <body> 
  10. <s:form action="ShowAction" method="GET"> 
  11.    <h1>Welcome</h1><BR> 
  12.    <h1>CurrentPage <s:property value="currentPage"/></h1>
  13.    <!--show items of this page--> 
  14.    <s:iterator value="pageContentList" status="status"> 
  15.         <s:property value="id"/> 
  16.         <s:property value="name"/> 
  17.         <BR> 
  18.    </s:iterator>              
  19.    <!--define the url of the previous page and next page--> 
  20.      <s:url id="url_pre" value="ShowAction.action"> 
  21.          <s:param name="currentPage" value="currentPage-1"></s:param> 
  22.      </s:url> 
  23.      <s:url id="url_next" value="ShowAction.action"> 
  24.          <s:param name="currentPage" value="currentPage+1"></s:param> 
  25.      </s:url> 
  26.      <s:url id="url_first" value="ShowAction.action"> 
  27.          <s:param name="currentPage" value="1"></s:param> 
  28.      </s:url>   
  29.      <s:url id="url_last" value="ShowAction.action"> 
  30.          <s:param name="currentPage" value="totalPages"></s:param> 
  31.      </s:url> 
  32.         <!-- use url defined above --> 
  33.    <s:a href ="%{url_first}">First Page</s:a> 
  34.    <s:if test="hasPre">      
  35.    <s:a href="%{url_pre}">Pre</s:a> 
  36.    </s:if> 
  37.    <s:iterator value="indexList" status="status"> 
  38.       <s:url id="url" value="ShowAction.action"> 
  39.       <!-- pass the currentPage parameter --> 
  40.          <s:param name="currentPage" value="indexNumber"></s:param> 
  41.       </s:url> 
  42.       <s:a href="%{url}"><s:property value="indexNumber"/>&nbsp</s:a> 
  43.    </s:iterator> 
  44.    <s:if test="hasNext"> 
  45.    <s:a href="%{url_next}">Next</s:a> 
  46.    </s:if> 
  47.       <s:a href ="%{url_last}">Last Page</s:a> 
  48. </s:form>    
  49. </body> 
  50. </html> 

以上是Struts2 JSP分页可能还有不尽人意之处,大家多多指点,一起进步。

正文到此结束
Loading...