空间站

北极心空

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

解决Struts分页显示

学习Struts已经有2个多月了,前几天群里的朋友问我Struts分页显示的问题,觉得好像与在jsp中的差不多,但还是遇到了这样那样的问题,好不容易花了几天时间把问题都搞清楚,觉得还是写点东西跟大家分享一下的好!
至于Struts的语法这里就不多介绍了,不懂的朋友可以先看网上的其他文章。

一 开发环境
Elicpse+Struts Studio+SqlServer2000+Tomcat。

二 开发思路
既然讲的是Struts,那自然离不了MVC,分页显示也是如此。

1 建立适当的模型组件,对应你要查询数据库中的表。这部分由我们熟悉的javaBean来充当。并在其中建立数据库查询方法,该方法需要一个java.sql.Conntection类型的参数,并返回一个ArrayList。在本例中为 Book.java

2 建立分页所需要的模型组件,也是由javaBean来充当,通过由Book中提供的ArrayList来构造。本例中为 PageBean.java.。

3建立控制器组件,这部分由Struts 中的Action来实现。主要负责将实例化Book,并利用返回的ArrayList对象,构造PageBean。以及接收由视图传递而来的action参数。从而在PageBean对象中调用不同的方法,该方法返回Book[] 对象。最后将 Book[]和PageBean放入request中。本例中为PageListAction.java。

4建立视图组件,这部分由jsp来充当,为了不出现java 代码,我们使用Struts提供的标签库,主要负责从request中取出刚刚放入的对象,通过反复调用PageListAction以及action参数,而实现分页显示。本例中为pagetest.jsp.
5 建立并配置struts-config.xml。
6 建立数据库。

三 实例代码
1 Book.java

package bean; 
import java.sql.*
import java.util.ArrayList; 
/** 
 * @作者 李敏强 
 * Struts分页显示数据Bean,对应数据库中Book表 
 
*/ 
public class Book { 
 
private String bookname; //书名 
 private String author;   //作者 
 private String price;    //价格 
  
public Book(String name,String author,String price){ 
 
this.bookname=name; 
 
this.author=author; 
 
this.price=price; 


 
public String getAuthor() { 
  
return author; 
 } 

 
public void setAuthor(String author) { 
  
this.author = author; 
 } 

 
public String getBookname() { 
  
return bookname; 
 } 

 
public void setBookname(String bookname) { 
  
this.bookname = bookname; 
 } 
  
 
public String getPrice(){ 
     
return this.price;  
 } 
  
 
public void setPrice(String price){ 
     
this.price=price;  
 } 
  
 
public static ArrayList getAllBook(Connection connection){ 
   String sql
="select * from book"
   ArrayList arrayList 
= new ArrayList(); 
   
try
   Statement statement 
= connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 
   ResultSet resultSet 
= statement.executeQuery(sql);   
         System.out.println(
"BookBean 数据查询已完成!"); 
      
while(resultSet.next()) 
      {   
        String name 
= resultSet.getString("name"); 
        String author 
= resultSet.getString("author"); 
        String price 
= resultSet.getString("price"); 
        System.out.println(
"开始数据封装:name="+name+"author="+author+"price="+price); 
        Book book 
= new Book(name,author,price);        
        arrayList.add(book); 
      } 
    connection.close(); 
    resultSet.close(); 
   }
catch(SQLException e) 
   { 
    System.out.println(
"数据库异常"+e.toString()); 
   } 

      
return arrayList; 
 } 

2 PageBean.java

package page; 
import bean.Book; 
import java.util.*
/** 
 * @作者 李敏强 
 * Struts分页显示逻辑Bean 
 
*/ 
public class PageBean { 

 
int currentPage=1;  //当前页 
public int totalPages=0;  //总页数 
 int pageRecorders=5;//每页5条数据 
 int totalRows=0;  //总数据数 
 int pageStartRow=0;//每页的起始数 
 int pageEndRow=0;  //每页显示数据的终止数 
 boolean hasNextPage=false//是否有下一页 
 boolean hasPreviousPage=false//是否有前一页 
 ArrayList arrayList; 
 Iterator it; 
public PageBean(){} 
  
public PageBean(ArrayList arrayList){ 
 
this.arrayList=arrayList;  
 totalRows
=arrayList.size();   
    it
=arrayList.iterator();   
 hasPreviousPage
=false
 currentPage
=1
 
if((totalRows%pageRecorders)==0
 { 
 totalPages
=totalRows/pageRecorders;   
 } 
 
else 
 { 
  totalPages
=totalRows/pageRecorders+1;  
 }  
  
 
if(currentPage>=totalPages)   
 { 
  hasNextPage
=false;  
 } 
 
else                         
 { 
  hasNextPage
=true
 } 

     
    
if(totalRows<pageRecorders)  
    { 
    
this.pageStartRow=0;            
    
this.pageEndRow=totalRows;    
    } 
    
else                        
    { 
    
this.pageStartRow=0;          
    
this.pageEndRow=pageRecorders;    
    } 



 
/** 
  * 
@return Returns the currentPage. 
  
*/ 
 
public String getCurrentPage() { 
  
return this.toString(currentPage); 
 } 
 
/** 
  * 
@param currentPage The currentPage to set. 
  
*/ 
 
public void setCurrentPage(int currentPage) { 
  
this.currentPage = currentPage; 
 } 
 
/** 
  * 
@return Returns the pageRecorders. 
  
*/ 
 
public int getPageRecorders() { 
  
return pageRecorders; 
 } 
 
/** 
  * 
@param pageRecorders The pageRecorders to set. 
  
*/ 
 
public void setPageRecorders(int pageRecorders) { 
  
this.pageRecorders = pageRecorders; 
 } 
 
/** 
  * 
@return Returns the pageEndRow. 
  
*/ 
 
public int getPageEndRow() { 
  
return pageEndRow; 
 } 
 
/** 
  * 
@return Returns the pageStartRow. 
  
*/ 
 
public int getPageStartRow() { 
  
return pageStartRow; 
 } 
 
/** 
  * 
@return Returns the totalPages. 
  
*/ 
 
public String getTotalPages() { 
  
  
return this.toString(totalPages); 
 } 
 
/** 
  * 
@return Returns the totalRows. 
  
*/ 
 
public String getTotalRows() { 
  
return this.toString(totalRows); 
 } 
 
/** 
  * 
@return Returns the hasNextPage. 
  
*/ 
 
public boolean isHasNextPage() { 
  
return hasNextPage; 
 } 
 
/** 
  * 
@param hasNextPage The hasNextPage to set. 
  
*/ 
 
public void setHasNextPage(boolean hasNextPage) { 
  
this.hasNextPage = hasNextPage; 
 } 
 
/** 
  * 
@return Returns the hasPreviousPage. 
  
*/ 
 
public boolean isHasPreviousPage() { 
  
return hasPreviousPage; 
 } 
 
/** 
  * 
@param hasPreviousPage The hasPreviousPage to set. 
  
*/ 
 
public void setHasPreviousPage(boolean hasPreviousPage) { 
  
this.hasPreviousPage = hasPreviousPage; 
 } 
public Book[] getNextPage(){ 
  
 currentPage
=currentPage+1
 System.out.println(
"PageBean.getNextPage()正在执行;"); 
 System.out.println(
"参数currentPage="+currentPage); 

 
if((currentPage-1)>0
 { 
  hasPreviousPage
=true;  
 } 
    
else 
    { 
     hasPreviousPage
=false;  
    } 
  
 
if(currentPage>=totalPages)  
 { 
  hasNextPage
=false;  
 } 
 
else 
 { 
  hasNextPage
=true
 } 
 System.out.println(
"参数hasNextPage="+hasNextPage); 
 System.out.println(
"准备执行PageBean.getBooks()"); 
 Book[] books
=getBooks(); 
 
this.description(); 
  
 
return books; 


public Book[] getPreviouspage(){ 
  
 currentPage
=currentPage-1

    
if(currentPage==0){currentPage=1;} 
  
 
if(currentPage>=totalPages)   
 { 
  hasNextPage
=false;  
 } 
 
else                          
 { 
  hasNextPage
=true
 } 
 
if((currentPage-1)>0
 { 
  hasPreviousPage
=true;  
 } 
    
else 
    { 
     hasPreviousPage
=false;  
    } 
 Book[] books
=getBooks(); 
 
this.description(); 
 
return books; 


public Book[] getBooks(){ 
 System.out.println(
"pageBean.getBooks()开始执行;"); 
  
  
 
if(currentPage*pageRecorders<totalRows){//判断是否为最后一页 
  pageEndRow=currentPage*pageRecorders; 
     pageStartRow
=pageEndRow-pageRecorders; 
 } 
 
else
  pageEndRow
=totalRows; 
  pageStartRow
=pageRecorders*(totalPages-1); 
 } 
 Book[] books
=new Book[pageEndRow-pageStartRow+1]; 
  
 System.out.println(
"pageStartRow="+pageStartRow); 
 System.out.println(
"pageEndRow="+pageEndRow); 
  
int j=0;  
 
for(int i=pageStartRow;i<pageEndRow;i++
 { 
  
  Book book
=(Book)arrayList.get(i);  
  books[j
++]=book; 
  
 } 
 System.out.println(
"要显示的页面数据已经封装,具体信息如下:"); 
 
this.description(); 
 
return books; 


public String toString(int temp) 

String str
=Integer.toString(temp); 
return str; 


public void description() 


   String description
="共有数据数:"+this.getTotalRows()+ 

   
"共有页数: "+this.getTotalPages() + 

   
"当前页数为:"+this.getCurrentPage()+ 
    
   
" 是否有前一页: "+this.isHasPreviousPage() + 

   
" 是否有下一页:"+this.isHasNextPage()+ 

   
" 开始行数:"+this.getPageStartRow()+ 

   
" 终止行数:"+this.getPageEndRow(); 

   System.out.println(description); 



3  PageListAction.java
package page; 
import org.apache.struts.action.*
import javax.servlet.http.*
import comm.Constants; 

import bean.Book; 
import java.util.*
import javax.sql.DataSource; 
/** 
 * 
@author 李敏强 
 * Struts分页显示Action 
 
*/ 
public class PageListAction extends Action { 

 
public PageListAction(){} 
 ArrayList arrayList
=new ArrayList(); 
    PageBean pb; 
  
 
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {    
String action;  
action
=request.getParameter("action");    
if(action==null || action.equals("null")){ //第一次读取数据 
try
DataSource datasource
=this.getDataSource(request,Constants.DATASOURCE_KEY);     
arrayList
=Book.getAllBook(datasource.getConnection()); 
System.out.println(
"第一步,数据已经成功传递到Action,action="+action); 
   }
catch(Exception e){ 
          e.printStackTrace(); 
  System.out.println(
"数据库连接出现异常"); 
      }  
    
     pb
=new PageBean(arrayList); 
          Book[] books
=pb.getBooks(); 
          pb.description(); 
          request.setAttribute(
"result",books); 
          request.setAttribute(
"page",pb); 
                    
   } 
   
else 
   { 
  
if(action=="nextPage" || action.equals("nextPage")) 
  { 
  System.out.println(
"参数action="+action); 
  System.out.println(
"函数pb.getNextPage()准备执行"); 
  Book[]books
=pb.getNextPage(); 
  request.setAttribute(
"page",pb); 
 request.setAttribute(
"result",books);    
    } 
if(action=="previousPage" || action.equals("previousPage")) 
  { 
  System.out.println(
"参数action="+action); 
  System.out.println(
"函数pb.getPreviouspage()准备执行"); 
  Book[] books
=pb.getPreviouspage();   
  request.setAttribute(
"page",pb); 
               request.setAttribute(
"result",books); 
     
    } 
   } 
   
return (mapping.findForward("success")); 
  }  

4 pagetest.jsp
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> 
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> 
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> 
<%@ page contentType="text/html; charset=gb2312" language="java"%> 

<html:html locale="true"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
</head> 
<body> 

<table border="1"> 
<tr><th>书名</th><th>作者</th><th>价格</th></tr> 
<logic:present name="result"> 
<logic:iterate id="book" name="result"  type="bean.Book" > 
<logic:present name="book"> 
<tr> 
 
<td><bean:write name="book" property="bookname" /></td> 
 
<td> <bean:write name="book" property="author" /></td> 
 
<td><bean:write name="book" property="price" /></td> 
</tr> 
</logic:present> 
</logic:iterate> 
</logic:present> 
</table> 
<logic:equal name="page" property="hasNextPage" value="true"> 
<html:link page="/page.do?action=nextPage">nextPage</html:link>  
</logic:equal> 
<logic:equal name="page" property="hasPreviousPage" value="true"> 
<html:link page="/page.do?action=previousPage">PreviousPage</html:link> 
</logic:equal> 
共有数据总数
<bean:write name="page" property="totalRows"/>
共分
<bean:write name="page" property="totalPages"/>页,当前是第 
<bean:write name="page" property="currentPage"/>页 
</body> 
</html:html> 

5 struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> 

<!DOCTYPE struts-config PUBLIC 
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" 
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd";
> 

<struts-config> 
 
<data-sources> 
  
<data-source key="dataSource" type="org.apache.commons.dbcp.BasicDataSource"> 
   
<set-property property="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/> 
   
<set-property property="url" value="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=eBookStore;SelectMethod=cursor"/> 
   
<set-property property="username" value="limq"/> 
   
<set-property property="password" value="1"/> 
   
<set-property property="maxActive" value="10"/> 
   
<set-property property="maxWait" value="5000"/> 
   
<set-property property="defaultAutoCommit" value="true"/> 
   
<set-property property="defaultReadOnly" value="false"/> 
  
</data-source> 
 
</data-sources> 
  
<form-beans> 
  
</form-beans> 
  
<global-forwards> 
  
</global-forwards> 
  
<action-mappings> 
  
<action path="/page" type="page.PageListAction" scope="request"> 
  
<forward name="success" path="/pagetest.jsp"/> 
  
</action> 
  
</action-mappings> 
  
<controller> 
  
</controller> 
</struts-config> 
6 建立eBookStore数据库,以及表book(name,author,parce);其中数据的配置可以根据你的不同情况在struts-config.xml中而定。

7 Constants.java 
package comm; 

/** 
 * this interface provides the constant string for applicator constant 
 
*/ 
public class Constants { 
  
/** 
    * name of the User Object in HttpSession 
    
*/ 
   
public static String USER_KEY="user"
   
/** 
    * dataSource name 
    
*/ 
   
public static String DATASOURCE_KEY="dataSource"

posted on 2006-11-02 14:26 芦苇 阅读(372) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: