java web 通用的分页组件
JavaWeb三大组件

JavaWeb三⼤组件1.javaweb三⼤组件:servlet,listener,filter;都需要在web.xml中配置(除了两个感知监听器)。
2.服务器端⼩程序每个Servlet都是唯⼀的,能处理的请求是不同的(⽐如登录,查询);前⾯的调度由tomcat完成;要完成获取请求数据,处理请求,完成响应的任务。
3.实现servlet的三种⽅法:javax.servlet.Servlet接⼝,GenericServlet抽象类(service⽅法待实现),HttpServlet类(常⽤)。
4.Servlet接⼝5⼤⽅法:其中3个⽣命周期⽅法不由我们来调⽤,由Tomcat调⽤;对象也不⽤我们来创建,Tomcat创建。
4.1:init(ServletConfig):⽣命周期⽅法,在对象创建之后只执⾏⼀次;当第⼀次被请求才被创建;4.2:destroy():⽣命周期⽅法,在servlet对象被销毁之前调⽤,只调⽤⼀次;⽐如IO流等释放(很少);服务器被关闭时调⽤;4.3:service(ServletRequest,ServletResponse):⽣命周期⽅法,被调⽤多次⽤来处理请求;4.4:getServletConfig()(有⽤),getServletInfo()(⽆⽤)。
5.浏览器如何访问Servlet:必须把Servlet绑定到⼀个路径(web.xml配置):<servlet>name,class</servlet>,<servlet-mapping>name,url-pattern</servlet-mapping>,其中pattern必须/开头。
6.Servlet单例,线程不安全,效率⾼。
7.ServletConfig接⼝:对应的就是web.xml⾥的本Servlet的配置信息被xml解析器解析后,加载到⾥⾯;返回的实例的实现类是Tomcat提供的;7.1:getServletName()(⼏乎没⽤);7.2:getServletContext()(有⽤);7.3:getInitParameter[Names()]:初始化参数相关8.ServletRequest(Tomcat封装的请求信息),ServletResponse(设置状态码,设置响应头,发送html代码)。
java pageinfo用法

java pageinfo用法Java中的PageInfo用于分页查询时获取分页信息,包括总页数、总记录数、当前页码等。
PageInfo类是MyBatis自带的工具类,通过引入mybatis依赖后,可以直接使用。
使用PageInfo需要先进行分页查询,然后将查询结果传入PageInfo构造函数中。
例如:```javaList<User> userList =userMapper.selectByExample(example);PageInfo<User> pageInfo = new PageInfo<>(userList);```其中User是查询结果的实体类,example是查询条件。
通过PageInfo对象可以获取到以下分页信息:- getTotal():获取总记录数- getPages():获取总页数- getPageNum():获取当前页码- getPageSize():获取每页记录数- isHasNextPage():判断是否有下一页- isHasPreviousPage():判断是否有上一页- navigatepageNums(int navigatePages):获取当前页码的前后各navigatePages页码例如,获取总页数代码如下:```javaint total = pageInfo.getPages();```获取当前页码的前后各3页的页码:```javaint[] navigatePageNums = pageInfo.navigatepageNums(3); ```以上就是Java中PageInfo的用法。
java中封装pagehelper的方法

java中封装pagehelper的方法PageHelper 是一个常用的分页插件,它可以帮助我们快速实现分页功能,提高开发效率。
在 Java 开发中,封装 PageHelper 的方法可以帮助我们更好地管理和使用它。
下面我将介绍一种封装 PageHelper 的方法,供大家参考。
一、封装前的准备工作在封装 PageHelper 之前,我们需要先了解它的功能和使用方法。
PageHelper 提供了多种分页查询的方法,如 Skip 和 Take 方法的封装等。
同时,它还支持自定义条件查询和分页参数的设置。
因此,我们需要根据实际需求对PageHelper 进行封装。
二、封装的步骤1. 创建一个新的类,用于封装 PageHelper。
在该类中,我们可以定义一些公共的方法和变量,以便其他类调用和使用。
2. 在该类中,我们可以实现一个静态的初始化方法,用于初始化PageHelper 插件。
这个方法可以根据我们的配置和需要,加载相关的数据库驱动和配置信息。
3. 在封装的方法中,我们可以根据传入的参数(如分页的起始位置、每页的大小等)和自定义的条件进行分页查询。
查询结果可以根据需要返回实体类或数据列表。
4. 对于需要显示的数据列表,我们可以提供一个简单的转换方法,将结果转换成适合显示的格式(如 JSON 或 XML)。
5. 最后,我们可以在类的其他方法中调用封装的分页查询方法,使用户能够更加方便地使用 PageHelper。
三、示例代码下面是一个简单的示例代码,展示如何封装 PageHelper:```javapublic class PageHelperWrapper {// 初始化 PageHelper 插件public static void init(String driver) {// 根据实际需要加载数据库驱动和配置信息}// 分页查询方法,根据传入的参数进行分页查询public static List<Entity> paginate(int currentPage, int pageSize, String condition) {// 根据条件进行分页查询,返回实体类列表}// 转换方法,将结果转换成适合显示的格式public static String convert(List<Entity> entities) {// 将实体类列表转换成 JSON 或 XML 等格式return JSON.toJSONString(entities);}}```四、使用方法在使用封装后的 PageHelper 方法时,我们只需要按照以下步骤进行操作:1. 初始化 PageHelper 插件:调用 PageHelperWrapper 类的 init 方法,传入数据库驱动信息。
Java实现分页功能常见的几种方法

