行业网站--分页和翻页功能实现

  1. 系统实现机制
  2. 涉及的关键技术

1. 系统实现机制

采集系统通过Strus2实现了MVC模式。
实现机制如下:


图1 系统功能实现机制

2. 涉及的关键技术

2.1 分页功能

分页功能涉及以下技术点:

  • 分页需要的参数考虑
  • 通过SQL语句实现高效分页
第一个技术点 分页需要考虑的参数

要实现分页,有四个参数是必须要考虑的:

  1. 当前页(current page):需要实时记录和传递,初始值为1
  2. 总的信息条数(all info count):通过数据库查询获取
  3. 每个页面要显示的信息数(page size):可以人为设置
  4. 总页数(total page) = all info count / page size

在实际的例子中,是写了一个PageRoll的类,将上面的四个参数都封装在这个类中。通过对于该类的访问,获取分页所需的数据。

第二个技术点 通过SQL语句实现高效分页

这里主要是通过SQL中ROW_NUMBER()语句实现分页,语句如下:

select temp.rownumber,* from 
(select ROW_NUMBER() over (order by score desc) rownumber,* from KeyWords) 
temp where temp.rownumber>? and temp.rownumber<=?";
// 填充sql语句
ps.setInt(1, (pageRoll.getCurrPage() - 1) * pageRoll.getPageSize());
ps.setInt(2, pageRoll.getCurrPage() * pageRoll.getPageSize());

先看子查询,ROW_NUMBER() over()函数首先是生成一个新的列,列名称是rownumber,而这一列是按照KeyWords表中的score字段降序排列的规则生成。有了这个新列(根据需求生成),就可以通过外层查询控制每次查询该列的消息数,进而控制了前台页面消息数的显示。
通过上述两个技术点,就能够实现分页了。

2.2 翻页功能实现

在讲这个知识点之前,也必须要弄清几个技术点:

  • JSP——include的使用
  • JSP动作元素<jsp:include>和<jsp:param>的搭配使用
  • JSP中request与requestScope的区别
第一个技术点 JSP——include的使用

JSP中,include是一个经常用到的标签。当应用程序中所有的页面的某些部分(如标题、页脚和导航栏)都相同的时候,我们就可以考虑用include。但是相同的部分有静态的(装载进页面显示后再也不变的),有动态的(装载进页面后还会改变,如:随时间改变、随用户行为改变等)。

那么,对这两种类型的内容的包含方式一样吗?当然不一样。

第一种,静态包含 <%@ include file=”包含页面”%>
静态包含一般用于加载进页面显示后就再也不变的东西,比如页眉、背景、标题等等。静态包含不会检查所含文件的变化,把文件包含进来后,被包含文件的修改变化是不会影响已被包含进来的内容的。因为,静态包含发生在编译阶段。

比如:a.jsp中使用了语句 <%@ include file="b.jsp"%>,把b.jsp包含了进来,那么在编译a.jsp文件时,会直接把b.jsp文件的内容全部内嵌到a.jsp文件中包含b的语句的位置。然后运行a,显示a页面。也就是说,静态include是先把被包含文件的内容全部复制内嵌到包含文件中,再进行编译运行的。也正是因为要把b包含进a,所以b中的变量等不能与a重复,否则会报错。

第二种,动态包含 <jsp:include page=" " flush="true"/>
动态包含用于加载经常变化的、要求显示最新版本内容的东西,比如提交时间戳:用户打开博客编辑页面时,有一个时间加载进来了。用户编写完博客,点击提交时,就应该使用/显示提交瞬间的时间而不是打开编辑页面时的那个时间。所以这里要用的就是最新时间。

由上面我们知道,静态include是先包含进来,再编译,运行并传回浏览器显示的,所以不能满足我们要求某些部分使用最新内容的要求。那么,我们就要用到动态include。

动态include与静态include的最大不同在于:包含文件与被包含文件都是先编译执行,再包含。二者的编译阶段是相互独立的,只有在包含文件的include语句处把被包含文件的执行结果包含进来。换言之,包含文件先编译,执行。执行到了include语句的时候才触发被包含文件的编译、执行,并实时把结果包含进来。从而达到获取最新的被包含内容的目的。

