1、页面视图类--PageView:即在页面看到的分页的各个属性及页面看不到,但需要用到的属性,如当前页、总记录数、总页数、记录列表等;

分页总结_web

2、分页处理方式的抽象过程:

2.1、每个实现方法都创建查询对象

分页总结_web_022.2、把创建查询对象抽象出来,通过getPageView封装

/**
 * 通用的查询分页信息的方法
 * @param hql
 * @param params
 * @param pageNum
 * @return
 */
public PageView getPageView(String hql,Object[] params,int pageNum){
                                                                                                                                            
    //设置查询字符串
    Query countQuery = getSession().createQuery("SELECT COUNT(*)" + hql);
    //设置参数
    for (int i = 0; i < params.length; i++) {
        countQuery.setParameter(i, params[i]);
    }
    //查询出总记录数
    int recordCount = ((Number)countQuery.uniqueResult()).intValue();
    //------------------------//
    //查询分页列表
    Query listQuery = getSession().createQuery(hql + " ORDER BY m.sendTime DESC");
    //设置参数
    for (int i = 0; i < params.length; i++) {
        listQuery.setParameter(i, params[i]);
    }
    List<Message> list = listQuery.setFirstResult((pageNum-1) * MyConfiguration.getPageSize())
    .setMaxResults(MyConfiguration.getPageSize()).list();
                                                                                                                                            
    PageView pageView = new PageView(pageNum, MyConfiguration.getPageSize(), recordCount, list);
                                                                                                                                            
    return pageView;
}

封装以后原来的实现方法变为如下形式:此时的缺点是查询不同对象的记录时,需要写不同的SQL语句,而这些语句结构都是相同的,所以必须再把语句进行封装。

/**
 * 草稿箱列表(分页)
 */
public PageView getDraftBoxListPageView(User currentUser, int pageNum) {
                                                                                                                                
    return getPageView("FROM Message m WHERE m.status = ? AND m.sender = ?",new  Object[]{Message.STATUS_NOT_SENDED,currentUser}, pageNum);
                                                                                                                                
}

2.3、通过QueryBuilder对SQL语句进行封装,故getPageView(String hql,Object[] params,int pageNum)可变为getPageView(QueryView qv,int pageNum),并把它移至DaoBaseImpl中所有业务方法都可以使用

分页总结_总结_03

2.4、action 中可以直接设置SQL值,并返回PageView对象

    /** 草稿箱* */
    public ActionForward draftBox(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        // 记录特征:未发送、发送人为当前登录用户
//      User user = getCurrentUser(request);
//      List<Message> draftBoxList = messageService.getDraftBoxList(user);
//
//      request.setAttribute("draftBoxList", draftBoxList);
        int pageNum = getPageNum(request);
        User currentUser = getCurrentUser(request);
        //拼接SQL语句
        QueryBuilder queryBuilder = new QueryBuilder(Message.class);
        queryBuilder.addWhereCondition("this.status=?", Message.STATUS_NOT_SENDED)
        .addWhereCondition("this.sender=?", currentUser)
        .addOrderProperty("this.sendTime", true);
        //这里的getPageView是DaoBaseImpl中的
        PageView pageView = messageService.getPageView(queryBuilder, pageNum);
          
        request.setAttribute("pageView", pageView);
          
        return mapping.findForward("listDraftBox");
          
    }