willsu

博客园 首页 新随笔 联系 订阅 管理

1、定义通用分页model
package cn.com.bank.mmpf.model;

import cn.com.bank.mmpf.util.Constants;

/**
 * Created by IntelliJ IDEA.
 * User: willsu
 * Date: 2005-6-10
 * Time: 16:51:22
 * To change this template use File | Settings | File Templates.
 */
public class PageControl implements java.io.Serializable{
    private int pageno=1;  //当前页码
    private int pagesize=Constants.PAGE_SIZE_DEFALUT; //每页行数
    private int rowcount; //总行数
    private int pagecount; //总页数
    private boolean useprevious;//前一页是否能用
    private boolean usebehind;//后一页是否能用
    private boolean usepage=true;//是否分页


    public int getPageno() {
        return pageno;
    }

    public void setPageno(int pageno) {
        this.pageno = pageno;
    }

    public int getPagesize() {
        return pagesize;
    }

    public void setPagesize(int pagesize) {
        if (pagesize==0){//0-->不分页
           usepage=false;
           pagecount=1;
           pageno=1;
           useprevious=false;
           usebehind=false;
        }
        this.pagesize = pagesize;
    }

    public int getRowcount() {
        return rowcount;
    }

    public void setRowcount(int rowcount) {
        this.rowcount = rowcount;
        if(usepage){
           pagecount=(rowcount % pagesize ==0 )?(rowcount /pagesize ) : ( rowcount / pagesize +1);
           useprevious=pageno==1?false:true;
           usebehind=pageno==pagecount?false:true;
        }
    }

    public int getPagecount() {
        return pagecount;
    }

    public void setPagecount(int pagecount) {
        this.pagecount = pagecount;
    }

    public boolean isUseprevious() {
        return useprevious;
    }

    public void setUseprevious(boolean useprevious) {
        this.useprevious = useprevious;
    }

    public boolean isUsebehind() {
        return usebehind;
    }

    public void setUsebehind(boolean usebehind) {
        this.usebehind = usebehind;
    }

    public boolean isUsepage() {
        return usepage;
    }

    public void setUsepage(boolean usepage) {
        this.usepage = usepage;
    }

}

2、hibernate分页实现函数--〉放在底层类中
  public class CommonServiceImpl extends HibernateDaoSupport implements CommonService{
  。。。
   //通用分页处理
    public List getListForPage(final String hsql,PageControl pageControl) throws Exception
    {
        List pagelist=null;
        Session session=getSession();
        try {
            pageControl.setRowcount(getTotalCount(session,hsql)); //更新pagecontrol的各种属性 important
            if(pageControl.isUsepage()){ //是否分页
                // sql=hsql+ " limit " + (pageNog-1)*page_size + "," +page_size;
                // offices= getHibernateTemplate().find(sql);
                //被屏蔽掉的是原来的处理
                //以下是改过的处理方法
                Query query=null;
                query=session.createQuery(hsql);
                int start=(pageControl.getPageno()-1)*pageControl.getPagesize();
                int rowNum=pageControl.getPagesize();
                query.setFirstResult(start);
                query.setMaxResults(rowNum);
                pagelist = query.list();
            }else{
                pagelist=session.find(hsql);
            }
        } finally {
            session.close();
        }
        return pagelist;
    }

   //计算表的总行数
    private int getTotalCount(Session session, String hql) throws Exception
    {
        Integer amount = new Integer(0);
        int sql_from = hql.indexOf("from");
        int sql_orderby=hql.indexOf("order by");//为了改进
        String countStr="";
        if(sql_orderby>0)
        {
        countStr="select count(*) "+hql.substring(sql_from,sql_orderby);
        }
        else
        countStr = "select count(*) "+hql.substring(sql_from);

        Query query = session.createQuery(countStr);
        if(!query.list().isEmpty()){
        amount = (Integer) query.list().get(0);
        }
        else
        return 0;
        return amount.intValue();
    }
}

3、实际service对象继承commonserviceimpl
public class LogServiceImpl extends CommonServiceImpl implements LogService{
    public List getLogByType(Integer logtype, PageControl pageControl) throws Exception{
        String hql="from "+Systemlog.class.getName()+" as a where a.baselogtype.id="+logtype+" order by a.opertime desc";
        return getListForPage(hql,pageControl);
    }
}


4、action实现
public class LogListAction extends BaseAction{
    public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception
    {
        String forward =Constants.FORWORD_FIAL;
        LogService service = (LogService) getWebApplicationContext().getBean(Constants.LOG_SERVICE);//获得service对象
        Object obj=((DynaActionForm) actionForm).get(Constants.PAGE_CONTROL_MODEL);
        Object obj1=((DynaActionForm) actionForm).get(Constants.PAGE_FILTER_ID);
        Integer filterid=obj1==null?new Integer(1):(Integer)obj1;
        PageControl pageControl=obj==null?new PageControl():(PageControl)obj;
        try {
            List mainlist=service.getLogByType(filterid,pageControl); //调用分页方法得到list
            List filterlist=service.loadAll(Baselogtype.class);
            ((DynaActionForm) actionForm).set(Constants.PAGE_ENTITY_LIST, mainlist);
            ((DynaActionForm) actionForm).set(Constants.PAGE_FILTER_LIST, filterlist);
            ((DynaActionForm) actionForm).set(Constants.PAGE_FILTER_ID,filterid);
            ((DynaActionForm) actionForm).set(Constants.PAGE_CONTROL_MODEL,pageControl);
            forward = Constants.FORWORD_SUCCESS;
        } catch (Exception e) {
            ActionErrors errors = new ActionErrors();
            errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(Constants.ERROR_LIST,e.getMessage()));
            saveErrors(request, errors);
        }
        return actionMapping.findForward(forward);
    }
}

5、jsp页面
5.1、分页部分代码:
            <logic:greaterThan value="0" name="LogListForm" property="pagecontrolmodel.rowcount">
                <p align="right" style="font-size:12px">
                    共<bean:write name="LogListForm" property="pagecontrolmodel.rowcount"/>行
                    &nbsp;共<bean:write name="LogListForm" property="pagecontrolmodel.pagecount"/>页
                    &nbsp;每页行数
                            <html:select name="LogListForm" property="pagecontrolmodel.pagesize" styleClass="DropDownList" style="width:80px" onchange="refresh()">
                                <html:option value="0">不分页</html:option>
                                <html:option value="10">10行</html:option>
                                <html:option value="20">20行</html:option>
                                <html:option value="30">30行</html:option>
                                <html:option value="50">50行</html:option>
                                <html:option value="100">100行</html:option>
                            </html:select>
                <logic:equal value="true" name="LogListForm" property="pagecontrolmodel.usepage">
                    <logic:equal value="true" name="LogListForm" property="pagecontrolmodel.useprevious">
                       &nbsp;<a href="javascript:goto(1)">首页</a>
                       &nbsp;<a href="javascript:goto(<bean:write property="pagecontrolmodel.pageno" name="LogListForm"/>-1)">前一页</a>
                    </logic:equal>
                    <logic:equal value="false" name="LogListForm" property="pagecontrolmodel.useprevious">
                       &nbsp;首页
                       &nbsp;前一页
                    </logic:equal>

                    <logic:equal value="true" name="LogListForm" property="pagecontrolmodel.usebehind">
                       &nbsp;<a href="javascript:goto(<bean:write property="pagecontrolmodel.pageno" name="LogListForm"/>+1)">后一页</a>
                       &nbsp;<a href="javascript:goto(<bean:write property="pagecontrolmodel.pagecount" name="LogListForm"/>)">末页</a>
                    </logic:equal>

                    <logic:equal value="false" name="LogListForm" property="pagecontrolmodel.usebehind">
                       &nbsp;后一页
                       &nbsp;末页
                    </logic:equal>
                    &nbsp;跳至<html:text property="pagecontrolmodel.pageno" name="LogListForm" styleClass="TextBox" style="width:20px"/><input type="button" value="go" onclick="check();">
                </logic:equal>
                </p>
         </logic:greaterThan>      
5.2、分页实现配套javascript
      <script>
           function refresh()
           {
              document.all("LogListForm").submit();
           }

           function check()
           {
               var pageno=document.all("pagecontrolmodel.pageno");
               if(!isInt(pageno.value)){alert("非法页数");return;}
               var ipageno=parseInt(pageno.value);
               var imaxno=parseInt(document.all("pagecontrolmodel.pagecount").value);
               if(ipageno<1 || ipageno>imaxno){
                 alert("页数不在允许的范围内!");return;
               }
               refresh();
           }

           function goto(pageno){
              document.all("pagecontrolmodel.pageno").value=pageno;
              check();
           }
      </script>









posted on 2005-06-11 11:18  willsu  阅读(5637)  评论(7编辑  收藏  举报