作者:张纪豪(转载请注明出处)
(一)摘要与设计思想
海水无量,只取一瓢。大量的数据显示,分段提取是通用的做法,是的,这叫分页技术。
<t:p/>,对于WEB程序员,这种标签格式不会陌生。t:代表自定义标签库;p:分页标签。两个字母(具体的说它是6个字符组成)便可以搞定J2EE平台下所有分页功能。当然可以扩充,例如显示总记录数、总页数、当前页数、每页记录数等信息。
效果截图1:
效果截图2:
是不是很诱人?那好吧,笔者带大家开始艰难之旅吧。
艰难?呵呵,不用害怕,还是那套机制,只是不同的封装。
本文将从图书、新闻两个实体数据显示来详细介绍这种通用分页技术。
J2EE项目架构设计:
最初微软的Asp脚本语言给动态WEB应用程序开发带来广阔的天地,由此互联网更加精采,不过笔者没有用过Asp来架构过大型项目,因为听说中关村的程序员大部分都有颈椎病预期都是因为陷进了微软的泥潭(逗乐!)。对于那种将所有程序代码和网页显示代码混在一个文件中且脱离不了过程化的编程方法,用在大型项目的构建着实有些可怕。因此J2EE规范中将程序与页面代码分离是一次伟大的革新,并在后来演变成多层结构分层治之的思想,随后微软的C#效仿之,这才初步将程序员慢慢解放。
典型的J2EE项目分为模型-视图-控制三层,即MVC(Model-View-Controller),模型是整个项目中最复杂部分,它除了有核心的数据操纵技术,还需要紧密的业务逻辑,所以模型层又可包含模型领域、数据访问层、服务层;控制层有一个经典的框架是Struts,熟悉它的Action就知道控制层的作用;视图层较容易些,例如最广泛使用的JSP。通过MVC概念就知道原来说用JSP做项目就可看出自己还没有入行,现在已经不是微软的ASP时代,因为在J2EE里根本不用JSP就可以强大的WEB项目(例如页面用velocity模板技术而不用JSP)。这也就意味着J2EE项目里的视图不再局限于网页,它可能是Excel、PDF、Desktable Window等等。
本文阐述的分页技术围绕一个含数据领域为五层的小项目来展开描述,控制层和模型层都交给Spring管理,属真正的SSH集成开发模式:
表现层为采用JSP技术;
控制层采用当今最热门Struts(版本为1.x,不是Struts2) ,虽然我发现它的牙都快掉光了,但还是选择它以更能熟练掌握本分页方法;
模型层中含有服务层、数据库访问层和数据领域层,其中:
持久层采用Hibernate(版本3.2),Hibernate管理领域对象的配置采用注解方式,与xml方式配置功能是一样。
控制层和模型层全交给Spring容器管理。
数据库管理系统不太关心,因为现在是面向对象编程,你给Hibernate怎么配置,Hibernate就怎么实现。
下一节将介绍工程建立、数据领域模型以及它的映射到数据库必须的配置(上述本例采注解方式)、page对象的封装……
(二)项目工程基础和领域模型
一、工程基础:
1、我们先在MyEclipse开发工具里建一个WEB项目,并将各包建立如下:
com.zhangjihao.domain 存放领域对象,需要持久化到数据库的
com.zhangjihao.bean 存放非持久化到数据库的bean
com.zhangjihao.dao 数据访问层
com.zhangjihao.service 服务层
com.zhangjihao.web WEB层,其中web包下还有struts、filter、taglib等子包
com.zhangjihao.util 自己的工具包
2、准备所需的jar包:
再将Struts1.2、Spring2.5、Hibernate3.2、Log4j、Sun和Apache的工共组件、数据库驱动等等所需的jar包都拷入到WebRoot/WEB-INF/lib目录,并Build Path到MyEclipse中(一般MyEclipse会自动Build Path)。
3、xml文件的准备:
web.xml中加上Struts和Spring配置:
在struts-config.xml中加上(第四篇将有将更详细的内容):
准备一个Spring的xml配置文件:
由于web.xml里已经写了beans.xml,我们就用它作为Spring的配置文件,由于Hibernate也交给了Spring管理,我们就不需要给Hibernate写配置文件,而是将Hibernate配置信息写在beans.xml:
再在数据库管理系统中开一个库。通过上面的工作,我们的工程基础基本准备好。这些虽然偏主题,但笔者作事偏谨,故啰嗦了这么多,或许对刚接触SSH集成开发的朋友还是有很大的帮助。
二、实体搭建(Entity Bean):
我们这个主题在前面讲过围绕图书和新闻两个实体来描述分页方法,所以建立这个实体,并将Hibernate映射配置借助JPA标准在实体方法中通过注解来配置:
1、图书实体Book.java
2、新闻实体(News.java)
当然,这仅仅是为了描述分页技术,对于真正的应用,这种数据库设计是不完美的,例如最常用到图书分类、新闻分类、发布人、有效性设定等信息,在此都作省略。
编写java实体Bean时,都要养成几个习惯:
_实现Serializable接口;
_覆盖hashCode()和equals(Object obj)方法;
_不再用基本类型定义字段;
_定义了常用字段的构造方法时,一定要定义一个空的构造方法。
上面两个实体类都有两个构造方法,一个空的,一个是用于列表显示时用的。我们知道,当分页显示图书时,其每本书的内容介绍(description字段)是不需要显示出来的,因为当用户点某本书查看更多详细的书内容介绍时才需要显示图书描述(description字段),而往往在数据库中description字段中数据库甚至大于其它所有字段内容之和,所以从性能角度考虑,在分页显示时图书列表则不需要description字段,大家可仔细看看上面的构造方法。
还需要注意类名上和get方法上面的注解,它们功能和*.hbm.xmk文件内容差不多,不熟悉的朋友去看看JPA的书籍。
三、 Page Bean
下面是重点的Page类封装(Page.java)。
对于一个分页项,其中有三个重要的属性分别是:总记录数量、每页记录数量、当前页,有了这三个属性便可以计算出总页数,当然有必要再加一个url属性,因为第n页和n±1页对于服务器来讲是两个不同的页面,url便是用于页面的导向,好,下面看看详细的代码:
对于Page类的写法非常灵活,有点将查询结果封闭到该对象上,甚至有点将SQL语句封装里面,笔者认为只要达到功能,越简单越好。
事实上有了Page对象,整个思路就全部明白,后面的工作无非是将Page对象中的数据填充和显示出来