Java实现分页功能常见的⼏种⽅法⼀、limit关键字service层@Service@Transactionalpublic class ImplStudentService implements StudentService {@Resourceprivate StudentDao studentDao;@Overridepublic List<Student> selectAllStudent(String province, Integer offset, Integer limit) {return studentDao.selectAll(province,offset,limit);}}sql语句select * from student where province = #{province} limit #{offset},#{limit}⼆、hibernate分页service层@Overridepublic List getStudents(Integer pageNo,Integer pageSize) throws Exception {// 分页数据int[] startIdAndCount = new int[2];startIdAndCount[0] = pageNo * pageSize;startIdAndCount[1] = pageSize;return studentDao.selectStudentsByPage(startIdAndCount);}dao层@Overridepublic List findByHqlPage(int[] startIdAndCount) throws Exception {String hql = "...";try {Query query = getSession().createQuery(hql);// 设置分页if (startIdAndCount != null && startIdAndCount.length > 0) {int rowStartIdx = Math.max(0, startIdAndCount[0]);if (rowStartIdx > 0) {query.setFirstResult(rowStartIdx);// 设置开始取值的索引}if (startIdAndCount.length > 1) {int rowCount = Math.max(0, startIdAndCount[1]);if (rowCount > 0) {query.setMaxResults(rowCount);// 设置结束取值的索引}}}return query.list();} catch (RuntimeException re) {log.error("分页查询失败!", re);throw re;}}三、截取List查询结果分页(简单粗暴)...List<StudentEnroll> students = studentlDao.getAllStudents();int count = 0;if(studentEnrolls != null && studentEnrolls.size() > 0) {count = studentEnrolls.size();int fromIndex = pageNo * pageSize;int toIndex = (pageNo + 1) * pageSize;if(toIndex > count) {toIndex = count;}List<StudentEnroll> pageList = studentEnrolls.subList(fromIndex, toIndex);...四、mybatis框架pageHelper插件分页Spring整合:导⼊pom.xml<!-- https:///artifact/com.github.pagehelper/pagehelper --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version></dependency>配置项⽬配置⽂件(我在spring和mybatis整合的配置⽂件中配置的,如果在mybatis核⼼配置⽂件中配置,百度⼀下) <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 依赖数据源 --><property name="dataSource" ref="dataSource"/><!-- 注册加载myBatis映射⽂件 --><property name="mapperLocations"><array><value>classpath*:com/yyz/mapper/*Mapper.xml</value></array></property><!-- PageHelper分页配置 --><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><!--使⽤下⾯的⽅式配置参数,⼀⾏配置⼀个,后⾯会有所有的参数介绍 --><value><!--helperDialect属性来指定分页插件使⽤哪种⽅⾔。
pagehelper new pageinfo原理

pagehelper new pageinfo原理PageHelper是一个开源的Java分页插件,它能够自动拦截数据库操作并进行分页处理,使开发者可以将精力集中于业务逻辑的实现而无需过多关注分页细节。
而PageInfo则是PageHelper的一个非常重要的实体类,它包含了当前页码、每页记录数、总记录数、总页数等分页相关的信息。
下面就来详细解析一下PageHelper和PageInfo的原理。
PageHelper的原理PageHelper是基于MyBatis的拦截器实现的,它通过Java自省机制分析SQL语句中包含的分页参数并构造分页SQL语句。
具体实现流程如下:Step 1:在MyBatis配置文件中配置PageHelper插件。
Step 2:在需要进行分页查询的Mapper接口中定义方法,并使用PageInfo对象作为参数,将查询结果封装到PageInfo对象中。
Step 3:在Mapper中编写原始SQL语句,所有查询条件都写在这条语句中,PageHelper会在此基础上自动添加分页相关的SQL语句段。
Step 4:运行程序,PageHelper会自动拦截所有的查询SQL并进行分页处理,返回一个封装好分页信息和查询结果的PageInfo对象。
PageHelper的核心源码是PageInterceptor类,它根据不同的数据库类型(如MySQL、Oracle等)构造适用于当前数据库的分页SQL 语句,同时拦截执行被MyBatis调用的SQL语句并将分页参数解析后存入分页上下文中。
PageInfo的原理PageInfo继承自Page类,是PageHelper中另一个非常重要的实体类。
它负责存储分页信息,包括当前页码、每页记录数、总记录数、总页数等常用的分页信息。
具体实现如下:Step 1:在Mapper接口中定义查询方法,并使用PageInfo作为返回值类型。
Step 2:编写查询SQL语句,PageHelper会自动拦截并进行分页处理。
pagehelper count参数

