webwork 分页功能封装 使用非常方便(增强版)

0 views
Skip to first unread message

鸿蒙

unread,
Sep 8, 2008, 5:16:39 AM9/8/08
to 软思论坛
webwork 分页功能封装 使用非常方便(增强版)
2008年05月11日 星期日 07:38 P.M.

在前一篇文章中实现了webwork 分页功能封装,优点是使用非常方便。

缺点也比较明显:
1.一次读取全部数据,然后list = list.subList(startIndex,endIndex)取得相应页的数据。 这样导致查看每一页数据的时候服务器端都得从数据库取出全部数据,然后把其中的大部分舍弃,取其中的一页数据传到客户端。这个错误想必大家都想得明白怎么修改。
   改进:
DAO中添加相应的有分页功能的接口并实现之:
public List selectFromInbox(User user, int startIndex, int length){
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("user", user);
   map.put("startIndex", startIndex);
   map.put("length", length);
   return getSqlMapClientTemplate().queryForList("message.inbox", map);
}
简单修改action代码为:
/**inbox and sendbox's message List,differed by type*/
public String getMessagesList() throws Exception{
   if (session.get("userId") != null) {
    int userId = (Integer) session.get("userId");
    User user = new User(userId);
    //inboxCount is valued firstly,just because both the sendbox and inbox should show it.
    inboxCount = pmDAO.selectCountFromInbox(user);
    if(type != null && type.equalsIgnoreCase("sendbox")){//sendBox List    
     //pmList = pmDAO.selectFromSent(user); 
     initPage(pmDAO.selectCountFromSend(user));
     pmList = pmDAO.selectFromSend(user, (page.getCurrentPage() - 1) * page.getPageSize(),
       page.getPageSize());
    }else{
     /**deal with inBox List*/
     initPage(inboxCount, 6);
     pmList = pmDAO.selectFromInbox(user,(page.getCurrentPage() - 1) * page.getPageSize(),page.getPageSize());      

    }
    return SUCCESS;
   }else{
    return FAIL;
   }
}

注意以前的dealPageWithList()方法改为initPage(int elementsCount);和另外一种参数形式initPage(int elementsCount,int pageSize);调用第一种方法时,没有定义每页的大小,使用默认值5,使用第二种调用方式时,利用第二个参数把分页大小传进去。详细代码为:
PageActionSupport : 
protected void initPage(int elementsCount, int pageSize){
   if(page == null)
    page = new Page();  
   page.setElementsCount(elementsCount);
   page.setPageSize(pageSize);
   int counts = page.getPagesCount();
   for(int i = 1;i <= counts;i++){
    page.getPages().add(new Integer(i));
   }
   if(page.getCurrentPage() > counts || page.getCurrentPage() < 1)
    page.setCurrentPage(1);
}
protected void initPage(int elementsCount){
   initPage(elementsCount, 5);
}


以上对上篇分页代码的重构可以实现每次页面调用只读取相应页的数据,从而减轻了对数据库的压力,更适合于实际应用。

2.在上篇分页日志中提出可以用<ww:property value="page.pageCode"/>直接调出分页样式,也就是类似于:"首页,上一页,1 2 3``` 下一页 末页",这种方式不方便修改。在此,增加第二种方式来写分页样式,以提供更大的灵活性:
/common/page.jsp:
<%@ page language="java" pageEncoding="GB2312"%>
<%@ taglib prefix="ww" uri="/webwork"%>
<%@ taglib prefix="c" uri="
http://java.sun.com/jsp/jstl/core"%>
<div id="page">
<ww:if test="page.currentPage <= 1">
   <font color="#c0c0c0">首页</font>&nbsp;&nbsp;
   <font color="#c0c0c0">上一页</font>  
</ww:if>
<ww:else>
   <a href="javascript:gotoPage(1);">首页</a>&nbsp;&nbsp;
   <a href="javascript:gotoPage(<ww:property value="page.currentPage - 1"/>);">上一页</a> 