同样使用a.jsp包含b.jsp的例子:加入a.jsp中动态include了b.jsp。现在,a先编译成servlet类文件,然后运行,当运行到包含b的语句处,引起b的编译,运行,并把b的运行servlet运行结果包含进a。最后a顺利运行完毕,把a的servlet类运行结果输出到浏览器显示。

第二个技术点 JSP动作元素<jsp:include>和<jsp:param>的搭配使用

当<jsp:include>和<jsp:param>动作元素一起使用时,可以将<jsp:param>中提供的参数值传递到<jsp:include>要加载的文件中去,因此当<jsp:include>和<jsp:param>结合使用时,可以在加载文件(页面)的过程中同时向该文件(页面)提供信息。

第三个技术点 JSP中request与requestScope的区别

(1)request对象通常用来接收从客户端通过表单提交过来的数据,然后在servlet或者action中用request.getParameter()的方法获取获取参数内容;
(2)requestScope通常是在servlet和action中通过request.setAttribute()方法把数据放到request对象中供客户端获取,然后客户端获取的方法就是requestScope.getAttribute()。

结论就是:
①request.getParameter(“username”)等价于{param.username },它们一般用在服务器获取页面或客户端的内容,这些内容都是String的; ②request.getAttribute(“username”)等价于{requestScope.username},一般是从服务器传递数据到页面,在页面中获取服务器保存在其中的数据内容。

OK,三个关键的技术点已经讲解清楚,下面进入正题:

图2 翻页部分实现机制

实例代码如下:
后台显示页面(keyWords.jsp)include翻页页面(pageroll.jsp)的代码

<jsp:include page="../commonUser/pageroll.jsp" flush="true">
<jsp:param value="keywordsInback" name="action" />
</jsp:include>

上面代码中,设置flush为true,表明若缓冲区的内容很多了,就将数据读出,以免数据泄漏,造成错误。而keywordsInback是后台的一个方法,将其作为参数动态传递给pageroll.jsp页面。

当后台显示页面(keyWords.jsp)加载,数据渲染到此处时,首先将keywordsInback方法作为参数传递给pageroll.jsp。

pageroll.jsp,显示翻页的代码

<form action="${param.action}" name="pageRollForm" method="post">
        当前是第${requestScope.pageRoll.currPage }页|
        共${requestScope.pageRoll.pageCount }页|
        共${requestScope.pageRoll.totalCount }条记录<br></br>
</form>

代码中,{param.action}调用jsp传递的参数(后台调用keywordsInback方法)。{requestScope.pageRoll.currPage }等价于request.getAttribute(“pageRoll.currPage”)获取当前页。

而通过${param.action},可以调用后台的keywordsInback方法,每次点击翻页时,都调用该方法,提交上面代码表单中的数据,获取到当前页数据,实现页面翻页显示。

keywordsInback方法,负责分页参数的获取、传递和处理

ArrayList<KeyWord> listData = keywordDao.getKeyWordsDBInbackground(pageRoll);//get data in database.
request.setAttribute("pageRoll", pageRoll);//set current page
request.setAttribute("list", listData);//set list data

上面代码负责返回分页所需数据(pageRoll)和后台页面渲染所需数据(listData)。注意,因为在pageroll.jsp中是通过${requestScope.pageRoll.currPage }来获取当前页的,所以此处必须要使用request.setAttribute,而不是request.setParameter。

至此,翻页功能就实现了。

ps:写文章真是件辛苦的差事,鬼知道我经历了什么!O(∩_∩)O

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,565评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,785评论 0 11
  • 前面讲了servlet入门实践现在开始介绍jsp入门实践,开发环境的搭建请参考我前面的tomcat的文章,jsp入...
    伊豚wall阅读 3,358评论 2 56
  • 1. 世上诸事,不能太得意忘形,狗血的结局往往会给人一记当头棒喝! 昨天,地铁上的桥段真心欢快地笑了一路,真是被那...
    墨语花开时阅读 290评论 2 2
  • 这是心灵自由写作群第三期第十四次作业。 最近看了武志红写的《关于李雪》,这是我看过的武志红写的最真诚的一篇文章。我...
    灰菠萝阅读 529评论 2 1