pagehelper count参数摘要:I.简介- 介绍PageHelper 是什么以及它的作用II.参数详解- 介绍PageHelper 中的count 参数- 解释count 参数的作用- 分析count 参数的取值及其意义III.使用示例- 给出一个使用PageHelper 的count 参数的实际例子- 解释这个例子的运行过程以及结果IV.总结- 回顾PageHelper count 参数的重要性和使用方法- 给出一些使用PageHelper count 参数的建议和提示正文:PageHelper 是一个Java 分页插件,可以方便地实现分页功能。
在PageHelper 中,count 参数是一个非常重要的参数,用于控制分页的显示。
count 参数用于设置分页的大小。
它的取值范围通常为1 到1000,默认值为10。
当我们在查询数据时,可以通过设置count 参数来控制每页显示的数据条数。
例如,如果我们设置count 参数为50,那么查询结果就会按照每页50 条的方式进行分页显示。
在使用PageHelper 时,可以通过以下方式设置count 参数:```// 设置count 参数为50PageHelper.startPage(1, 50);```其中,第一个参数表示当前页码,第二个参数表示每页显示的数据条数。
需要注意的是,count 参数的取值不能太小,否则可能会影响查询性能。
下面是一个使用PageHelper count 参数的实际例子:```// 设置count 参数为50PageHelper.startPage(1, 50);// 执行查询List<User> userList = userMapper.selectAll();// 获取分页信息PageInfo<User> pageInfo = new PageInfo<>(userList);// 返回分页结果return new PageResult<>(pageInfo);```在这个例子中,我们通过设置count 参数为50,实现了每页显示50 条数据的功能。
java 集合分页方法

java 集合分页方法在Java中,可以使用集合(Collection)和分页技术来实现分页功能。
以下是一个简单的Java分页方法的示例:```javaimport ;import ;public class PaginationHelper<T> {private int pageSize;private int currentPage;private List<T> dataList;public PaginationHelper(int pageSize, int currentPage, List<T> dataList) {= pageSize;= currentPage;= dataList;}public List<T> getPageData() {int start = (currentPage - 1) pageSize;int end = start + pageSize;if (start < 0) {start = 0;}if (end > ()) {end = ();}if (start >= end) {return new ArrayList<>();} else {return (start, end);}}}```这个`PaginationHelper`类包含一个泛型类型`T`,表示要分页的数据类型。
构造函数接受三个参数:每页的大小、当前页码和数据列表。
`getPageData()`方法返回当前页的数据列表。
它首先计算起始和结束索引,然后使用`subList()`方法从数据列表中提取出当前页的数据。
如果起始索引小于0或大于数据列表的大小,则返回一个空列表。
使用示例:```javaList<String> dataList = new ArrayList<>();// 添加数据到dataList中...PaginationHelper<String> paginationHelper = new PaginationHelper<>(10, 1, dataList);List<String> pageData = ();```在这个示例中,我们创建了一个`PaginationHelper`对象,将每页大小设置为10,当前页码设置为1,并将数据列表传递给构造函数。
Web打印组件jatoolsPrinter

