免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4056 | 回复: 0
打印 上一主题 下一主题

Flex+Spring+Ibatis 实现分页处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-30 11:34 |只看该作者 |倒序浏览
上网查找了一些相关资料,Flex分页处理的例子比较多,但绝大多数都是一次查询,然后多次在结果集中取数据。这种做法在web程序中是不可取的。于是又查找了一些关于Ibatis分页的做法,尽管Ibatis本身就提供了一些便捷的方法,但网上的评价效果不佳。于是,这里采用了最典型的三层嵌套的方式,进行分页处理。

大概的思路是 Flex端向后台传递一个参数——当前页数currentPage,后台根据当前页数currentPage,总数据数和每页显示的数据数这三个参数,通过一个共通的Pagebean,算出每一次需要查询的开始记录数pageStartRow和结束记录数pageEndRow。然后将查询的结果集和pagebean一起返回到Flex端,结果集用来显示数据,而pagebean则对应Flex端的一个javabean(形式和后台的pagebean一样),用来空是分页控件的一些属性(如:是否显示下一页,前一页等等)。

具体代码如下:
1.Spring中与前台交互的代码:


public List getAllUserInfo(int currentPage)throws Exception{
        try{
            List rslt = new ArrayList();
            
            PageBean pb = new PageBean();
            pb=insertService.getTotalUserInfoCnt();
            pb.page(Constants.PAGERECORDERS, currentPage, pb.gettotalRows());
            rslt.add(pb);
            
            List userInfo=new ArrayList();
            userInfo=insertService.getAllUserInfo(pb);
            rslt.add(userInfo);
            return rslt;
        }catch (Exception e){
            log.info(e.toString());
            throw e;
        }
        
    }
2.Ibatis 对应的xml代码

select id="getAllUserInfo" resultMap="userList" parameterClass="page">
     ![CDATA[
         SELECT *
         FROM (SELECT A.*,ROWNUM R
                  FROM (
                             SELECT RESUME_ID,
                                NAME,
                                TO_CHAR(BIRTHDAY,'YYYY/MM/DD') BIRTHDAY,
                                TO_CHAR(STARTDATE,'YYYY/MM/DD') STARTDATE
                            FROM BASIC_INFO
                            ORDER BY RESUME_ID
                        )A
                 WHERE ROWNUM=#pageEndRow#
             ) B
        WHERE B.R>#pageStartRow#
    ]]>
/select>
3.实现翻页处理的关键
PageBean

package flex.samples.spring.bean;
public class PageBean {
   
    /**
     * 当面のページ。
     */
    private int currentPage = 0;
    /**
     * 総括的なページ数。
     */
    private int totalPages = 0;
    /**
     * 各ページの記録数。
     */
    private int pageRecorders = 0;
    /**
     * 総括的な記録数。
     */
    private int totalRows = 0;
    /**
     * 各ページの始まりの記録数。
     */
    private int pageStartRow = 0;
    /**
     * 各ページの終わりの記録数。
     */
    private int pageEndRow = 0;
    /**
     * 次のページの存在を判断する。
     */
    private boolean hasNextPage = false;
    /**
     * 前のページの存在を判断する。
     */
    private boolean hasPreviousPage = false;
    /**
     * 次のページ。
     */
    private int nextPage = 0;
    /**
     * 前のページ。
     */
    private int previousPage = 0;
    public void setnextPage(int nextPage) {
        this.nextPage = nextPage;
    }
    public int getnextPage() {
        return this.nextPage;
    }
    public void setpreviousPage(int previousPage) {
        this.previousPage = previousPage;
    }
    public int getpreviousPage() {
        return this.previousPage;
    }
    public int getcurrentPage() {
        return this.currentPage;
    }
    public void setcurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }
    public int getpageRecorders() {
        return this.pageRecorders;
    }
    public void setpageRecorders(int pageRecorders) {
        this.pageRecorders = pageRecorders;
    }
    public int getpageStartRow() {
        return this.pageStartRow;
    }
    public void setpageStartRow(int pageStartRow) {
        this.pageStartRow = pageStartRow;
    }
    public int getpageEndRow() {
        return this.pageEndRow;
    }
    public void setpageEndRow(int pageEndRow) {
        this.pageEndRow = pageEndRow;
    }
    public int gettotalPages() {
        return this.totalPages;
    }
    public void settotalPages(int totalPages) {
        this.totalPages = totalPages;
    }
    public int gettotalRows() {
        return this.totalRows;
    }
    public void settotalRows(int totalRows){
        this.totalRows=totalRows;
    }
    public boolean gethasNextPage() {
        return this.hasNextPage;
    }
    public void sethasNextPage(boolean hasNextPage) {
        this.hasNextPage = hasNextPage;
    }
    public boolean gethasPreviousPage() {
        return this.hasPreviousPage;
    }
    public void sethasPreviousPage(boolean hasPreviousPage) {
        this.hasPreviousPage = hasPreviousPage;
    }
   
   
    public void page(int pageRecorders, int currentPage, int totalRows) {
        //次のページと前のページを計算する
        this.nextPage = currentPage + 1;
        //this.previousPage = currentPage - 1;
        this.currentPage = currentPage;
        //ページ数が整数である場合の処理
        if ((totalRows % pageRecorders) == 0) {
            //記録があ?場合の処理
            if (totalRows != 0) {
                this.totalPages = totalRows / pageRecorders;
            } else {
                //記録がない場合の処理
                this.totalPages = 1;
            }
        } else {
            //ページ数が整数でない場合の処理
            this.totalPages = totalRows / pageRecorders + 1;
        }
        //当面のページ数がゼロである場合の処理
        if (this.currentPage == 0) {
            this.currentPage = currentPage;
        }
        
        //当面のページ数が設定する
        if (this.currentPage > 1) {
            this.currentPage = this.currentPage - 1;
            if (this.currentPage * pageRecorders  totalRows) {
                this.currentPage = this.currentPage + 1;
            }
        }
        //前のページの存在を判断する
        if ((this.currentPage - 1) > 0) {
            this.hasPreviousPage = true;
            this.previousPage=this.currentPage - 1;
        } else {
            this.hasPreviousPage = false;
        }
        //次のページの存在を判断する
        if (this.currentPage >= totalPages) {
            this.hasNextPage = false;
        } else {
            this.hasNextPage = true;
        }
        
        //ジを判断する
        if (this.currentPage * pageRecorders  totalRows) {
            //ジではない場合、ページの始まりの記録数と終数りの記録数を計算する
            this.pageEndRow = currentPage * pageRecorders;
            this.pageStartRow = pageEndRow - pageRecorders;
        } else {
            //ジの場合、終数りの記録数を計算する
            this.pageEndRow = totalRows;
            //記録がない時、ページの始まりの記録数を計算する
            if (totalPages == 0) {
                this.pageStartRow = 0;
            } else {
                //記録があ数時、ページの始まりの記録数を計算する
                this.pageStartRow = pageRecorders * (totalPages - 1);
            }
        }
    }
}
4.Felx端创建一个类似的pagebean

