Struts 数据分页讲解与代码实例

本文介绍了一种基于Struts框架的数据分页实现方法。通过自定义数据Bean与PageController类,实现了从数据库查询数据并进行分页显示的功能。具体包括数据Bean的封装、PageController的逻辑处理以及Struts Action中的数据传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Struts 数据分页讲解与代码实例

                                作者 杨川 www.efine66.com
重点:本分页代码重点有两个,一个是数据封装的bean ,有一个与自身段相适应的静态方法,自动实例化多个自身实例,添加到ArrayList中。二是PageController页面控制器,实例化后,有一个根据  全部数据的ArrayList 和当前页 两个参数 返回 只含有当前页要显示记录的ArrayList . 在Action中怎么写,就要看你自己了,可灵活使用。大家直接使用的是PageController这个类,这是这个程序的精华, 不知道大家能不能理解我的意思,哈哈。
1 建立与你要查询数据库中的表字段相对应的Bean。并在其中建立数据库查询方法,该方法需要一个ResultSet类型的参数,是一个静态函数,把ResultSet 中的每条记录装添到一个Bean中,然后保存到ArrayList中返回。在本例中为 XueShengBean 。
2 建立一个页面数据控制器:PageController 传入由上面返回的Arraylist ,当前页 ,返回一个只包含当前页的ArrayList
3建立控制器组件,这部分由Struts 中的Action来实现。主要负责将实例化数据Bean ,并利用返回的ArrayList对象,接收由视图传递而来的当前页参数。构造PageController,用PageController中的方法 来返回一个只包含当前页的ArrayLIst  并放到request 里,发送到视图显示。
4建立视图组件 ,使用Struts提供的标签库,主要负责从request中取出刚刚放入的对象,而实现分页显示。

 实例代码

1 数据bean

 

package  kaka;

import  java.util.ArrayList;
import  java.sql.ResultSet;
import  org.apache.struts.action.ActionMessage;
import  java.sql.SQLException;

public   class  XueShengBean {
    
private  String xingming;
    
private  String id;
    
private  String xingbie;
    
private  String beizhu;
    
private  String xuehao;

    
public  XueShengBean() {
    }

    
public   static  ArrayList getArrayList(ResultSet rs) {
        ArrayList al 
=   new  ArrayList();

        
try  {
            
while  (rs.next()) {

                XueShengBean xSB 
=   new  XueShengBean();
                xSB.setXuehao(rs.getString(
" xuehao " ));
                xSB.setXingming(rs.getString(
" xingming " ));
                xSB.setXingbie(rs.getString(
" xingbie " ));
                xSB.setBeizhu(rs.getString(
" beizhu " ));
                xSB.setId(rs.getString(
" id " ));

                al.add(xSB);

            }
        } 
catch  (SQLException ex) {
            System.out.println(ex.getMessage() 
+   " 读数据时出错 " );

        } 

            
return  al;
        
    }

    
public   void  setXingming(String xingming) {
        
this .xingming  =  xingming;
    }

    
public   void  setId(String id) {
        
this .id  =  id;
    }

    
public   void  setXingbie(String xingbie) {
        
this .xingbie  =  xingbie;
    }

    
public   void  setBeizhu(String beizhu) {
        
this .beizhu  =  beizhu;
    }

    
public   void  setXuehao(String xuehao) {
        
this .xuehao  =  xuehao;
    }

    
public  String getXingming() {
        
return  xingming;
    }

    
public  String getId() {
        
return  id;
    }

    
public  String getXingbie() {
        
return  xingbie;
    }

    
public  String getBeizhu() {
        
return  beizhu;
    }

    
public  String getXuehao() {
        
return  xuehao;
    }
}

 

2  PageController 控制器 这个是本文的重点,在此中注意这个唯一需要我们调用的方法public ArrayList getPageArrayList(ArrayList al, int cp)   在控制器被实例化后,我们只使用这个方法即可,返回一个只有当前页所需要的ArrayList,非常方便

 

package  db;

import  java.util.ArrayList;
import  java.sql.ResultSet;
import  java.util.HashMap;

