- 浏览: 1594509 次
- 性别:
文章分类
- 全部博客 (2929)
- 非技术 (18)
- Eclipse (11)
- JAVA (31)
- 正则表达式 (0)
- J2EE (4)
- DOS命令 (2)
- WEB前端 (52)
- JavaScript (69)
- 数据库 (8)
- 设计模式 (0)
- JFreechart (1)
- 操作系统 (1)
- 互联网 (10)
- EasyMock (1)
- jQuery (5)
- Struts2 (12)
- Spring (24)
- 浏览器 (16)
- OGNL (1)
- WebService (12)
- OSGi (14)
- 软件 (10)
- Tomcat (2)
- Ext (3)
- SiteMesh (2)
- 开源软件 (2)
- Hibernate (2)
- Quartz (6)
- iBatis (2)
最新评论
分页,在web应用程序中非常常见的功能,也是最基本的功能,IBATIS本身 提供了非常傻瓜式的分页组件,但是由于其本身的原理特点,使得它是以牺牲分页效率为代价的,分层思想的确很好,但是,我们也要意识到,多一层就代表好多花 点时间执行程序流程,所以,我们又会总是尽可能的聚合功能,其实,这是一个博弈,不管怎么样,先来看下我的自定义分页吧!
我采用的方式是,在IBATIS映射中用嵌套SQL语句方式进行分页,要进行分页,我们只需要知道页面尺寸以及总记录数,然后通过视图传递的当前页 号,计算出当前页之前的记录总数,然后从大于这个之前记录总数的下一条记录开始,显示和指定页面尺寸数量相同的记录,就得到了当前页的记录
首先,为每一个POJO实体类定义一个父类PageModel,所有需要分页操作的实体都必须继承这个类,该类定义了分页所需要的相关信息
1.PageModel类
/****** PageModel.java ******/
package model;
public class PageModel {
private int page=1;//当前页,初始为第一页
private int pagesize;//页面尺寸
private int pagecount;//总页面数量
private int recordCount;//总记录数
private int beforeCount;//页尺寸*(页数-1),当前页之前的记录总数
public int getBeforeCount() {
return (page-1)*pagesize;
}
//视图中读取当前页号
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
//视图中读取页面尺寸
public int getPagesize() {
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
//视图中读取页面数量
public int getPagecount() {
if(pagesize!=0)
return (recordCount+pagesize-1)/pagesize;
else
return 0;
}
//视图中读取总记录数
public int getRecordCount() {
return recordCount;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
}
2.定义POJO(继承PageModel)
package model;
public class Infor extends PageModel{
......................................................
}
3.配置IBATIS映射
................................................................
<select id="recordCount" resultClass="java.lang.Integer">
select count(*) AS [all] from infor
</select>
<select id="firstPage" resultClass="Infor" parameterClass="Infor">
select top $pagesize$ * from infor order by id desc
</select>
<select id="otherPage" resultClass="Infor" parameterClass="Infor">
<![CDATA[
select top $pagesize$ * from infor
where
(id<(select MIN(id) from (select top $beforeCount$ id from infor order by id desc) AS T))
order by id desc
]]>
</select>
.......................................
以这种SQL语句方式分页的话,由于第一页之前的记录总数显然为0,如果只统一采用otherPage这条SQL语句分页,根据PageModel 类的定义,$beforeCount$会出现0的情况,"top 0"在SQL中是不允许的,所以我们必须把第一页的查询和其他页的查询分开写,同时,我们还必须定义一个查询总记录数的SQL语句。
显然,要实现分页,我们必须传递一个POJO对象,该对象保存了定位到当前页所需要的所有SQL语句参数
4.编写DAO类
package dao;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import java.util.*;
import model.Infor;
public class InforDao extends SqlMapClientDaoSupport {
//读取所有信息数量,分页开始
public int recordCount(){
return Integer.parseInt(getSqlMapClientTemplate().queryForObject("infor.recordCount").toString());
}
public List<Infor> firstPage(Infor infor){
return getSqlMapClientTemplate().queryForList("infor.firstPage",infor);
}
public List<Infor> otherPage(Infor infor){
return getSqlMapClientTemplate().queryForList("infor.otherPage",infor);
}
}
5.编写BO类
package bo;
import dao.InforDao;
import model.Infor;
import java.util.*;
public class InforBo {
private InforDao dao;
public void setDao(InforDao dao) {//spring依赖注入
this.dao = dao;
}
//读取所有信息列表
public List<Infor> getInforList(Infor infor,int pagesize,int page){
infor.setRecordCount(dao.recordCount());
infor.setPagesize(pagesize);
infor.setPage(page);
if(infor.getPage()==1)
return dao.firstPage(infor);
else
return dao.otherPage(infor);
}
}
本类中,getInforList方法中,除了infor和page是必须的,pagesize为可选,普遍的我们希望页面尺寸可以在控制层自由选择,infor,page分别做为Action类的成员传递进来,为什么要这样做,看了后面action类的定义大家就明白了
6.编写ACTION类
package action;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import bo.InforBo;
import model.Infor;
public class InforListAction extends ActionSupport {
private InforBo inforBo;
private List<Infor> infors;
private Infor infor;
private int page=1;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public void setInforBo(InforBo inforBo) {
this.inforBo = inforBo;
}
public List<Infor> getInfors() {
return infors;
}
public Infor getInfor() {
return infor;
}
public String execute(){
infor=new Infor();
infors=inforBo.getInforList(infor, 20, page);
return SUCCESS;
}
}
至于分页标签,如“上一页”,“下一页”, 通过比如JSP标签对POJO对象的简单判断就能实现,以下是我实现的一个简单的分页标签
<s:if test="infor.page>1">
<a href="?page=1">第一页</a>
<a href="?page=<s:property value='page-1'/>">下一页</a>
</s:if>
<s:if test="infor.page<infor.pagecount">
<a href="?page=<s:property value='page+1'/>">下一页</a>
<a href="?page=<s:property value='infor.pagecount'/>">最后一页</a>
</s:if>
发表评论
-
spring2.0和spring2.5及以上版本的jar包区别 spring jar 包详解
2009-07-22 15:07 809spring jar 包详解 spr ... -
spring2.0升级到spring2.5
2009-07-22 15:09 822在spring2.0升级到spring2. ... -
spring2.5新特性(转)
2009-07-22 15:10 679简介 从诞生之初,Spring框架就坚守它的宗旨:简化企 ... -
Spring中使用FreeMaker或Vilocity模板发送邮件
2009-07-22 16:38 873本文以用户注册后为用户发送一封邮件为例子,讲述如何在Sprin ... -
Quartz与Spring的集成【转】
2009-08-05 15:21 7952.1 Scheduler 总入口 <bean n ... -
Quartz在Spring中动态设置cronExpression研究(spring设置动态定时任务)【转】
2009-08-05 15:49 848什么是动态定时任务:是由客户制定生成的,服务端只知道该 ... -
Spring结合Quartz实现多任务定时调用
2009-08-05 15:51 749Quartz框架提供了丰富的任务调度支持,比如 ... -
在Spring中使用Quartz进行任务调度
2009-08-06 10:30 851概述 各种企业应用几乎都会碰到任务调度的需求,就拿论坛 ... -
spring&quartz的项目应用总结
2009-08-06 12:20 868一.名词简介: Quartz是一个完全由java编写的开源作 ... -
Spring的transactionAttributes
2009-08-11 11:42 602PROPAGATION_REQUIRED--支持当前事务, ... -
Spring配置中transactionAttributes的意义
2009-08-11 11:43 814最近使用JSF+Spring+OpenJPA ... -
详解spring事务属性
2009-08-11 11:45 651Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我 ... -
acegi参考的部分翻译
2009-08-20 15:34 640序 1. 安全 1.1 准备 1 ... -
Acegi Security -- Spring下最优秀的安全系统
2009-08-20 15:40 797一Acegi安全系统介绍 Author: cac 差沙 ... -
【SSI开发总结.2】spring整合ibatis
2009-08-20 15:48 5981.Spring 配置文件: ... -
【SSI开发总结.1】struts2整合spring
2009-08-20 15:48 669在Struts2中整合Spring的IoC支持是一件十分简单的 ... -
【SSI开发总结.5】SiteMesh装饰器
2009-08-20 15:49 645SiteMesh项目简介 OS(OpenSymph ... -
【SSI开发总结.4】Spring中使用Acegi安全框架
2009-08-20 15:49 682Acegi认证授权主要基于 ... -
【SSI开发总结.7】Struts+Spring+Ibatis环境配置(二)
2009-08-20 15:50 602spring提供了ibatis的模板类封装,通过简单的设置就能 ... -
【SSI开发总结.6】Struts+Spring+Ibatis环境配置(一)
2009-08-20 15:50 751为了使struts2和spring集成,必须下载一个 ...
相关推荐
struts2+spring+ibatis做的小程序
DWC_ssi_user.pdf
jar包ssi,ssh需要的jar包,hibernate3.jar、ibatis-dao-2.jar、spring.jar、struts.jar、log4j-1.2.9.jar
小弟新手,第一次发自己的项目,整合了ssi,实现了ibatis连接oracle的分页,这个分页没有网上说的那么复杂,只是拼了sql分页语句就可以了
ssi_struts2_spring_ibatis oracle数据库.增删改查分页 示例.有简单页面.好资料.!
OMAP SSI port driver.
spring.struts,ibatis集成包,还有很多常用的包,这是我项目中用到的包,在这里备份一个,还有一部分在framework_lib2中
服务器电源SSI标准收集.pdf
shtml网页SSI使用详解.pdf
资源来自pypi官网。 资源全名:galileo-ssi-1.2.tar.gz
SSL证书卸载与SSI高级应用.pdf
用于将SSI协议转换成RS232协议,因为带SSI协议处理能力的单片机几乎没有
SSI框架整合 开发工具: MyEclipse8.5 框架版本: struts2、spring2.5、ibatis
使用Verilog 编程语言实现对11 bit 编码器SSI输出的读取
ssi struts2+spring+ibatis oracle lib ssi框架 架包
SSI library, Logic gates verilog codes
动态内容缓存技术(wenku)_CSI,SSI,ESI.pptx
本文是个人在学习过程中的学习笔记,详细讲解了如何使用iBatis2.x以及如何将其与Struts2.x,Spring3.x进行整合开发,其中包括iBatis基础使用,存储过程调用和数据库函数的调用。
ibatis中自己能运行的,还有能跟SSI整合的类库都在里面
网上其实整合框架的资料其实很多的,但是其中整合SSI的相对比较少的,如果是用Maven整合的就是少之又少的,如果是用Maven构建的企业级应用(多模块开发)整合SSI框架的实例基本上是没有的,所以写下这篇教程(当然这...