</ww:else>
<ww:iterator value="page.pages" status="loop">
   <a href="javascript:gotoPage(<ww:property value="page.pages[#loop.index]"/>);"/>
   <ww:property value="page.pages[#loop.index]"/>&nbsp;&nbsp;</a>
</ww:iterator>
<ww:if test="page.currentPage >= page.pagesCount">
   <font color="#c0c0c0">下一页</font>&nbsp;&nbsp;
   <font color="#c0c0c0">末页</font>   
</ww:if>
<ww:else>
   <a href="javascript:gotoPage(<ww:property value="page.currentPage + 1"/>);">下一页</a>&nbsp;&nbsp;
   <a href="javascript:gotoPage(<ww:property value="page.pagesCount"/>);">末页</a>  
</ww:else>
</div>


把以前的<ww:property value="page.pageCode"/>修改为:
<jsp:include page="/common/page.jsp"/>
在page.jsp里可以实现非常灵活的分页样式定义,并且容易修改。这也使得分页功能更加接近实际应用。

希望以上记录对正在阅读的你有帮助。
如需要完整的分页代码,可以留下你的邮箱;或给我发邮件:jen...@126.com.^_^..

鸿蒙

unread,
Sep 8, 2008, 5:22:40 AM9/8/08
to 软思论坛
webwork 分页功能封装 使用非常方便(原创)
2008年05月07日 星期三 04:07 A.M.

1.Page.java数据封装类:
package net.jbbs.util;

public class Page {
private int elementsCount;
private int pageSize;
private int pagesCount;
private int currentPage;
private String pageCode;
public int getCurrentPage() {
   return currentPage;
}
public void setCurrentPage(int currentPage) {
   this.currentPage = currentPage;
}
public int getElementsCount() {
   return elementsCount;
}
public void setElementsCount(int elementsCount) {
   this.elementsCount = elementsCount;
}
public String getPageCode() {//生成分页样式代码,可以重新定义。以符合不同的需要。
   StringBuffer pageCode = new StringBuffer();
   //pageCode.append("<script>function gotoPage(pn){var form = document.list;var obj = form.currentPage;obj.value = pn;form.submit();}</script>");
   if (currentPage <= 1) {
            pageCode.append("<font color=\"#C0C0C0\">首页</font>");
            pageCode.append("&nbsp;&nbsp;<font color=\"#C0C0C0\">前页</font>");
        } else {
            pageCode.append("<a href=\"javascript:gotoPage(1);\">首页</a>");//自定义JS方法,提交页码
            pageCode.append("&nbsp;&nbsp;<a href=\"javascript:gotoPage(" + (currentPage - 1) + ");\">前页</a>");
        }
   for(int i = 1 ;i <= pagesCount; i++){
    pageCode.append("<a href=\"javascript:gotoPage(" + i + ");\">&nbsp;&nbsp;" + i +"&nbsp;&nbsp;</a>");
   }
   if (currentPage >= pagesCount) {
            pageCode.append("&nbsp;&nbsp;<font color=\"#C0C0C0\">后页</font>");
            pageCode.append("&nbsp;&nbsp;<font color=\"#C0C0C0\">末页</font>");
        } else {
            pageCode.append("&nbsp;&nbsp;<a href=\"javascript:gotoPage(" + (currentPage + 1) + ");\">后页</a>");
            pageCode.append("&nbsp;&nbsp;<a href=\"javascript:gotoPage(" + pagesCount + ");\">末页</a>");
        }
  
   return this.pageCode = pageCode.toString();
}
public void setPageCode(String pageCode) {
   this.pageCode = pageCode;
}
public int getPagesCount() {
   return pagesCount = (elementsCount % pageSize == 0) ? 
        (elementsCount / pageSize) :
         (elementsCount / pageSize + 1);
}
public void setPagesCount(int pagesCount) {
   this.pagesCount = pagesCount;
}
public int getPageSize() {
   return pageSize;
}
public void setPageSize(int pageSize) {
   this.pageSize = pageSize;
}
}

2.PageActionSupport.java 扩展webwork ActionSupport的基类(其它需要分页功能的action扩展此类即可):
package net.jbbs.util;

import java.util.List;

import com.opensymphony.xwork.ActionSupport;

public class PageActionSupport extends ActionSupport {
protected Page page;
public PageActionSupport() {
   // TODO Auto-generated constructor stub
   super();
}
protected List dealListWithPage(List list){


   if(page == null)
    page = new Page();
  

   page.setElementsCount(list.size());
   if(page.getPageSize() == 0)
    page.setPageSize(5);
   if(page.getCurrentPage() > page.getPagesCount() || page.getCurrentPage() < 1)
    page.setCurrentPage(1);
   if(page.getCurrentPage() < page.getPagesCount())
    list = list.subList((page.getCurrentPage()-1)*page.getPageSize(), page.getCurrentPage() * page.getPageSize());
   else{
    list = list.subList((page.getCurrentPage()-1)*page.getPageSize(), list.size());
   }
   return list;
}
public Page getPage() {
   return page;
}
public void setPage(Page page) {
   this.page = page;
}

}

3.下面来看一下需要分页功能的action是怎么写的:
public class MessageAction extends PageActionSupport implements SessionAware{....................
//扩展PageActionSupport

public String getMessagesList() throws Exception{
   if (session.get("userId") != null) {
    int userId = (Integer) session.get("userId");
    User user = new User(userId);

    /**default ,deal with inBox List*/
    pmList = pmDAO.selectFromInbox(user);
    inboxCount = pmList.size();


    if(type != null && type.equalsIgnoreCase("sendbox")){//sendBox List    

     pmList = pmDAO.selectFromSent(user);  
    }
    pmList = dealListWithPage(pmList);//这一句就是需要为分页添加的代码

    return SUCCESS;
   }else{
    return FAIL;
   }
}

4.JSP页面的调用代码同样简单:
4.1设置隐藏字段,用来标识页码:  
<form name="list" action="getMessagesList.action?type=<ww:property value="#parameters['type']"/>" method="post">
       <input id="curPage" type="hidden" name="page.currentPage" value="<ww:property value="page.currentPage"/>"/>
   </form>

4.2提交页码的JS代码:
<script>
   function gotoPage(pageNo)
   {
     var form = document.list;
     var obj = document.getElementById("curPage");
     obj.value = pageNo;
     form.submit();   
   }
   </script>

4.3分页代码调用(在表格的顶部或者底部):<ww:property value="page.pageCode" escape="false"/>

以上代码完美封装了分页的大部分功能。并且松耦合、可重用、易于应用,充分发挥了webwork值栈的功能。

Reply all
Reply to author
Forward
0 new messages