/**
 * <p>Title:分页代码—页面控制 </p>
 *
 * <p>Description:struts 分页代码—页面控制 </p>
 * <p>Description:2007年2月4号凌晨写下此分页代码。 
 * 在Bean的使用上本来想用DynaBean,不过显示的时候,就不好办了。
 * 感觉数据库字段改变不是太大吧,况且一个自己写一个封装数据的Bean
 * 在程序别的地方,会省很多事。
 * 
 * </p>
 * <p>Copyright:www.efine66.com Copyright (c) 2007</p>
 *
 * <p>Company:efine </p>
 * 
@author  杨川 www.efine66.com
 * 
@version  1.0
 
*/
public   class  PageController {
    
public  PageController() {

    }


    
//////////////////////////////////////////////
     int  totalRows;  // 总行数
     int  pageSize  =   1 //
     int  currentPage  =   10 // 当前页
     int  totalPages;
    
int  nextPage;
    
int  previousPage;

    
int  pageStartRow;  // 请求记录开始位置
     int  pageEndRow;  //
     boolean  hasNext  =   true //
     boolean  hasPrevious  =   true //
     boolean  hasTop  =   true //
     boolean  hasLast  =   true //
     //////////////////////////////////////////////


    
/**
     * getPageArrayList
     * 实例化后,真接执行此函数,正确传递参数,即可完成所有设置,与页面控制
     * 返回根据分面计算得到的ArrayList
     * 
@param  al ArrayList
     * 
@param  cp int
     * 
@return  ArrayList
     
*/
    
public  ArrayList getPageArrayList(ArrayList al,  int  cp) {
        setPageController(al, cp);
        ArrayList alt 
=   new  ArrayList();
        
if  (pageStartRow  >   0 ) {
            
for  ( int  i  =  pageStartRow; i  <=  pageEndRow; i ++ ) {
                System.out.println(
" al.get  "   +  (i  -   1 ));
                alt.add(al.get(i 
-   1 ));
            }

        } 
else  {
            
return   null ;

        }

        
return  alt;

    }


    
/**
     * getPageArrayList
     * 多一条页面设置参数
     * 实例化后,真接执行此函数,正确传递参数,即可完成所有设置,与页面控制,
     * 返回根据分面计算得到的ArrayList
     * 
@param  al ArrayList
     * 
@param  cp int
     * 
@param  pageSize int
     * 
@return  ArrayList
     
*/
    
public  ArrayList getPageArrayList(ArrayList al,  int  cp,  int  pageSize) {
        setPageController(al, cp, pageSize);
        ArrayList alt 
=   new  ArrayList();
        
if  (pageStartRow  >   0 ) {
            
for  ( int  i  =  pageStartRow; i  <=  pageEndRow; i ++ ) {
                System.out.println(
" al.get  "   +  (i  -   1 ));
                alt.add(al.get(i 
-   1 ));
            }

        } 
else  {
            
return   null ;

        }

        
return  alt;

    }


    
//////////////////////////// /以下公有获取页面状态的函数 ////////////////////////
     public   int  getCurrentPage() {
        
return  currentPage;
    }

    
public   boolean  getHasNext() {
        
return  hasNext;
    }

    
public   boolean  getHasPrevious() {
        
return  hasPrevious;
    }

    
public   boolean  getHasTop() {
        
return  hasTop;
    }

    
public   boolean  getHasLast() {
        
return  hasLast;
    }

    
public   int  getNextPage() {
        
return  nextPage;
    }

    
public   int  getPreviousPage() {
        
return  previousPage;
    }

    
public   int  getTotalPages() {
        
return  totalPages;
    }


    
public  String getD() {
        String description 
=   " Total: "   +  totalRows  +
                             
"  items  "   +  totalPages  +
                             
"  pages,Current page: "   +
                             
this .currentPage  +   "  Previous  "   +
                             
this .hasPrevious  +
                             
"  Next: "   +   this .hasNext  +
                             
"  start row: "   +   this .pageStartRow  +
                             
"  end row: "   +   this .pageEndRow;
        
return  description;
    }


    
//////////////////////////// /以下私用工具函数 ////////////////////////

    
/**
     * setPageController
     * 设置本类的所有参数
     * 
@param  al ArrayList
     * 
@param  cp int
     
*/
    
private   void  setPageController(ArrayList al,  int  cp) {
        
// 以下几条程序顺序不可改变
        setTotal_Rows_Pages(al.size());  // 设置记录总数,总页数
        setCurrentPage(cp);  // 设置当前页数
        
        setPageStart_EndRow(); 
// 生成开始记录位置,结束记录位置
        set_Next_Previous_Top_Last();  // 生成 下一页 上一页 第一页 最后一页 标志

    }

    
/**
     * setPageController
     * 多一条,页面大小的设置
     * 
@param  al ArrayList
     * 
@param  cp int
     * 
@param  pageSize int
     
*/
    
private   void  setPageController(ArrayList al,  int  cp,  int  pageSize) {
        
this .pageSize  =  pageSize;
        setPageController(al, cp);

    }

    
private   void  setCurrentPage( int  i) {
        
if  (i  <   1 ) {
            i 
=   1 ;
        }
        
if  (i  >  totalPages) {
            i 
=  totalPages;
        }

        currentPage 
=  i;
        nextPage 
=  currentPage  +   1 ;
        previousPage 
=  currentPage  -   1 ;

    }

    
private   void  setTotal_Rows_Pages( int  size) {

        totalRows 
=  size;

        
if  (size  %  pageSize  ==   0 ) {
            totalPages 
=  size  /  pageSize;
        } 
else  {
            totalPages 
=  size  /  pageSize  +   1 ;
        }

    }

    
private   void  setPageStart_EndRow() {

        
if  (currentPage  *  pageSize  <=  totalRows) {
            pageEndRow 
=  currentPage  *  pageSize;
            pageStartRow 
=  pageEndRow  -  pageSize  +   1 ;
        } 
else  {
            pageEndRow 
=  totalRows;
            pageStartRow 
=  currentPage  *  pageSize  -  pageSize  +   1 ;

        }

    }

    
private   void  set_Next_Previous_Top_Last() {
        
if  (nextPage  >  totalPages) {
            hasNext 
=   false ;
        }
        
if  (previousPage  <   1 ) {
            hasPrevious 
=   false ;
        }
        
if  (currentPage  ==   1 ) {
            hasTop 
=   false ;

        }
        
if  (currentPage  ==  totalPages) {
            hasLast 
=   false ;
        }

    }


}

 

