首先,修改上篇博文的存储过程为带有分页的存储过程,下面是修改之后的存储过程:
SQL
DELIMITER $$
USE `cosmos`$$
DROP PROCEDURE IF EXISTS `searchStudents`$$
CREATE DEFINER=`cosmos`@`%` PROCEDURE `searchStudents`(IN studentName VARCHAR(512),IN page INT,IN orderBy INT, IN orderDesc INT,OUT totalRecords INT)
BEGIN
SET @pageLimit=5;
IF page IS NULL OR page = 'null' OR page = '' OR page < 1 THEN
SET @page=1;
ELSE
SET @page=page;
END IF;
IF orderBy IS NULL OR orderBy = 'null' OR orderBy = '' OR orderBy < 1 THEN
SET @orderBy=2;
ELSE
SET @orderBy=orderBy;
END IF;
IF orderDesc IS NULL OR orderDesc = 'null' OR orderDesc = '' OR orderDesc=0 THEN
SET @orderDesc='ASC';
ELSE
SET @orderDesc='DESC';
END IF;
SET @pageStart = (@page - 1) * @pageLimit;
IF studentName IS NULL THEN
SET studentName = '';
END IF;
SET @namePattern = CONCAT('%', studentName, '%');
SET @listSql=CONCAT('SELECT * FROM student WHERE NAME LIKE ? OR REAL_NAME LIKE ? ORDER BY ? ',@orderDesc, ' LIMIT ?,?');
PREPARE _stmt FROM @listSql;
EXECUTE _stmt USING @namePattern, @namePattern, @orderBy, @pageStart, @pageLimit;
DEALLOCATE PREPARE _stmt;
SELECT COUNT(ID) INTO totalRecords FROM student WHERE NAME LIKE @namePattern OR REAL_NAME LIKE @namePattern;
END$$
DELIMITER ;
这个存储过程看起来似乎很复杂,但大部分代码都是十分容易理解的,前面大部分的IF-ELSE语句主要都是在判断输入的参数是否为空,因为是分页,因此,当一些参数没有传入时,应该给与默认值。
上面的存储过程的各个参数分别代表:
studentName:入参数,要查询的学生名字;
page:入参数,当前是哪一页;
orderBy:入参数,使用哪一列进行排序;
orderDesc:入参数,排序采用正序还是倒序;
totalRecords:出参数,总记录个数。
在存储过程的代码中,SET @pageLimit=5;表示每一页显示5条数据;之后的几行主要是在判断传入的几个参数,如果为空时,设置其默认值;SET @pageStart = (@page - 1) * @pageLimit;来设置本页开始的记录数。从上面分析可以得知,如果不需要从页面来控制排序列,是否正序等等功能时,可去掉orderBy和orderDesc两个参数。
下面修改页面,利用Cosmos框架提供的分页标签,进行分页显示,如下所示,是相关的代码:
JSP
<%@ page pageEncoding="UTF-8" language="java" contentType="text/html;charset=UTF-8"%><%@ include file="/include.inc.jsp"%>
学生列表
学生名称
学生真实姓名
学生性别
${student.name}
${student.realName}
${student.gender ? "女" : "男"}
上述代码中,pager:info标签是用来总的来计算所有跟分页有关的信息的,其属性包括:
totalItems:总的数据条数,在上面的例子中,利用了Cosmos框架里提供的另外一个函数present:commandVar来获取存储过程输出的OUT参数,present:commandVar函数的几个参数分别是(域名,命令名,OUT参数名称,result结果);
url:分页页标签点击时需要的链接地址,在后面的标签中,Cosmos会根据这个参数生成每一页的链接地址;
numPerPage:每一页显示的个数;
currentPageNum:当前页的页数;
pageNumShown:每次显示多少页。
pager:first标签是用来输出第一页的链接的。pager:prepages标签是用来输出前几页的。pager:previous标签是用来输出上一页的。pager:pages标签是用来输出当前的页面列表的。pager:next标签是用来输出下一页的。pager:nextpages标签是用来输出后几页的。pager:last标签是用来输出最后一页的。pager:allpages标签是用来输出所有页面得。
另外,在上面的例子中,凡是${Pager_}开头输出的数据,都是Cosmos框架分页标签库所提供的。
下面是上述分页功能所输出的结果:
点击下一页之后,界面显示如下:
在搜索框中输入搜索条件之后,可以得到对应的搜索结果,在搜索结果页面中也可以点击分页进行其他页面的访问。
从上面这个例子可以看出,Cosmos框架提供的分页标签基本能够满足日常的分页需求,也能够相对比较灵活地适应各种分页风格。
本例子相关的代码下载链接如下: