今日的北京气温回升,昨天是降温。天气的变暖,让大家感觉十分温暖,课上睡意连绵。汤兄弟有发现大家的状况,所以今天拿出了一点时间与大家交流学习方法或技术上的一些问题。授课进度完全在掌握之中。
未来三天的内容,学习使用 JBMP 解决 审批流转这一大模块的需求。今日的课程内容比较简单,但在实际项目中的应用却十分重要。把 WEB 基础搞的差不多了,这些框架并没什么难的。更多的是应该多使用,多熟悉他们。两大重点内容:通用超强分页功能、 JBPM 审批流程管理。
一、通用超强分页功能
1. 分页效果
(图 1.1 )
图 1.1 中显示的分页功能是目前我见到的,功用最全的分页功能。当然也是论坛中比较常用的分页功能。我们今日就实现这个通用超级分页功能。
2. 分页 Bean
汤老师使用自己的讲课风格(应该也是他做项目时的编写风格),由广入微、由粗糙到细致。使用他的方法做分析比较好,这或许是通用的分析方式吧!
我们看图 1.1 中具有的属性:
v 页码: 1/11 页
v 每页显示: 30 条
v 总记录数: 301 条
v 分页: [ 首页 ] [ 上一页 ] [ 下一页 ] [ 尾页 ] 1 2 3 4 5 6 7 8 9 10
OK ,我们根据页面信息取出了分页 Bean 的属性,并设计分页 Bean :
import java.util.List;
public class PageView { // 通过参数指定的信息 private int currentPage ; // 当前页码 private int pageSzie ; // 每页显示记录数量 // 通过查询数据库获取的信息,外部获取 private int recordTotal ; // 总记录数 private List recordList ; // 当前面记录信息列表 // 通过计算生成的信息 private int pageTotal ; // 总页面数量 private int startIndex ; // 起始页面索引 private int endIndex ; // 结束页面索引 // 显示的页面数量 private static final int PAGE_INDEX_COUNT = 10;
// 在构造方法中生成各种需要的信息 public PageView( int currentPage, int pageSize, int recordTotal, List recordList) { this . currentPage = currentPage; this . pageSzie = pageSize; this . recordTotal = recordTotal; this . recordList = recordList; // 通过计算生成startIndex和endIndex /* * 因为显示的页面索引数量是有限的 我们不能把所以的页面索引一下子全列出来 我们需要动态显示页面索引列表 */ this . pageTotal = ( this . recordTotal + this . pageSzie - 1) / this . pageSzie ; // 如果页面总数<=显示页面索引数量 if ( this . pageTotal <= PAGE_INDEX_COUNT ) { this . startIndex = 1; this . endIndex = this . pageTotal ; } else { // 根据当前页面索引生成,页面起始索引和结束索引。 // 区分偶数和奇数 页面索引数量 if ( PAGE_INDEX_COUNT % 2 == 0) { this . startIndex = this . currentPage - ( PAGE_INDEX_COUNT / 2 - 1); this . endIndex = this . currentPage + ( PAGE_INDEX_COUNT / 2); } else { this . startIndex = this . currentPage - ( PAGE_INDEX_COUNT / 2); this . endIndex = this . currentPage + ( PAGE_INDEX_COUNT / 2); } // 如果生成的起始索引小于1 if ( this . startIndex < 1){ this . startIndex = 1; this . endIndex = PAGE_INDEX_COUNT ; } // 如果生成的结束索引大于总页面索引数量 if ( this . endIndex > this . pageTotal ){ this . endIndex = this . pageTotal ; this . startIndex = this . pageTotal - PAGE_INDEX_COUNT ; } } } // ...getters AND setters } |
3. 审批流程的 DispathcAction
我们与上次课程一样,需要为审批流程编写一个 DispatchAction 。涉及到显示审批流程列表只有一个方法—— list :
/** * 显示审批流程列表 */ public ActionForward list(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { int pageNum = Integer. parseInt (request.getParameter( "pageNum" )); // 调用ProcessDefinitionService接口的getPageView方法获取PageView对象 PageView pageView = processDefinitionService .getPageView(pageNum); // 将PageView对象存放到request的pageView属性中 request.setAttribute( "pageView" , pageView); return mapping.findForward( "list" ); // list. jsp } |
其中用到的“ processDefinitionService .getPageView ”方法:
/** * 获取pageView信息 */ public PageView getPageView( int pageNum) { // 每面显示10条记录 int pageSize = 10; // 查询数据库 // 使用Number防止不同数据库返回的数值类型不同,而引发的异常。 int count = ((Number) this .getSession().createQuery( "SELECT COUNT(*) FROM " + ProcessDefinition. class .getName() + " pd" ).uniqueResult()).intValue(); // 第一条记录的索引 int firstRecoderIndex = (pageNum - 1) * pageSize; // 获取记录列表 List list = this .getSession().createQuery( "FROM " + ProcessDefinition. class .getName() + " pd" ) .setFirstResult(firstRecoderIndex).setMaxResults(pageSize) .list(); return new PageView(pageNum, pageSize, count, list); } |
4. 显示分页信息的 pageView.jspf 页面
多处使用到分页页面,所以我们将分页页面单独提取出来。如果有哪个页面需要显示分页信息,直接 include 就可以了。
<%@ page language = "java" pageEncoding = "utf-8" %> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
< c:if test = " ${pageView.totalPage gt 1 } " >
<!-- 分页信息 --> 页码:${pageView.currentPage}/${pageView.totalPage}页 每页显示:${pageView.pageSize}条 总记录数:${pageView.recordCount}条
分页: < a href = "javascript:gotoPage(1)" > [首页] </ a > < c:if test = " ${pageView.currentPage gt 1} " > < a href = " javascript:gotoPage( ${pageView.currentPage - 1} ) " > [上一页] </ a > </ c:if > < c:if test = " ${pageView.currentPage lt pageView.totalPage} " > < a href = " javascript:gotoPage( ${pageView.currentPage + 1} ) " > [下一页] </ a > </ c:if > <span style="font-family: 'Cour |