Web打印组件jatoolsPrinter应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于web的应用,客户端的规则很简单,容易学习,容易维护,容易发布。
但对程序员来说,因为浏览器的局限性,却要面对很多挑战。
怎么样来进行基于web的套打,就是这么一个令多数程序员头痛不已的问题。
基于web的套打,难度在于要将浏览器中呈现的html,精确地打印到票据中,而且能够实现对分页位置的控制。
下面就ie浏览器所能采用的套打解决方案,来个汇总分析,希望对大家有所帮助。
jatoolsPrinter是一款实现网页套打的免费工具。
该工具的特点是可以直接对web页面进行精确的分页打印,这不仅使“会设计网页就会做网页套打”成为可能,也使项目经理们摆脱了预算紧张的压力。
jatoolsPrinter通过在网页中嵌入控件,解决了web客户端精确打印,批量打印,打印配置自动保留等问题。
jatoolsPrinter官方正式免费版,支持ie6+,。
功能特点:真正免费,不加水印,没有ip或域名限制,不限时间,兼容ie6+无须注册,下载即用提供经过微软数字签名的cab自动安装包,安装更方便长期升级保障,免费论坛支持,让你无后顾之忧稳定可靠,启动速度远胜同类产品常用功能集于一身,简约而不简单,软件大小只有84k本文主要介绍jatoolsPrinter打印控件来完成web的打印功能,这个控件已经把打印功能封装的非常好,主要是把这个控件引入,之后写一些简单的js代码就能完成相应的打印功能。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title></title><!--插入打印控件 --><object id="jatoolsPrinter"classid="CLSID:B43D3361-D075-4BE2-87FE-0571********"codebase="jatoolsPrinter.cab#version=5,7,0,0"></object><script type="text/javascript">functiondoPrint(how) {//打印文档对象varmyDoc = {documents: document, // 打印页面(div)们在本文档中copyrights: '杰创软件拥有版权 ' // 版权声明必须};// 调用打印方法if (how == '打印预览...')jatoolsPrinter.printPreview(myDoc); // 打印预览else if (how == '打印...')jatoolsPrinter.print(myDoc, true); // 打印前弹出打印设置对话框elsejatoolsPrinter.print(myDoc, false); // 不弹出对话框打印}</script></head><body><form id="form1" runat="server"><div id='page1' style='width:300px;height:300px;'>test</div><input type="button" value="打印预览..." onclick="doPrint('打印预览...')"/><input type="button" value="打印..." onclick="doPrint('打印...')"/><input type="button" value="打印" onclick="doPrint('打印')"/> </form></body></html>主要分几个步骤:一、引入打印控件jatoolsPrinter<!--插入打印控件 --><object id="jatoolsPrinter"classid="CLSID:B43D3361-D075-4BE2-87FE-0571********"codebase="jatoolsPrinter.cab#version=5,7,0,0"></object>二、给要打印的div取id名三、编写js代码实现打印div的功能(注意:在同一页面中,有多个可打印文档,他们可以用page_div_prefix属性来区别page_div_prefix前缀+page+页序号构成可打印div的id,如前缀为'report1' ,则找到以'report1page1'为id的div作为文档首页该属性,默认值为空)注意事项:1. 控件在打印指定div对象时,如果纸张太小不够打印时,超出部分将被截掉(clip)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CSDN博客专栏重磅推出,汇集精华系列博文!提交原创APP,20万等你赢【Android编程之旅】社区活动:写博文获精彩图书!java web 通用的分页组件2008-07-27 00:09 2820人阅读评论(9) 收藏举报通用的分页组件有时候找到一个合适的web表格分页组件真是一件痛苦的事情,要么是没有完全封装的分页方法,使用起来比较麻烦,不够方便,要么使用方便,但很难同项目结合,也有许多开源分页组件,功能非常强大,但使用起来有很多问题,有些不好与系统结合,有些不好扩展,但总感觉有些浮肿,很多功能不够实用,也没多大意义,就此尝试写了一个分页组件,够用了,但也有不少问题,望大家共同修正.1、HTML元素java封装:为了操作方便起见,private String value = "";private String text = "";public HtmlElement(String tagName) {this.tagName = tagName;}public void setValue(String value) {this.value = value;}public List<HtmlElement> getChildren() {return children;}public void addChild(HtmlElement element) { this.children.add(element);}public void addAttribute(String name, String value) { this.attributes.put(name, value);}public String getAttributeValue(String name) { return this.attributes.get(name);}@Overridepublic String toString() {return this.toHtml();}public String toHtml() {StringBuffer sb = new StringBuffer();sb.append("<");sb.append(this.tagName);sb.append(this.getAttr());sb.append(">");sb.append(this.value);for (HtmlElement e : this.children) {sb.append(e.toHtml());}sb.append(this.text);sb.append("</");sb.append(this.tagName);sb.append(">");return sb.toString();}例如:生成:2、数据表格类package commons.page;import java.util.Calendar;import java.util.List;import commons.page.model.ArrayDataModel;import commons.page.model.DataModel;import commons.page.model.ListDataModel;public class HtmlTable extends HtmlElement {private HtmlElement thead = new HtmlElement("thead");private HtmlElement tbody = new HtmlElement("tbody");private HtmlElement tfoot = new HtmlElement("tfoot");private String[] header = null;private String[] footer = null;private DataModel dataModel = null;private int startRowIndex = -1;// 开始行索引private int maxRowNum = -1;// 最大行数private CellCallBack callBack;public HtmlTable() {super("table");}public void setCellCallBack(CellCallBack callBack) { this.callBack = callBack;}public void setMaxRowNum(int maxRowNum) { this.maxRowNum = maxRowNum;}public void setStartRowIndex(int startRowIndex) { this.startRowIndex = startRowIndex;}public void setHeader(String[] header) {this.header = header;}public void setHeader(String header) {this.header = header.split(",");}public void setFooter(String[] footer) {this.footer = footer;}public void setFooter(String footer) {this.footer = footer.split(",");}public void setDataModel(DataModel dataModel) {this.dataModel = dataModel;}public void setData(Object[][] data) {this.dataModel = new ArrayDataModel();this.dataModel.setWrappedData(data); }public void setData(List data) {this.dataModel = new ListDataModel();this.dataModel.setWrappedData(data); }public void setTbody(HtmlElement tbody) { this.tbody = tbody;}public void setTfoot(HtmlElement tfoot) { this.tfoot = tfoot;}public void setThead(HtmlElement thead) { this.thead = thead;}@Overridepublic String toHtml() {String id = this.getAttributeValue("id");if (id == null || "".equals(id)) {this.addAttribute("id", "table" + Calendar.getInstance().getTimeInMillis());}this.process();return super.toHtml();}private void process() {if (this.header != null) {this.thead.getChildren().clear();HtmlElement tr = new HtmlElement("tr");for (String header : this.header) {HtmlElement th = new HtmlElement("th");th.setText(header);tr.addChild(th);}this.thead.addChild(tr);this.addChild(this.thead);}if (this.dataModel != null) {if (this.callBack == null) {this.callBack = new CellCallBack() {public HtmlElement doCell(Object data) {HtmlRow tr = new HtmlRow();if (data instanceof String[]) {String[] ds = (String[]) data;int len = ds.length;if (header != null) {if (len > header.length) {len = header.length;}}for (int i = 0; i < len; i++) {HtmlElement td = new HtmlElement("td");td.setText(ds[i] == null ? "" : ds[i]);tr.addChild(td);}} else if (data instanceof Object[]) {Object[] os = (Object[]) data;int len = os.length;if (header != null) {if (len > header.length) {len = header.length;}}for (int i = 0; i < len; i++) {HtmlElement td = new HtmlElement("td");td.setText(os[i] == null ? "" : os[i].toString());tr.addChild(td);}}return tr;}};}int startRow = 0;int endRow = 0;int j = this.dataModel.getRowCount();if (this.startRowIndex > 0) {startRow = this.startRowIndex;}if (this.maxRowNum < 0) {endRow = this.dataModel.getRowCount();} else {endRow = startRow + this.maxRowNum;}if (endRow > j) {endRow = j;}this.tbody.getChildren().clear();for (int i = startRow; i < endRow; i++) {this.dataModel.setRowIndex(i);HtmlElement tr = this.callBack.doCell(this.dataModel.getRowData());this.tbody.addChild(tr);}if (endRow - startRow < this.maxRowNum) {for (int i = 0; i < (this.maxRowNum - (endRow - startRow)); i++) {HtmlElement row = TableUtil.createRow(new String[this.header.length]);this.tbody.addChild(row);}}this.addChild(this.tbody);}if (this.footer != null) {this.tfoot.getChildren().clear();HtmlElement tr = new HtmlElement("tr");for (String footer : this.footer) {HtmlElement td = new HtmlElement("td");该类主要功能是将提供的表头,表尾数据及表格数据生成对应的HTML, 并且可以设置需要显示的数据内容(从某行开始到某行),并提供了多种数据模型供选择包括数组数据,List数据,并可以通过继承DataModel实现其中的方法来自定义.3、统一数据模型if (_listeners == null) {_listeners = new ArrayList();}_listeners.add(listener);}public DataModelListener[] getDataModelListeners() {if (_listeners == null) {return new DataModelListener[0];}return (DataModelListener[]) _listeners.toArray(new DataModelListener[_listeners.size()]);}abstract public int getRowCount();abstract public Object getRowData();abstract public int getRowIndex();abstract public Object getWrappedData();abstract public boolean isRowAvailable();DataModel来源于JSF中DataModel,并且有ArrayDataModel,ListDataModel,ResultDataModel,ScalarDataModel等多种实现,基本上有ArrayDataModel,ListDataModel 就够用了,如果不够可以自己继承DataModel实现来实现.4、分页类**/public class Pager {private int totalRows; // 总行数private int pageSize = 13; // 每页显示的行数private int currentPage; // 当前页号private int totalPages; // 总页数private int startRow; // 当前页在数据库中的起始行public Pager() {currentPage = 1;startRow = 0;}private void process() {totalPages = totalRows / pageSize;int mod = totalRows % pageSize;if (mod > 0) {totalPages++;}if (this.currentPage <= 0) {currentPage = 1;}startRow = (currentPage - 1) * pageSize; }public int getStartRow() {return startRow;}public int getTotalPages() {return totalPages;}public int getCurrentPage() {return currentPage;}public int getPageSize() {return pageSize;}public void setTotalRows(int totalRows) { this.totalRows = totalRows;this.process();}// public void setStartRow(int startRow) {// this.startRow = startRow;// }// public void setTotalPages(int totalPages) { // this.totalPages = totalPages;// }public void setCurrentPage(int currentPage) { this.currentPage = currentPage;this.process();}public void setPageSize(int pageSize) { this.pageSize = pageSize;this.process();}public int getTotalRows() {return totalRows;}public void first() {currentPage = 1;startRow = 0;}public void previous() {if (currentPage == 1) {return;}currentPage--;startRow = (currentPage - 1) * pageSize; }public void next() {// System.out.print("next:");if (currentPage < totalPages) {currentPage++;}startRow = (currentPage - 1) * pageSize; }public void last() {currentPage = totalPages;startRow = (currentPage - 1) * pageSize;Pager类来源于互联网,主要负责分页操作.5、最终分页类操作private int mode = 0;// 模式0:内存分页,1:数据库查询分页private PageDataCallBack callBack;// 适用于mode=1时(数据库查询分页),为HtmlTable提供DataModel数据模型回叫对象private String id = "";// 分页表格ID,默认值为2098,该ID将在一个页面使用多个分页表格时作为唯一标识,标记正在操作的分页表格,如果有重复,将不能正常工作private final static String DEFAULT_ID = "2098";public PageDataTable(HttpServletRequest request, String id, int mode) {this.init(request, id, mode);}public PageDataTable(HttpServletRequest request, int mode) {this.init(request, DEFAULT_ID, mode);}public PageDataTable(HttpServletRequest request, String id) {this.init(request, id, 0);}public PageDataTable(HttpServletRequest request) {this.init(request, DEFAULT_ID, 0);}private void init(HttpServletRequest request, String id, int mode) { this.mode = mode;this.id = id;String op = request.getParameter("__OPERATE__" + this.id);String gopage = request.getParameter("__GOPAGE__" + this.id);String cpage = request.getParameter("__CPAGE__" + this.id);String maxsize = request.getParameter("__MAXROWSIZE__" + this.id);// System.out.println("===" +op+"---"+gopage+"---"+cpage);this.operate = op == null ? 0 : ("".equals(op) ? 4 : Integer.parseInt(op));this.gopage = gopage == null ? 1 : Integer.parseInt(gopage);this.cpage = cpage == null ? 1 : Integer.parseInt(cpage);this.rowsize = maxsize == null ? -1 : Integer.parseInt(maxsize);}public void setTable(HtmlTable table) {this.table = table;}public void setPageSize(int pageSize) {this.pager.setPageSize(pageSize);}public void setTotalRows(int totalRows) {this.pager.setTotalRows(totalRows);}public void setPageDataCallBack(PageDataCallBack callBack) {this.callBack = callBack;}public String render() {// 预分页操作处理this.process();// 内存分页设置其开始行索引为当前页开始索引,如果为数据库查询分页,则设置开始行索引为0 if (this.mode == 0) {this.table.setStartRowIndex(this.pager.getStartRow());} else {this.table.setStartRowIndex(0);}// 设置表格最大显示行数this.table.setMaxRowNum(this.pager.getPageSize());// mode=1时,数据库查询分页设置分页表格DataModel对象,通常数据库查询也在此时执行if (this.callBack != null) {this.table.setDataModel(this.callBack.doPage(this.pager.getStartRow(),this.pager.getPageSize()));}// 分页表格界面组织,容器DIVHtmlElement div = new HtmlElement("div");div.addAttribute("class", "horse_data_page");div.addAttribute("id", "horse_" + this.id);// 分页表格DIVHtmlElement div1 = new HtmlElement("div");div1.addAttribute("class", "horse_page_table");div1.addChild(this.table);div.addChild(div1);// 分页工具条HtmlElement pageBar = new HtmlElement("Table");pageBar.addAttribute("width", "100%");HtmlElement row = new HtmlElement("tr");row.addChild(this.getPageInfo1());row.addChild(this.getPageInfo2());row.addChild(this.getPageInfo3());row.addChild(this.getPageInfo4());pageBar.addChild(row);// 操作用到的脚本HtmlElement script = new HtmlElement("script");script.addAttribute("language", "javascript");script.setValue("function pageOperate" + this.id + "(value){var op=document.getElementById(/"__OPERATE__" + this.id + "/"); op.value=value; op.form.submit();}");div.addChild(script);return div.toHtml();}/***处理翻页操作*/private void process() {if (this.rowsize > 0) {this.pager.setPageSize(this.rowsize);}this.pager.setCurrentPage(this.cpage);if (this.operate == 0) {this.pager.first();} else if (this.operate == 1) {this.pager.previous();} else if (this.operate == 2) {} else if (this.operate == 3) {st();} else if (this.operate == 4) {this.gopage = (this.gopage > this.pager.getTotalPages()) ?this.pager.getTotalPages() : this.gopage;this.pager.setCurrentPage(this.gopage);}}/***分页信息1,输出记录信息,总共m页,n条记录**@return*/private HtmlElement getPageInfo1() {HtmlElement cell1 = new HtmlElement("td");int st = this.pager.getStartRow() <= 0 ? 1 : this.pager.getStartRow();st++;int ed = (this.pager.getStartRow() + this.pager.getPageSize()) >this.pager.getTotalRows() ? this.pager.getTotalRows() : (this.pager.getStartRow() + this.pager.getPageSize());cell1.setValue("总共" + this.pager.getTotalPages() + "页," + this.pager.getTotalRows() +"条记录");return cell1;}/***分页信息2,输出首页上一页下一页末页翻页信息**@return*/private HtmlElement getPageInfo2() {HtmlElement cell = new HtmlElement("td");HtmlElement a1 = new HtmlElement("a");HtmlElement a2 = new HtmlElement("a");HtmlElement a3 = new HtmlElement("a");HtmlElement a4 = new HtmlElement("a");a1.setValue(" 首页");a2.setValue(" 上一页");a3.setValue(" 下一页");a4.setValue(" 末页");if (this.pager.getCurrentPage() > 1) {a1.addAttribute("href", "#");a1.addAttribute("onclick", "pageOperate" + this.id + "('0')");a2.addAttribute("href", "#");a2.addAttribute("onclick", "pageOperate" + this.id + "('1')");}if (this.pager.getTotalPages() > this.pager.getCurrentPage()) {a3.addAttribute("href", "#");a3.addAttribute("onclick", "pageOperate" + this.id + "('2')");a4.addAttribute("href", "#");a4.addAttribute("onclick", "pageOperate" + this.id + "('3')");}cell.addChild(a1);cell.addChild(a2);if (this.pager.getTotalPages() >= 10) {int p = this.pager.getTotalPages() / 10;int st = (this.pager.getCurrentPage() - 5) > 0 ? (this.pager.getCurrentPage() - 5) : 1;int ed = ((this.pager.getCurrentPage() + 5) <= p) ? (this.pager.getCurrentPage() + 5) : p;for (int i = st; i < ed; i++) {HtmlElement a = new HtmlElement("a");a.addAttribute("href", "#");a.addAttribute("onclick", "pageOperate('5')");cell.addChild(a);}}cell.addChild(a3);cell.addChild(a4);return cell;}/***分页信息3显示转到某一页**@return*/private HtmlElement getPageInfo3() {HtmlElement cell3 = new HtmlElement("td");HtmlElement input = new HtmlElement("input");input.addAttribute("id", "__GOPAGE__" + this.id);input.addAttribute("name", "__GOPAGE__" + this.id);input.addAttribute("type", "text");input.addAttribute("size", "4");//input.addAttribute("onKeyUp", "this.value=this.value.replace(///D/g,'')");input.addAttribute("value", this.pager.getCurrentPage() + "");cell3.setValue("第" + input.toHtml() + "页");HtmlElement b = new HtmlElement("button");b.addAttribute("onclick", "pageOperate" + this.id + "('4')");b.setValue("转到");cell3.addChild(b);return cell3;}/***分页栏信息列4**@return*/private HtmlElement getPageInfo4() {HtmlElement cell4 = new HtmlElement("td");// 当前页隐藏域HtmlElement input1 = new HtmlElement("input");input1.addAttribute("id", "__CPAGE__" + this.id);input1.addAttribute("name", "__CPAGE__" + this.id);input1.addAttribute("type", "hidden");input1.addAttribute("value", this.pager.getCurrentPage() + "");// 操作隐藏域HtmlElement input2 = new HtmlElement("input");input2.addAttribute("id", "__OPERATE__" + this.id);input2.addAttribute("name", "__OPERATE__" + this.id);input2.addAttribute("type", "hidden");// 当前最大显示数据行HtmlElement input3 = new HtmlElement("input");input3.addAttribute("id", "__MAXROWSIZE__" + this.id);input3.addAttribute("name", "__MAXROWSIZE__" + this.id);input3.addAttribute("value", (this.rowsize == -1 ? this.pager.getPageSize() : this.rowsize) + "");input3.addAttribute("type", "hidden");cell4.addChild(input1);cell4.addChild(input2);cell4.addChild(input3);return cell4;}}这是最终操作分页的类,结合HtmlTable和Pager实现分页.6、例子:import java.util.List;import javax.servlet.http.HttpServletRequest;import commons.page.model.DataModel;import commons.page.model.ListDataModel;public class TestPage {/***内存分页测试**@param request*@return*/public static String se(HttpServletRequest request) {int len = 125;String[][] data = new String[len][6];for (int i = 0; i < data.length; i++) {data[i] = new String[] { "String列1-" + i, "String咧2-" + i, "String烈3-" + i, "String 烈4-" + i, "String烈5-" + i, "String烈6-" + i };}List<Object[]> d2 = new ArrayList<Object[]>();for (int i = 0; i < len; i++) {Object[] o = new Object[] { "list列1-" + i, "list咧2-" + i, "list烈3-" + i, "list烈4-" + i,"list烈5-" + i, "list烈6-" + i };d2.add(o);}HtmlTable t = new HtmlTable();t.addAttribute("width", "100%");t.addAttribute("border", "1");// t.setData(data);//数组测试t.setData(d2);// List测试t.setHeader("标题1,标题3,标题4,标题6,标题5");t.setCellCallBack(new CellCallBack() {public HtmlRow doCell(Object data) {// 数组测试// String[] s = (String[] ) data;// HtmlRow row = TableUtil.createRow(new Object[] {// s[0],s[2],s[3],s[5],s[4]});// List测试Object[] s = (Object[]) data;HtmlRow row = TableUtil.createRow(new Object[] { s[0], s[2], s[3], s[5], s[4] });return row;}});PageDataTable p = new PageDataTable(request, 0);p.setPageSize(12);p.setTotalRows(len);p.setTable(t);return p.render();}/***查询分页测试**@param request*@return*/public static String se2(HttpServletRequest request) {final int len = 125;HtmlTable t = new HtmlTable();t.setHeader("标题1,标题3,标题4,标题6,标题5");PageDataTable p = new PageDataTable(request, "__my_2098_", 1);p.setPageSize(9);p.setTotalRows(len);p.setPageDataCallBack(new PageDataCallBack() {@Overridepublic DataModel doPage(int startRow, int maxRow) {List<Object[]> d2 = new ArrayList<Object[]>();// 下面为测试所用,模拟数据库查询,实际使用时将startRow,maxRow两个变量传入SQL语句查询数据库获取相应的记录int endRow = (startRow + maxRow) > len ? len : (startRow + maxRow);for (int i = startRow; i < endRow; i++) {Object[] o = new Object[] { "list列1-" + i, "list咧2-" + i, "list烈3-" + i, "list 烈4-" + i, "list烈5-" + i, "list烈6-" + i };d2.add(o);}DataModel dataModel = new ListDataModel();dataModel.setWrappedData(d2);return dataModel;}});p.setTable(t);return p.render();}}JSP页面:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"><%@page import="commons.page.TestPage"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><style type="text/css">@IMPORT url("<%=request.getContextPath()%>/css/page_gird.css");</style></head><body><div onclick="op(1)">sadas</div><form method="post"><%out.print(TestPage.se(request));%><%out.print(TestPage.se2(request));%></form></body></html>page_gird.css文件@CHARSET "UTF-8";.horse_data_page {height: auto;width: 100%;padding: 0px;margin: 0px;}.horse_data_page .horse_page_table {background-color: #FFFFFF;width: 100%;padding: 0px;margin: 0px;}.horse_data_page .horse_page_table table {width: 100%;border-collapse:collapse;border-spacing: 0px;empty-cells : show;table-layout:fixed;border-top-width: 4px;border-right-width: 0px;border-bottom-width: 4px;border-left-width: 0px;border-top-style: solid;border-right-style: solid;border-bottom-style: solid;border-left-style: solid;border-top-color: #3399CC;border-right-color: #CCCCCC;border-bottom-color: #3399CC;border-left-color: #CCCCCC;background-color: #FFFFFF;}.horse_data_page .horse_page_table table thead th { border: 1px solid #CCCCCC;padding: 4px;background-color: #E3E3E3;font-size:14px;text-align:center;white-space:nowrap;}.horse_data_page .horse_page_table table tbody td { border: 1px solid #CCCCCC;padding: 3px;font-size:12px;overflow:hidden;white-space:nowrap;text-overflow : ellipsis;}.horse_data_page input {border: 1px solid #CCCCCC;background-color: #FFFFFF;font-size:12px;}.horse_data_page button {border: 1px solid #CCCCCC;background-color: #FFFFFF;font-size:12px;FILTER:progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorstr='#EBEB EB', endColorstr='#CCCCCC');}.horse_data_page table {border-right-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-right-style: solid;border-bottom-style: solid;border-left-style: solid;border-right-color: #CCCCCC;border-bottom-color: #CCCCCC;border-left-color: #CCCCCC; background-color: #EBEBEB;border-collapse:collapse;width: 100%;font-size:12px;}.horse_data_page table td {border: 0px solid #666666;font-size:12px;padding: 2px;margin: 0px;}.horse_data_page a:link {text-decoration: none;}.horse_data_page a:visited {text-decoration: none;}.horse_data_page a:hover {最终效果图:。