package puremvc.model.vo
{
    [Bindable] [RemoteClass(alias="flex.samples.spring.bean.PageBean")]
    public class Page
    {
        private var _currentPage:int = 0;
        private var _totalPages:int = 0;
        private var _pageRecorders:int = 0;
        private var _totalRows:int = 0;
        private var _pageStartRow:int = 0;
        private var _pageEndRow:int = 0;
        private var _hasNextPage:Boolean = false;
        private var _hasPreviousPage:Boolean = false;
        private var _nextPage:int = 0;
        private var _previousPage:int = 0;
        
        public function get currentPage(): int
        {
            return this._currentPage;
        }
        
        public function set currentPage(_currentPage:int): void
        {
            this._currentPage = _currentPage;
        }
        
        public function get totalPages(): int
        {
            return this._totalPages;
        }
        
        public function set totalPages(_totalPages:int): void
        {
            this._totalPages = _totalPages;
        }
        public function get pageRecorders(): int
        {
            return this._pageRecorders;
        }
        
        public function set pageRecorders(_pageRecorders:int): void
        {
            this._pageRecorders = _pageRecorders;
        }
        
        public function get totalRows(): int
        {
            return this._totalRows;
        }
        
        public function set totalRows(_totalRows:int): void
        {
            this._totalRows = _totalRows;
        }
        public function get pageStartRow(): int
        {
            return this._pageStartRow;
        }
        
        public function set pageStartRow(_pageStartRow:int): void
        {
            this._pageStartRow = _pageStartRow;
        }
        public function get pageEndRow(): int
        {
            return this._pageEndRow;
        }
        
        public function set pageEndRow(_pageEndRow:int): void
        {
            this._pageEndRow = _pageEndRow;
        }
        public function get hasNextPage(): Boolean
        {
            return this._hasNextPage;
        }
        
        public function set hasNextPage(_hasNextPage:Boolean): void
        {
            this._hasNextPage = _hasNextPage;
        }
        
        public function get hasPreviousPage(): Boolean
        {
            return this._hasPreviousPage;
        }
        
        public function set hasPreviousPage(_hasPreviousPage:Boolean): void
        {
            this._hasPreviousPage = _hasPreviousPage;
        }
        
        public function get nextPage(): int
        {
            return this._nextPage;
        }
        
        public function set nextPage(_nextPage:int): void
        {
            this._nextPage = _nextPage;
        }
        public function get previousPage(): int
        {
            return this._previousPage;
        }
        
        public function set previousPage(_previousPage:int): void
        {
            this._previousPage = _previousPage;
        }
    }
}




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/72527/showart_1069611.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP