1、页面视图类--PageView:即在页面看到的分页的各个属性及页面看不到,但需要用到的属性,如当前页、总记录数、总页数、记录列表等;
2、分页处理方式的抽象过程:
2.1、每个实现方法都创建查询对象
2.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中所有业务方法都可以使用
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"); }