jsp分页技术
1、以下为分页类:
import java.io.Serializable;
import java.util.List;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
public class ResultFilter<T> implements Serializable{
private static final long serialVersionUID = 5472321653620726832L;
private final static int DEFAULT_NAVIGATOR_SIZE = 5;
//当前页
private int currentPage = 1;
//每页显示数量
private int pageSize = 5;
//总条数
private int totalCount;
private boolean havaNextPage;
private boolean havePrePage;
private int navigatorSize;
//存放查询结果用的list
private List<T> items;
public ResultFilter(){
}
public ResultFilter(int totalCount, int pageSize, int currentPage) {
this(totalCount, pageSize, currentPage, DEFAULT_NAVIGATOR_SIZE);
}
public ResultFilter(int totalCount, int pageSize, int currentPage,
int navigatorSize) {
this.totalCount = totalCount;
this.pageSize = pageSize;
this.currentPage = currentPage;
this.navigatorSize = navigatorSize;
}
public int getPageCount() {
int pageCount = 0;
if (pageSize != 0) {
pageCount = totalCount / pageSize;
if (totalCount % pageSize != 0)
pageCount++;
}
return pageCount;
}
public int getCurrentPage() {
currentPage = currentPage < getPageCount() ? currentPage :
getPageCount();
currentPage = currentPage < 1 ? 1 : currentPage;
return currentPage;
}
public int getPageSize() {
return pageSize;
}
public int getTotalCount() {
return totalCount;
}
public boolean isHaveNextPage() {
havaNextPage = false;
if ((getPageCount() > 1) && (getPageCount() > getCurrentPage()))
havaNextPage = true;
return havaNextPage;
}
public boolean isHavePrePage() {
havePrePage = false;
if ((getPageCount() > 1) && (currentPage > 1))
havePrePage = true;
return havePrePage;
}
private int getNavigatorIndex(boolean isBegin) {
int beginNavigatorIndex = getCurrentPage() - navigatorSize / 2;
int endNavigatorIndex = getCurrentPage() + navigatorSize / 2;
beginNavigatorIndex = beginNavigatorIndex < 1 ? 1 : beginNavigatorIndex;
endNavigatorIndex = endNavigatorIndex < getPageCount() ?
endNavigatorIndex :
getPageCount();
while ((endNavigatorIndex - beginNavigatorIndex) < navigatorSize &&
(beginNavigatorIndex != 1 || endNavigatorIndex != getPageCount())) {
if (beginNavigatorIndex > 1)
beginNavigatorIndex--;
else if (endNavigatorIndex < getPageCount())
endNavigatorIndex++;
}
if(isBegin)
return beginNavigatorIndex;
else
return endNavigatorIndex;
}
public int getBeginNavigatorIndex() {
return getNavigatorIndex(true);
}
public int getEndNavigatorIndex() {
return getNavigatorIndex(false);
}
public List<T> getItems() {
return items;
}
public void setItems(List<T> items) {
this.items = items;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
}
2、在spring的controller中调用分页类:
@RequestMapping(value="/xxxList") //xxxList.jsp对应的controller
public ModelAndView xxxList(@ModelAttribute ResultFilter<xxx> rf){
systemService.listServiceAll(rf); //调用步骤3 ,分页获取xxx对象
return new ModelAndView("路径/xxxList", "rf", rf); //此处跳转到步骤5所表示的网页,并传递分页参数rf,其中“路径/xxxList”
//表示对应的jsp网页,比如myBook/bookList表示myBook目录下的bookList.jsp
}
3、连操作数据库的service层 获取全部service
@Transactional(readOnly = false)
public void listServiceAll(ResultFilter<Services> rf){
int count=getServiceList().size();
rf.setTotalCount(count);
rf.setItems(serviceDao.getListForPage("from Services", (rf.getCurrentPage() - 1 )* rf.getPageSize(), rf.getPageSize()));
//调用步骤4,分页查询数据库
}
4、
// -------------- 分页QL Query --------------//
@SuppressWarnings("unchecked")
public List<T> getListForPage(String hql,int begin,int num){
Query query = getSession().createQuery(hql);
return query.setFirstResult(begin).setMaxResults(num).list();
}
5、路径/xxxList 对应的jsp网页(注意第四行)
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<%@ taglib uri="my-taglib" prefix="my"%> <!--使用了自定义标签,该标签在步骤6中定义-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>XXXList</title>
</head>
<body>
<form>
<table id="contentTable" >
<tbody>
<c:url value="/xxxDetail" var="url1"></c:url>
<c:url value="/xxxList" var="url1"></c:url> <!--该jsp对应的controller-->
<tr><c:forEach items="${rf.items}" var="xxx">
<td valign="top" style="width:229px;oveflow:hidden;">
<table>
<tr><td ><a name="click to check the detail" href="${url1}?xxxId=${xxx.id}"><img src="${ctxStatic}/images/123.jpg"></img></a></td></tr>
<tr><td >${xxx.attribute1}</td></tr>
<tr><td >${xxx.attribute2}</td></tr>
</table>
</td>
</c:forEach>
</tr>
</tbody>
</table>
<div style="padding-top:30px;"></div>
<my:paging curr="${rf.currentPage}" total="${rf.pageCount}" size="${rf.pageSize}" href="${url2}"/> <!--使用了自定义标签-->
</form>
</body>
</html>
6、自定义标签‘my’
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>My Tag Library</description>
<tlib-version>1.0</tlib-version>
<short-name>my</short-name>
<uri>my-taglib</uri>
<tag>
<description>split page</description>
<name>paging</name>
<tag-class>aaa.bbb.ccc.PagingTag</tag-class> <!--用到了步骤7中的PagingTag类 ,aaa.bbb.ccc是PagingTag的路径-->
<body-content>empty</body-content>
<attribute>
<description>base href</description>
<name>href</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>curr page</description>
<name>curr</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>page size</description>
<name>size</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>total page</description>
<name>total</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>curr parameter name</description>
<name>cparam</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<description>page size parameter name</description>
<name>sparam</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<dynamic-attributes>false</dynamic-attributes>
</tag>
<tag>
<description>front split page</description>
<name>frontPaging</name>
<tag-class>com.aspire.cms.demo.framework.tag.FrontPagingTag</tag-class>
<body-content>empty</body-content>
<attribute>
<description>base href</description>
<name>href</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>result filter</description>
<name>rf</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<dynamic-attributes>false</dynamic-attributes>
</tag>
</taglib>
7、自定义标签类
package aaa.bbb.ccc;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import org.apache.commons.lang.StringUtils;
public class PagingTag extends SimpleTagSupport {
private String href;
//当前页
private String cparam;
//每页条数
private String sparam;
private int curr;//当前页
private int size;//每页条数
private int total;//总页数
@Override
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
if(StringUtils.isEmpty(cparam)) {
cparam = "currentPage";
}
if(StringUtils.isEmpty(sparam)) {
sparam = "pageSize";
}
if(!href.endsWith("?") && !href.endsWith("&")) {
if(href.indexOf("?") == -1) {
href = href + "?";
} else {
href = href + "&";
}
}
if (curr <= 0) {
curr = 1;
} else if (curr > total) {
curr = total;
}
out.append("<span>");
// 首页
if (curr == 1) {
out.append("首页");
} else {
href(out, href, 1, "首页");
}
out.append(" | ");
// 上一页
if (curr == 1) {
out.append("上一页");
} else {
href(out, href, curr - 1, "上一页");
}
out.append(" | ");
// 下一页
if (curr == total) {
out.append("下一页");
} else {
href(out, href, curr + 1, "下一页");
}
out.append(" | ");
// 末页
if (curr == total) {
out.append("末页");
} else {
href(out, href, total, "末页");
}
out.append("</span>");
out.append("<span>第");
out.append(curr + "/" + total);
out.append("页</span>");
super.doTag();
}
private void href(JspWriter out, String href, int curr, String title) throws IOException {
out.append("<a href=\"").append(href).append(cparam).append("=").append("" + curr).append("&").append(sparam).append("=").append("" + size).append("\">").append(title).append("</a>");
}
public int getCurr() {
return curr;
}
public void setCurr(int curr) {
this.curr = curr;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public String getHref() {
return href;
}
public void setHref(String href) {
this.href = href;
}
public String getCparam() {
return cparam;
}
public void setCparam(String cparam) {
this.cparam = cparam;
}
public String getSparam() {
return sparam;
}
public void setSparam(String sparam) {
this.sparam = sparam;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
jsp分页技术的更多相关文章
- JSP分页技术的实现(利用当前页进行前后加减,并利用href进行当前页面传值,传值当然是那个当前值变量)
一.可滚动结果集 Connection con = DriverManager.getConnection(); PreparedStatement stmt = con.prepareStat ...
- 眼下最好的JSP分页技术
2005-08-24 来源:CSDN 作者:wanchao2001 前言 在使用数据库的过程中,不可避免的须要使用到分页的功能,但是JDBC的规范对此却没有非常好的解决.对于这个需求非 ...
- jsp-------------之分页技术(一)
jsp分页技术之: 如下图:百度的喵 看上图中卡哇伊的小苗的爪子下面的数字,就是分页啦!那我们如何做出这样一个效果呢? 下面我们来逐一分解: jsp分页技术一 : (算法) /* int pageS ...
- JSP的分页技术
在实际应用中,如果从数据库中查询的记录特别的多,甚至超过了显示屏的显示范围,这个时候可将结果进行分页显示. 假设总记录数为intRowCount,每页显示的数量为inPageSize,总页数为intP ...
- Javaweb 第15天 web练习和分页技术
第15天 web练习和分页技术 复习day14内容: 学习新技术的思路? 分析功能的思路? 使用queryRunner操作数据库的步骤? ResultSetHandler接口常用实现类(三个重点)? ...
- Jsp分页的简单制作
Jsp分页的简单制作 运行环境:jsp+tomcat+eclipse 技术:servlet+jsp+mysql 分页技术还区分两个:假分页和真分页 假分页:一次性从数据库读出表的所有数据一次性的返回给 ...
- 改进Spring中的分页技术
Spring中有一个PagedListHolder,能够实现分页. 但此类有几个缺点: 1. 使用此类的代码比較繁琐 2. 此类存放的数据源是全部的记录集,即对于记录数为1000条的数据,即使我们仅仅 ...
- JAVAEE之-----MySQL分页技术(带搜索)
需求: 为什么须要採用分页技术呢?在数据库中我们查询数据的时候,须要将数据返回到显示页面.数据库中含有大量数据,所有显示在一个页面过于太多,所以我们须要採用分页技术.每一页显示不同数据. 主要解决这个 ...
- Mysql学习总结(32)——MySQL分页技术详解
1.什么是数据分页:数据分页就是将很多条记录像书本一样分页,每页显示多少行记录: 2.为什么要数据分页:当我们进行sql语句查询时,假如数据有成千上万行记录,如果在同一个页面去显示,那这个页面得有多大 ...
随机推荐
- 【UML九种图系列】之用例图
用例图: 由参与者(Actor).用例(UseCase)以及它们之间的关系构成的用于描述系统功能的动态视图称为用例图.用例图描述了系统提供的一个功能单元.用例图的主要目的是帮助开发团队以一种图形化的方 ...
- NodeJs读取源代码使用的字符集
今天用NodeJs写了个简单的客户端/服务器程序,并让客户端向服务器发送汉字.当在Windows上执行客户端时,发现服务器端打印的接收到的数据是乱码.后来发现Windows上的客户端文件的储存编码方案 ...
- 浅析@Deprecated
如果有一个方法你觉得不合适,想要删除,但是别人已经引用了很多次,删除了会对他人的工作产生影响,那该怎么办? 加入@Deprecated注解即可,看代码: @Test public void test1 ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(二)
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
- 推断类型var
1.为什么使用推断类型var var可以根据变量的初始值自动推断局部变量类型,当无法确定所用变量的具体类型时可使用var 2.如何使用推断类型var 客户端代码 static void Main(st ...
- 40多个非常有用的Oracle 查询语句
给大家介绍是40多个非常有用的Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有Oracle 开发者都必备的技能,所以快快收藏吧! 日期 ...
- 两种隐藏元素方式【display: none】和【visibility: hidden】的区别及由此引出的问题
此前看到一随笔(@任天缘 原文)讲了这个问题,并总结了: [display: none]:隐藏元素及元素内的所有内容,并且该元素的位置.宽高等其他属性值一并“消失”: [visibility: hid ...
- Spring Framework jar官方直接下载路径
SPRING官方网站改版后,建议都是通过 Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常麻烦,下给出Spring Framework jar官方直接下载路径: h ...
- IIS配置不正确可能导致“远程服务器返回错误: (404) 未找到"错误一例。
今天上传附件出现了下图所示的问题: 查找百度发现http://www.cnblogs.com/chuncn/archive/2009/09/08/1562759.html 文中提的比较靠谱. 但是,设 ...
- js - 在拼接字符串中动态submit当前form
今天在做一个项目的时候, mapabc中的inforWindow中,如果是超链接a,不直接响应. 后来的解决方案是动态产生form,并调用summit方法.如下 自定义一个js函数: function ...