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

    技术2022-05-11  107

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

                                    作者 杨川 www.efine66.com重点:本分页代码重点有两个,一个是数据封装的bean ,有一个与自身段相适应的静态方法,自动实例化多个自身实例,添加到ArrayList中。二是PageController页面控制器,实例化后,有一个根据  全部数据的ArrayList 和当前页 两个参数 返回 只含有当前页要显示记录的ArrayList . 在Action中怎么写,就要看你自己了,可灵活使用。大家直接使用的是PageController这个类,这是这个程序的精华, 不知道大家能不能理解我的意思,哈哈。1 建立与你要查询数据库中的表字段相对应的Bean。并在其中建立数据库查询方法,该方法需要一个ResultSet类型的参数,是一个静态函数,把ResultSet 中的每条记录装添到一个Bean中,然后保存到ArrayList中返回。在本例中为 XueShengBean 。2 建立一个页面数据控制器:PageController 传入由上面返回的Arraylist ,当前页 ,返回一个只包含当前页的ArrayList3建立控制器组件,这部分由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 >

    最新回复(0)