前两天的Struts2 JSP分页由于过于关注框架实现,导致结构比较混乱。经过一些改动,再次发布。
环境是JDK1.6+mysql5.0+jboss4.0+struts 2.0.11
已经实现上一版没实现的功能。
首先来看UML图,为了简洁性,其中的setter & getter并没有标出。
public classShowActionextendsActionSupport{
privateintcurrentPage = 1;
privateinttotalPages;
privatebooleanhasNext =false;
privatebooleanhasPre = false;
private ArrayList pageContentList;
private ArrayList<PageIndex> indexList
private PageRetrieval pr;
public String execute(){
init();
returnSUCCESS;
}
privatevoid init(){
pr = new PageRetrieval(currentPage);
setPageContentList(pr.getPageContentList());
setndexList(pr.getIndexList());
setHasNext(pr.getHasNext());
setHasPre(pr.getHasPre());
setTotalPages(pr.getTotalPages());
}
//other getters and setters
}
publicclass PageRetrieval {
private PageInformation pi;
public PageRetrieval(int currentPage){
pi = new PageInformationFactory().create(currentPage);
}
publicint getTotalPages(){
returnpi.getPti().getTotalPages();
//other getters and setters
}
publicclass PageInformationFactory {
private DatabaseServices dataServ;
public PageInformationFactory(){
dataServ = MyDatabaseServices.getInstance();
}
public PageInformation create(int currentPage){
PageInformation pi = new PageInformation();
PageTotalInfo pti = getNewPageTotalInfo();
pi.setPti(pti);
if(currentPage < pti.getTotalPages()){
pi.setHasNext(true);
}
if(currentPage !=1){
pi.setHasPre(true);
}
pi.setPageContentList(((MyDatabaseServices)dataServ).getPageContent(currentPage, pti.getPageSize()));
ArrayList<PageIndex> indexTemp = getIndexList(currentPage,pti.getTotalPages());
pi.setIndexList(indexTemp);
return pi;
}
private PageTotalInfo getNewPageTotalInfo(){
int pageSize = 20;
int totalRows = ((MyDatabaseServices)dataServ).getRowCount();
int totalPages = (totalRows + pageSize-1)/pageSize;
returnnew PageTotalInfo(pageSize,totalPages,totalRows);
}
private ArrayList<PageIndex> getIndexList(int currentPage,int totalPages){
int up = 0;
if((currentPage+20)<=totalPages){
up = currentPage+20;
}
else {up = totalPages+1;}
ArayList<PageIndex> result = new ArrayList<PageIndex>();
for(int i=currentPage ;i<up; i++){
PageIndex temp = new PageIndex(i);
result.add(temp);
}
return result;
}
}
publicclass PageInformation {
privateintcurrentPage;
privatebooleanhasNext = false;
privatebooleanhasPre = false;
private ArrayList pageContentList;
private ArrayList<PageIndex> indexList;
private PageTotalInfo pti;
//other getters and setters
}
publicclass MyDatabaseServices implements DatabaseServices{
private DataSource ds;
private InitialContext ic;
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
privatestatic MyDatabaseServices dgs = new MyDatabaseServices();
private MyDatabaseServices(){//use singleton pattern, so the constructor is private
try{
ic = new InitialContext ();
ds = (DataSource)ic.lookup("java:jdbc/jsp");//get database source
}catch(NamingException e){
e.printStackTrace();
}
}
public Connection getConnection(){
try{
returnds.getConnection();
}catch(SQLException e){
e.printStackTrace();
}
returnnull;
}
public void closeConnection(ResultSet rs,PreparedStatement ps,Connection conn){
try{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException e ){
e.printStackTrace();
}
}
public ArrayList<User> getPageContent(int currentPage,int pageSize){
ArrayList<User> list=new ArrayList<User>();
conn = getConnection();
try{
ps = conn.prepareStatement("SELECT * FROM jsptest LIMIT ?,?");
int temp = (currentPage-1)*20;
ps.setInt(1, temp);
ps.setInt(2, pageSize);
rs = ps.executeQuery();
while (rs.next()){
User user = new User();
user.setId(rs.getString(1));
user.setName(rs.getString(2));
list.add(user);
}
return list;
}catch(SQLException e){
e.printStackTrace();
}finally{
dgs.closeConnection(rs, ps, conn);
}
returnnull;
}
publicint getRowCount(){
conn = getConnection();
try{
ps = conn.prepareStatement("SELECT * FROM jsptest");
rs = ps.executeQuery();
rs.last();
int result = rs.getRow();
rs.first();
return result;
}catch(SQLException e){
e.printStackTrace();
}finally{
dgs.closeConnection(rs, ps, conn);
}
return 0;
}
publicstaticsynchronized MyDatabaseServices getInstance()//get the sigleton instance
{
if(null==dgs){
dgs= new MyDatabaseServices();
}
returndgs;
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 1.
PageIndex 和PageTotalInfo 只要对照UML图加上set和get方法就可以了。
代码可能有点乱,对照UML图看吧。
如果要重用,只要改变Struts2 JSP页面,以及下面的MyDatabaseServices的具体实现,还有就是把USER替换成你需要显示的数据。
最后以下是JSP页面代码。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<s:form action="ShowAction" method="GET">
<h1>Welcome</h1><BR>
<h1>CurrentPage <s:property value="currentPage"/></h1>
<!--show items of this page-->
<s:iterator value="pageContentList" status="status">
<s:property value="id"/>
<s:property value="name"/>
<BR>
</s:iterator>
<!--define the url of the previous page and next page-->
<s:url id="url_pre" value="ShowAction.action">
<s:param name="currentPage" value="currentPage-1"></s:param>
</s:url>
<s:url id="url_next" value="ShowAction.action">
<s:param name="currentPage" value="currentPage+1"></s:param>
</s:url>
<s:url id="url_first" value="ShowAction.action">
<s:param name="currentPage" value="1"></s:param>
</s:url>
<s:url id="url_last" value="ShowAction.action">
<s:param name="currentPage" value="totalPages"></s:param>
</s:url>
<!-- use url defined above -->
<s:a href ="%{url_first}">First Page</s:a>
<s:if test="hasPre">
<s:a href="%{url_pre}">Pre</s:a>
</s:if>
<s:iterator value="indexList" status="status">
<s:url id="url" value="ShowAction.action">
<!-- pass the currentPage parameter -->
<s:param name="currentPage" value="indexNumber"></s:param>
</s:url>
<s:a href="%{url}"><s:property value="indexNumber"/> </s:a>
</s:iterator>
<s:if test="hasNext">
<s:a href="%{url_next}">Next</s:a>
</s:if>
<s:a href ="%{url_last}">Last Page</s:a>
</s:form>
</body>
</html>
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
以上是Struts2 JSP分页可能还有不尽人意之处,大家多多指点,一起进步。
【编辑推荐】