Cosmos开发指南(三)

本文介绍如何使用Cosmos框架实现分页功能,通过修改存储过程及应用分页标签,展示了具体的实现步骤。

      本篇主要介绍如何利用Cosmos框架进行分页开发,利用上一篇文章的结果,下面直接将上面查询和列出所有学生的界面,修改为一个带有分页的界面。

      首先,修改上篇博文的存储过程为带有分页的存储过程,下面是修改之后的存储过程:

 

ContractedBlock.gif ExpandedBlockStart.gif SQL
 1DELIMITER $$
 2
 3USE `cosmos`$$
 4
 5DROP PROCEDURE IF EXISTS `searchStudents`$$
 6
 7CREATE DEFINER=`cosmos`@`%PROCEDURE `searchStudents`(IN studentName VARCHAR(512),IN page INT,IN orderBy INTIN orderDesc INT,OUT totalRecords INT)
 8BEGIN
 9    SET @pageLimit=5;
10
11    IF page IS NULL OR page = 'null' OR page = '' OR page < 1 THEN
12        SET @page=1;
13    ELSE
14        SET @page=page;
15    END IF;
16
17    IF orderBy IS NULL OR orderBy = 'null' OR orderBy = '' OR orderBy < 1 THEN
18        SET @orderBy=2;
19    ELSE
20        SET @orderBy=orderBy;
21    END IF;
22
23    IF orderDesc IS NULL OR orderDesc = 'null' OR orderDesc = '' OR orderDesc=0 THEN
24        SET @orderDesc='ASC';
25    ELSE
26        SET @orderDesc='DESC';
27    END IF;
28
29    SET @pageStart = (@page - 1* @pageLimit;
30
31    IF studentName IS NULL THEN
32        SET studentName = '';
33    END IF;
34
35    SET @namePattern = CONCAT('%', studentName, '%');
36    SET @listSql=CONCAT('SELECT * FROM student WHERE NAME LIKE ? OR REAL_NAME LIKE ? ORDER BY ? ',@orderDesc' LIMIT ?,?');
37    PREPARE _stmt FROM @listSql;
38    EXECUTE _stmt USING @namePattern@namePattern@orderBy@pageStart@pageLimit;
39    DEALLOCATE PREPARE _stmt;
40
41    SELECT COUNT(ID) INTO totalRecords FROM student WHERE NAME LIKE @namePattern OR REAL_NAME LIKE @namePattern;
42    END$$
43
44DELIMITER ;
45

      这个存储过程看起来似乎很复杂,但大部分代码都是十分容易理解的,前面大部分的IF-ELSE语句主要都是在判断输入的参数是否为空,因为是分页,因此,当一些参数没有传入时,应该给与默认值。

      上面的存储过程的各个参数分别代表:

      studentName:入参数,要查询的学生名字;

      page:入参数,当前是哪一页;

      orderBy:入参数,使用哪一列进行排序;

      orderDesc:入参数,排序采用正序还是倒序;

      totalRecords:出参数,总记录个数。

      在存储过程的代码中,SET @pageLimit=5;表示每一页显示5条数据;之后的几行主要是在判断传入的几个参数,如果为空时,设置其默认值;SET @pageStart = (@page - 1) * @pageLimit;来设置本页开始的记录数。从上面分析可以得知,如果不需要从页面来控制排序列,是否正序等等功能时,可去掉orderBy和orderDesc两个参数。

      下面修改页面,利用Cosmos框架提供的分页标签,进行分页显示,如下所示,是相关的代码:

 

 

ContractedBlock.gif ExpandedBlockStart.gif JSP
 1ExpandedBlockStart.gifContractedBlock.gif<%@ page pageEncoding="UTF-8" language="java" contentType="text/html;charset=UTF-8"%><%@ include file="/include.inc.jsp"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2<html xmlns="http://www.w3.org/1999/xhtml">
 3<head>
 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 5<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
 6<link href="styles/default/css/main.css" rel="stylesheet" type="text/css" />
 7<script type="text/javascript" src="styles/default/scripts/main.js"></script>
 8</head>
 9
10<body onresize="fixSubHeight();" onload="fixSubHeight();">
11<iframe id="hiddenFrame" name="hiddenFrame" style="display:none;"></iframe>
12<div id="listContent">
13    <h1><span>学生列表</span></h1>
14    <div id="top" class="toolBar">
15        <div class="left" style="width:100%;">
16            <form name="searchForm" id="searchForm" method="post" enctype="application/x-www-form-urlencoded" style="border:none;">
17                <input type="text" name="studentName" value="${param.studentName}" />
18                <button onclick="searchForm.submit();">查询</button>
19            </form>
20        </div>
21    </div>
22    <div id="tab" align="center">
23        <table class="defaultList">
24            <tr>
25                <th scope="col">学生名称</th>
26                <th scope="col">学生真实姓名</th>
27                <th scope="col">学生性别</th>
28            </tr><c:forEach items="${present:commandFirstList('jndi', 'searchStudents', result)}" var="student">
29            <tr onclick="selectRow(this);">
30                <td>${student.name}</td>
31                <td>${student.realName}</td>
32                <td>${student.gender ? "女" : "男"}</td>
33            </tr></c:forEach>
34        </table>
35    </div>
36    <div id="bottom" class="toolBar">
37        <div class="left">
38        </div>
39        <div class="right">
40            <pager:info totalItems="${present:commandVar('jndi', 'searchStudents', 'totalRecords', result)}" url="cosmos.slet?domain=jndi&method=searchStudents&forward=test.paged_students&studentName=${param.studentName}" numPerPage="5" currentPageNum="${param.page}" pageNumShown="5" >
41                <pager:first><href="${firstPage}">首页</a></pager:first>
42                <pager:prepages><href="${prePages}">前${Pager_pageNumShown }页</a></pager:prepages>        
43                <pager:previous><href="${prePage}">上一页</a></pager:previous>
44                <pager:pages><href="${pages}"><c:if test="${Pager_pageNum == Pager_currentPageNum }"><strong>${Pager_pageNum }</strong></c:if><c:if test="${!(Pager_pageNum == Pager_currentPageNum)}">${Pager_pageNum}</c:if></a></pager:pages>
45                <pager:next><href="${nextPage}">下一页</a></pager:next>
46                <pager:nextpages><href="${nextPages}">后${Pager_pageNumShown}页</a></pager:nextpages>        
47                <pager:last><href="${lastPage}">尾页</a></pager:last>
48                <select onchange="document.location='${url}'+this.options[this.selectedIndex].value;"><pager:allpages><option ${Pager_currentPageNum == Pager_pageCount ? "selected" : ""} value="${Pager_pageCount}">${Pager_pageCount}</option></pager:allpages></select> 
49            </pager:info>
50        </div>
51    </div>
52</div>
53</body>
54</html>
55

  

      上述代码中,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框架分页标签库所提供的。

      下面是上述分页功能所输出的结果:

page_1

      点击下一页之后,界面显示如下:

page_2

      在搜索框中输入搜索条件之后,可以得到对应的搜索结果,在搜索结果页面中也可以点击分页进行其他页面的访问。

      从上面这个例子可以看出,Cosmos框架提供的分页标签基本能够满足日常的分页需求,也能够相对比较灵活地适应各种分页风格。

本例子相关的代码下载链接如下:

paged_students.zip

 

转载于:https://www.cnblogs.com/microsaas/archive/2009/11/03/cosmos_development_3.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值