3 action 中部分代码  这个大家看一下大体的步骤就可以了,我写的这个为了大家看明白,以上的bean ,和 pagecontroller 的调用方法。具体到你的应用中时,可以灵活应用。

 

public  ActionForward execute(ActionMapping mapping, ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response) {

        DataSource dataSource 
=   null ;
        Connection conn 
=   null ;
        ActionErrors ae 
=   new  ActionErrors();
        ResultSet rs 
=   null ;
        Statement stmt 
=   null ;

       
        ArrayList v_al 
=   new  ArrayList();
        Object myObject 
=   null ;
        
int  currentPage  =   1 ;
////////////////////////////////////////////////////////////////////////////// /

        
try  {
            
// 取得数据库连接

            dataSource 
=  getDataSource(request,  " A " );

            conn 
=  dataSource.getConnection();
            stmt 
=  conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                        ResultSet.CONCUR_UPDATABLE);
            String sql 
=   " select * from QGZX_xueshengshenqing " ;
            rs 
=  stmt.executeQuery(sql);

            v_al 
=  XueShengBean.getArrayList(rs);

        } 
catch  (Exception e) {

            System.out.println(
" 获得连接出错 "   +  e.toString());
            
return  (mapping.findForward( " conniserror " ));

        } 
finally  {
            
try  {
                rs.close();
                stmt.close();
                conn.close();
            } 
catch  (SQLException ex) {
            }

        }


        
////////////////////////////////////////////////////////////////////
        currentPage  =  ut.TypeConver.stringToInt(request.getParameter(
                
" currentPage " ));

        System.out.println(
" 当前页是 "   +  currentPage);
        db.PageController pageCon 
=   new  db.PageController();
        v_al 
=  pageCon.getPageArrayList(v_al, currentPage);

        HttpSession js 
=  request.getSession();
        Integer jsVaule 
=  (Integer) js.getAttribute( " linkC " );
        
if  (jsVaule  ==   null ) {
            jsVaule 
=   new  Integer( 0 );

        } 
else  {
            jsVaule 
=   new  Integer(jsVaule.intValue()  +   1 );
        }
        js.setAttribute(
" linkC " , jsVaule);

        request.setAttribute(
" XueSheng " , v_al);
        request.setAttribute(
" pc " , pageCon);
        System.out.println(
" 设置完,开始转移到 show " );
        
return  (mapping.findForward( " show " ));

}

 

4 显示部分 ,大家一看就明白了吧,可以再美工一下。

 

< logic:present name = " pc "  scope = " request " >
        共有${pc.totalPages}页 
|
          
< logic:equal name = " pc "  property = " hasTop "  value = " true " >
            
< html:link page = " /main.do "  paramId = " currentPage "  property = " 1 " > 首页             </ html:link >
          
</ logic:equal >  
          
< logic:notEqual name = " pc "  property = " hasTop "  value = " true " >
            首页            
          
</ logic:notEqual >
         
          
|
          
< logic:equal name = " pc "  property = " hasPrevious "  value = " true " >
            
< html:link page = " /main.do "  paramId = " currentPage "  paramName = " pc "  paramProperty = " previousPage " > 上一页             </ html:link >
          
</ logic:equal >  
           
< logic:notEqual name = " pc "  property = " hasPrevious "  value = " true " >
           上一页            
          
</ logic:notEqual >  
          
          
          《《
< font color = " bule " >  ${pc.currentPage} </ font >  》》


          
< logic:equal name = " pc "  property = " hasNext "  value = " true " >
            
< html:link page = " /main.do "  paramId = " currentPage "  paramName = " pc "  paramProperty = " nextPage " > 下一页             </ html:link >
          
</ logic:equal >  
          
< logic:notEqual name = " pc "  property = " hasNext "  value = " true " >
            下一页           
          
</ logic:notEqual >  
          
          
|
          
< logic:equal name = " pc "  property = " hasLast "  value = " true " >
            
< html:link page = " /main.do "  paramId = " currentPage "  paramName = " pc "  paramProperty = " totalPages " > 尾页             </ html:link >
          
</ logic:equal >
           
< logic:notEqual name = " pc "  property = " hasLast "  value = " true " >
           尾页           
          
</ logic:notEqual >
        
</ logic:present >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值