任务九  实现产品分页显示

任务九 实现产品分页显示

学习目标

理解分页的算法。

会使用分页算法处理产品的显示问题。

任务描述

产品展示是企业门户网站非常重要的一个模块,而且通常一家企业要展示的产品会比较多,如果把所有的产品信息都放在同一个页面,页面会很冗长。为了更好地规划页面,通常会使用如图1-9-1所示的分页技术,对多条内容进行整理。不仅仅是产品,网站中很多信息都需要使用分页,例如新闻显示、留言显示等。

978-7-111-44979-9-Chapter01-275.jpg

图1-9-1 产品分页显示效果图

本次任务要求实现产品分页展示。

任务分析与相关知识

1.分页算法

分页其实是一个数据问题。在分页之前需要明确以下几点:

1)一页显示多少数据(需要提前设定)。

2)一共有多少数量的记录需要分页。

3)一共有多少页的数据可以被浏览。

以分苹果为例,如果一个礼品篮最多装n个苹果,现在有m个编过号的苹果(假设苹果从0开始编号,在礼品蓝中也是一个挨着一个顺序排放),请回答如下两个问题:

1)一共需要多少个礼品篮才能装下所有的苹果?

2)如果现在需要查看第x个礼品篮中的苹果,请问第x个礼品篮中第一个苹果是几号苹果?

对于第一个问题,可以按图1-9-2所示这样分析。

978-7-111-44979-9-Chapter01-276.jpg

图1-9-2 需要的礼品篮个数

也可以把上面的结果简化成一个公式:

需要的篮子数=(m+n−1)/n

对于第二个问题,可以用列举法找到规律,如表1-9-1所示。

表1-9-1 寻找第x个篮子的第一个苹果编号

978-7-111-44979-9-Chapter01-277.jpg

所以,第x个篮子里第一个苹果的编号是“(x−1)*n”(假设第一个苹果编号是0)。

综上所述,如果一个页面所能容纳的产品数量为PAGESIZE,一共有max条产品信息需要显示,那么总页数就是(max+PAGESIZE−1)/PAGESIZE;如果当前页面要显示第nowpage页的内容,那么实际上是从产品表中,索引位置为“(nowpage−1)*PAGESIZE”的记录开始取信息。

2.分页案例

以新闻显示为例,展示JSP页面如何实现分页技术。

1)为了对页面中容纳的新闻信息的条数进行统一的管理,建立一个CONSTANTS类,存放这些公共变量的值。

在Hello项目中添加一个Java文件CONSTANTS.java,包名为models,代码如下所示。

代码1-9-1 CONSTANTS.java

978-7-111-44979-9-Chapter01-278.jpg

其中,NEWS_PAGESIZE中存放了新闻显示页面一页能容纳的新闻的数量。

2)在Hello项目中添加一个JSP文件news_page.jsp,代码如下所示。

代码1-9-2 news_page.jsp

978-7-111-44979-9-Chapter01-279.jpg

978-7-111-44979-9-Chapter01-280.jpg

978-7-111-44979-9-Chapter01-281.jpg

978-7-111-44979-9-Chapter01-282.jpg

978-7-111-44979-9-Chapter01-283.jpg

在上述案例中,第179~182行是分页的超链接,如果单击“首页”就直接把页码参数设置为1;如果单击“上页”,则在当前要显示的页码的基础上减去1;同理,单击“下页”,则在当前要显示的页码基础上加1;单击“末页”,应该直接定位到最大页码处。

这里用到的nowpage来自第122行,从查询字符串中取出页码信息,这个数据在使用之前要确认三件事情:

1)如果用户没有传递页码参数,例如第一次访问这个页面时,应该默认页码为1。

2)如果用户传递的页码参数小于1,例如当前页码为第一页,用户单击“上页”,就会传递0过来,这时候,应该对当前页面完成下限判断,如第146行所示。

3)如果用户传递的页码参数大于最大页码,例如当前页码为最后一页,用户单击“下页”,就会传递最大页码+1过来,这时候,应该对当前页面完成上限判断,如第147行所示。

maxpage来自第144行,根据之前确定的算法,可以根据一页的容量和总记录数计算出maxpage。

运行Hello项目,测试news_page.jsp,效果如图1-9-3所示。

978-7-111-44979-9-Chapter01-284.jpg

图1-9-3 新闻分页显示效果图

任务实施

1.任务单

本次任务的任务清单见表1-9-2。

表1-9-2 任务九的任务清单

978-7-111-44979-9-Chapter01-285.jpg

2.实施步骤

步骤一 在GreenBar项目中添加一个Java文件CONSTANTS.java,包名为models,代码如下所示。

代码1-9-3 CONSTANTS.java

978-7-111-44979-9-Chapter01-286.jpg

【操作提示】

请模仿代码1-9-1的第3行代码的写法,完成第4行的代码。

步骤二 打开GreenBar项目中的Products.java(在任务8代码1-8-8中已定义),在原有的类的定义中,插入两个新的方法,代码如下所示。

代码1-9-4 Products.java中添加的方法

978-7-111-44979-9-Chapter01-287.jpg

978-7-111-44979-9-Chapter01-288.jpg

【操作提示】

1)请模仿代码1-9-2的第144~145行代码的写法,完成第13行的代码。

2)请模仿代码1-9-2的149行代码的写法,完成第27行的代码。

3)根据数据存取需求完成第35~44行的代码。

步骤三 在GreenBar项目中添加一个JSP文件products.jsp,代码如下所示。

代码1-9-5 products.jsp

978-7-111-44979-9-Chapter01-289.jpg

978-7-111-44979-9-Chapter01-290.jpg

978-7-111-44979-9-Chapter01-291.jpg

【操作提示】

请模仿代码1-9-2的第179~182行代码的写法,完成第118~121行的代码。

运行GreenBar项目,测试products.jsp,效果如图1-9-4所示。

978-7-111-44979-9-Chapter01-292.jpg

图1-9-4 产品分页显示效果图

自我评价

978-7-111-44979-9-Chapter01-293.jpg

思考与练习

一、填空题

1.如果产品中心页面最多能显示10件产品,产品表中存储了M条产品记录,那么产品的显示一共需要____页才能浏览完所有的产品。如果单击第3页的超链接,希望看到第3页的所有产品信息,那么应该从产品表的第____条记录开始查看数据。

2.如果要定义一个整型常量PRODUCT_SIZE,并赋值为10,应该如何写:____

3.ResultSet类中提供了____方法,用来直接定位到指定位置的记录。

4.ArrayList类提供了____方法,用来从指定索引的位置开始提取集合的一部分数据。

5.假设当前的页码为page,要显示数据的最大页码为maxpage,请完成如下分页超链接语句:

1)<ahref=____>第一页</a>

2)<ahref=____>上页</a>

3)<ahref=____>下页</a>

4)<ahref=____>末页</a>

二、操作题

模仿本次任务,实现留言中心的留言分页浏览功能,效果如图1-9-5所示。

978-7-111-44979-9-Chapter01-294.jpg

图1-9-5 留言分页显示效果图