解决Struts分页显示

来源:百度文库 编辑:神马文学网 时间:2024/04/28 08:55:18
解决Struts分页显示2006-07-16 18:13


学习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    {
    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                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        {
       
         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"%>


















书名作者价格


nextPage


PreviousPage

共有数据总数;
共分页,当前是第


5 struts-config.xml

          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "
http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">



 
  
  
  
  
  
  
  
  
 


 
 

 
 

 
 
 
 

 

 
 

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";