JSP实现分页效果

来源:脚本之家  责任编辑:小易  

jsp用c标签实现分页的方式如下:<%@ tag language="java&q

本文实例为大家分享了JSP实现分页的具体代码,供大家参考,具体内容如下

楼上居然可以写出如此牛掰的语句,令俺很惊讶..不用那么复杂.首先你要知???你现在这一编的id然后

咱们在浏览网页的时候,当一个页面的数据不足以展示完全所有的内容,一般都涉及到分页,下一页的功能该怎么实现呢?首先我们来分析一下:

jsp页面:<%@ page language="java" cont

那么直接上代码:

<%! int pageSize=4;int pageCount;int showP

这里需要备注一下,本次的代码是在对三层优化之后进行操作的,所以我先把数据访问层的重构代码贴出来:

分页依据: select 字段列表 from 表名 limit m,n; m: 表示起始记录

package org.ThreeLayer.DButil; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.ThreeLayer.Entity.Student; public class DButil { public static final String driver = "com.mysql.cj.jdbc.Driver"; public static final String url = "jdbc:mysql://localhost:3306/zxy?&useSSL=false&serverTimezone=UTF-8&useSSL=false&serverTimezone = GMT"; public static final String username = "root"; public static final String password = "zxy170518."; public static Connection connection = null;//链接数据库 public static PreparedStatement pstmt=null;//执行sql语句 public static ResultSet rs=null; public static Connection getConnection() throws SQLException, ClassNotFoundException { Class.forName(driver); return DriverManager.getConnection(url,username,password); } public static int getTotalCount(String sql) { int count=0; try { pstmt=createPrepareStatement(sql, null); rs=pstmt.executeQuery(); if(rs.next()) { count=rs.getInt(1); } }catch(SQLException e) { e.printStackTrace(); }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(Exception e) { e.printStackTrace(); }finally { closeAll(connection, pstmt, rs); } return count; } public static PreparedStatement createPrepareStatement(String sql,Object[] obj) throws ClassNotFoundException, SQLException { pstmt=getConnection().prepareStatement(sql); if(obj!=null) { for(int i=0;i<obj.length;i++) { pstmt.setObject(i+1, obj[i]);//进行更新动作 } } return pstmt; } public static boolean UpdateSQL(String sql,Object[] obj) { try { pstmt=createPrepareStatement(sql, obj); int count=pstmt.executeUpdate(); if(count>0) { return true; } else { return false; } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; }finally { closeAll(connection,pstmt,rs); } } public static ResultSet FindSQL(String sql,Object[] obj) { try { pstmt=createPrepareStatement(sql, obj); rs=pstmt.executeQuery(); return rs; }catch(ClassNotFoundException e) { e.printStackTrace(); return rs; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return rs; }catch(Exception e) { e.printStackTrace(); return rs; } } public static void closeAll(Connection connection,PreparedStatement pstmt,ResultSet rs) { try { if(connection!=null); connection.close(); if(pstmt!=null); pstmt.close(); if(rs!=null); rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(Exception e) { e.printStackTrace(); } } }

我没养狗,可从电视上看过:当你遛狗时,一定要将狗置于身边或身后,狗狗会理解成主人在主导局面,它会比较平静;若狗狗走在你前面,它会认为自己在主控并时刻准备保护主人,此时的它警觉、敏感甚至有些激动,并呈现出攻击性。这是从一档美国驯狗专家的节目中了解到的,分享。

基本上就是普通的数据库操作功能,很好懂,就不多解释了;

哪怕作为一个OPPO手机用户,也觉得这个问题有点夸大了。Vivo不知道,2016年IDC数据显示,OPPO取得了国内市场第一,但是也并不能说击败了其他品牌。国际数据公司(IDC)最新发布的手机季度跟踪报告显示出了2016年全年中国智能手机市场的出货量排名。而刚刚出炉的2017年7月智能手机出货量排名上,OPPOR11也确实是占据了市场第一的位置。华为的定位更加商务,更加适合企业精英与成功人士,而OPPO则更加贴近年轻用户的需求,前后2000万像素,后置双摄的拍照工艺,流畅的系统,时尚的外观更为时下年轻人打造,因此才会受到更多年轻人的追捧。也许从手机的销量上可以看出OPPO比华为占据了更多的市场

对于数据访问层的Dao:

可是,面对着一张数千元的维修账单和需要重做的洗手间水管,物业和装修公司到底谁该为目前的情况负责,又成了最大的问题:物业坚持认为这次的漏水是由装修公司施工不当导致管道破损造成的;而装修公司拒不承认,按照他们的说法,他们进场装修的时候整个卫生间的墙壁就有轻微的渗水,应该是墙体渗水,加上前几天连续下雨……到底是谁的责任?天晓得。但最可怜的还是曹先生自己,不但弄好的部分得重新做,还得耽误上不少的工期。而他唯一遗憾的,就是当初太心急开工而没有做一次验房。不少读者总以为,所谓的验房是在装修后检查施工情况的。其实不然。相反,真正的验房是你从开发商或者是售房者手中拿到房子、开始装修之前进行的。【装修后的那个我

public int getTotalCount()//查询数据总数 { String sql="select count(1) from student"; return DButil.getTotalCount(sql); } public List<Student> findStudentByPage(int currentPage,int pageSize)//currentPage:当前页数;pageSize页面所能容纳的最大数据量 { String sql="select * from student limit ? , ?"; Object[] obj= {currentPage*pageSize,pageSize}; List<Student> students=new ArrayList<>(); ResultSet rs=DButil.FindSQL(sql, obj); try { while(rs.next()) { Student student=new Student(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getInt(4)); students.add(student); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return students; }

美国:狂吠3声即是扰民1.美国有三部涉犬法律,在美国的居民区内、犬吠超过三声,狗主人就要受到相关法律的惩罚,这就是著名的“三吠”原则。三部涉及狗的法律为:《恶犬法》、《妨碍公共利益法》和《联邦动物保护法》。这些法律共同构成了全面的养狗法治体系,既赋予公民养狗的权利,也同时有力约束美国人的养狗行为,规定养狗不得影响他人生活,以此保护不养狗的人不受邻家“恶犬”干扰的权利。2.当然,法律也充分考虑到了“狗权”,专门规定狗狗走入每个家庭需要获得的基本待遇。例如,要想养一条狗,狗的主人必须先缴纳20美元到50美元的注册费,给狗建立正式“户口”;为了不让狗狗饿着,养狗人要去超市给狗买狗粮;为了不让狗狗闷着

对于业务逻辑层:

Server:

public int getTotalCount() { return studentdao.getTotalCount(); } public List<Student> findStudentByPage(int currentPage,int pageSize) { return studentdao.findStudentByPage(currentPage, pageSize); }

对于视图层的后台代码:

Servlet:

package org.Three.Servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.ThreeLayer.Entity.Page_S; import org.ThreeLayer.Entity.Student; import org.ThreeLayer.Server.Student_Server; public class findStudentByPage extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Student_Server studentS=new Student_Server(); // int currentPage=2; Page_S pag=new Page_S(); String tmp=request.getParameter("currentPage"); if(tmp==null)//判断是否为第一次进行访问 { tmp="0"; } int sum=studentS.getTotalCount(); pag.setTotalCount(sum); int currentPage= Integer.parseInt(tmp); pag.setCurrentPage(currentPage); String tmp2=request.getParameter("choose"); if(tmp2==null)//默认一页3个内容 { tmp2="3"; } int pageSize=Integer.parseInt(tmp2); pag.setPageSize(pageSize); List<Student> students =studentS.findStudentByPage(currentPage, pageSize); pag.setStudents(students); request.setAttribute("pag", pag); request.getRequestDispatcher("index.jsp").forward(request, response); System.out.print(students); System.out.print(sum); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

还有一个实体类:Page:

package org.ThreeLayer.Entity; import java.util.List; public class Page_S {//为了不出现于重名,改了一下 private int currentPage; private int pageSize;//页面大小,即页面数据个数 private int totalCount;//总数据 private int totalPage;//总页数 private List<Student> students; public Page_S() { } public Page_S(int currentPage, int pageSize, int totalCount, int totalPage, List<Student> students) { this.currentPage = currentPage; this.pageSize = pageSize; this.totalCount = totalCount; this.totalPage = totalPage; this.students = students; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; this.totalPage=this.totalCount%this.pageSize==0?this.totalCount/this.pageSize:this.totalCount/this.pageSize+1; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } }

最后贴上index.jsp:

<%@page import="java.util.List"%> <%@page import="org.ThreeLayer.Entity.Student"%> <%@page import="org.ThreeLayer.Entity.Page_S"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>学生信息管理</title> </head> <body> <table border=1px> <tr> <th>学号</th> <th>姓名</th> <th>性别</th> <th>操作</th> </tr> <% Page_S pagg=(Page_S)request.getAttribute("pag"); for(Student student:pagg.getStudents()) { %> <tr> <th><a href="FindStudentById_Servlet?uid=<%=student.getId()%>" ><%=student.getId() %></a></th> <th><%=student.getName() %></th> <th><%=student.getSex() %></th> <th><a href="DeleteStudent_Servlet?uid=<%=student.getId()%>" >删除</a></th> </tr> <% } %> </table> <a href="add.jsp" >增加</a> <% if(pagg.getCurrentPage()==0)//用户位于首页的时候 { %> <a href="findStudentByPage?currentPage=<%=pagg.getCurrentPage()+1%>" >下一页</a> <a href="findStudentByPage?currentPage=<%=pagg.getTotalPage()-1%>" >尾页</a> <% }else if(pagg.getCurrentPage()==pagg.getTotalPage()-1)//用户位于尾页的时候 { %> <a href="findStudentByPage?currentPage=0" >首页</a> <a href="findStudentByPage?currentPage=<%=pagg.getCurrentPage()-1%>" >上一页</a> <% }else//用户位于中间页面的时候 { %> <a href="findStudentByPage?currentPage=0" >首页</a> <a href="findStudentByPage?currentPage=<%=pagg.getCurrentPage()+1%>" >下一页</a> <a href="findStudentByPage?currentPage=<%=pagg.getCurrentPage()-1%>" >上一页</a> <a href="findStudentByPage?currentPage=<%=pagg.getTotalPage()-1%>" >尾页</a> <% } %> <br> </body> </html>

看一下效果图:

首先看数据库内容:

然后是首页:

下一页:

最后是尾页:

总的说明一下:

首先对于功能的阐述,第一步计算总的数据量,然后规定默认容量大小为3,最终在jsp代码中加上跟用户进行交互的功能,即让用户选择一页多少内容(由于我写的那个有点bug,就先不贴,等后面自己能完美实现之后,再更新),之后对前端数据进行打包,要思考的是,我们对于这个功能我们所需要的数据有哪些呢?首先,总数据量要吧?然后要存放总的数据内容吧?然后页面大小需要吧?然后用户所在页面的那个页面位置的数要吧?最后一个就是通过总数据量和页面大小计算出来的总页面数也需要吧?所以,一共就需要记录5个属性值,那就打包成一个JavaBean吧,前面代码也贴出来了。最后要提一点,对于如果我第一次进行访问页面的时候,我应该是有一些属性值是为null的,这样是会报空指针异常的,那么就要进行一些小小的处理,哪些呢?比如如果用户第一次进行访问,系统是收不到用户当前所在页面的页面数值的,那么就要判断一下,(此处上代码)如果是第一次进行访问,那么就给与一个默认值0,也就是第一页,那么就处理好了这个小问题了,诸如此类问题还有就是用户在进行选择一页多少内容的时候,也是需要进行赋予一个默认值的,不然也会报空指针。然后对于web.xml文件内容的设置,首页应该设置为实现分页功能的Servlet,因为你每做一次翻页或者首次访问,虽然都是在index.jsp中,但是你需要把每次做完动作之后得到的新的内容进行请求转发,这样才能实现更新,不然程序会报错。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

JSP中, 怎样实现分页功能(代码)???

 分页显示是web数据库应用中经常需要遇到的问题,当用户的数据库查询结果远远超过了计算机屏幕的显示能力的时候,我们该如何合理的将数据呈现给用户呢?答案就是数据库分页显示,可以完美的解决上述问题.下面是一个数据库分页操作的通用实例,对任何数据库平台上的分页功能都有很好的借鉴意义. 【推荐阅读:项目要用到的主要源代码 】

//变量声明 【扩展信息:J2ME学习笔记(三) 】

<%

java.sql.connection sqlcon; //数据库连接对象

java.sql.statement sqlstmt; //sql语句对象

java.sql.resultset sqlrst; //结果集对象

java.lang.string strcon; //数据库连接字符串

java.lang.string strsql; //sql语句

int intpagesize; //一页显示的记录数

int introwcount; //记录总数

int intpagecount; //总页数

int intpage; //待显示页码

java.lang.string strpage;

int i;

//设置一页显示的记录数

intpagesize = 2;

//取得待显示页码

strpage = request.getparameter("page");

if(strpage==null){//表明在querystring中没有page这一个参数,此时显示第一页数据

intpage = 1;

}

else{//将字符串转换成整型

intpage = java.lang.integer.parseint(strpage);

if(intpage<1) intpage = 1;

}

如何在JSP中实现分页显示

以前用jsp做过分页,给你分析一下主要思路:

1.变量的设置:

分页中涉及的变量主要有 总页数,每页显示的记录数,当前页数,总记录数

总页数=总记录数%每页显示的记录数==0?总记录数/每页显示的记录数:总记录数/每页显示的记录数+1

2.查询语句的设计:

sqlServer,mySql中一般采用top分页

select top 每页显示的记录数 from Table where 主键列 not in (select top (当前页数-1)*每页显示的记录数 主键列 from Table)

oracle一般借助伪列来分页

3.按钮可用不可用问题

当前页为第一页时灰掉上一页,当前页为最后一页时灰掉下一页,其他类似! 至于样式就看个人喜好了!

在JSP中如何实现分页技术啊?

title: JSP分页技术实现

summary:使用工具类实现通用分页处理

author: evan_zhao

email: evan_zhao@hotmail.com

目前比较广泛使用的分页方式是将查询结果缓存在HttpSession或有状态bean中,翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间,并且缓存的数据也会占用大量内存,效率明显下降。

其它常见的方法还有每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中差不多也是需要遍历所有记录,实验证明在记录数很大时速度非常慢。

至于缓存结果集ResultSet的方法则完全是一种错误的做法。因为ResultSet在Statement或Connection关闭时也会被关闭,如果要使ResultSet有效势必长时间占用数据库连接。

因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。

在oracle数据库中查询结果的行号使用伪列ROWNUM表示(从1开始)。例如select * from employee where rownum<10 返回前10条记录。但因为rownum是在查询之后排序之前赋值的,所以查询employee按birthday排序的第100到120条记录应该这么写:

[pre] select * from (

select my_table.*, rownum as my_rownum from (

select name, birthday from employee order by birthday

) my_table where rownum <120

) where my_rownum>=100

[/pre]

mySQL可以使用LIMIT子句:

select name, birthday from employee order by birthday LIMIT 99,20

DB2有rownumber()函数用于获取当前行数。

SQL Server没研究过,可以参考这篇文章:http://www.csdn.net/develop/article/18/18627.shtm

在Web程序中分页会被频繁使用,但分页的实现细节却是编程过程中比较麻烦的事情。大多分页显示的查询操作都同时需要处理复杂的多重查询条件,sql语句需要动态拼接组成,再加上分页需要的记录定位、总记录条数查询以及查询结果的遍历、封装和显示,程序会变得很复杂并且难以理解。因此需要一些工具类简化分页代码,使程序员专注于业务逻辑部分。下面是我设计的两个工具类:

PagedStatement 封装了数据库连接、总记录数查询、分页查询、结果数据封装和关闭数据库连接等操作,并使用了PreparedStatement支持动态设置参数。

RowSetPage 参考PetStore的page by page iterator模式, 设计RowSetPage用于封装查询结果(使用OracleCachedRowSet缓存查询出的一页数据,关于使用CachedRowSet封装数据库查询结果请参考JSP页面查询显示常用模式)以及当前页码、总记录条数、当前记录数等信息, 并且可以生成简单的HTML分页代码。

PagedStatement 查询的结果封装成RowsetPage。

下面是简单的使用示例:

//DAO查询数据部分代码:

public RowSetPage getEmployee(String gender, int pageNo) throws Exception{

String sql="select emp_id, emp_code, user_name, real_name from employee where gender =?";

//使用Oracle数据库的分页查询实现,每页显示5条

PagedStatement pst =new PagedStatementOracleImpl(sql, pageNo, 5);

pst.setString(1, gender);

return pst.executeQuery();

}

//Servlet处理查询请求部分代码:

int pageNo;

try{

//可以通过参数pageno获得用户选择的页码

pageNo = Integer.parseInt(request.getParameter("pageno") );

}catch(Exception ex){

//默认为第一页

pageNo=1;

}

String gender = request.getParameter("gender" );

request.setAttribute("empPage", myBean.getEmployee(gender, pageNo) );

//JSP显示部分代码

<%@ page import = "page.RowSetPage"%>

<script language="javascript">

function doQuery(){

form1.actionType.value="doQuery";

form1.submit();

}

</script>

<form name=form1 method=get>

<input type=hidden name=actionType>

性别:

<input type=text name=gender size=1 value="<%=request.getParameter("gender")%>">

<input type=button value=" 查询 " onclick="doQuery()">

<%

RowSetPage empPage = (RowSetPage)request.getAttribute("empPage");

if (empPage == null ) empPage = RowSetPage.EMPTY_PAGE;

%>

<table cellspacing="0" width="90%">

<tr> <td>ID</td> <td>代码</td> <td>用户名</td> <td>姓名</td> </tr>

<%

javax.sql.RowSet empRS = (javax.sql.RowSet) empPage.getRowSet();

if (empRS!=null) while (empRS.next() ) {

%>

<tr>

<td><%= empRS.getString("EMP_ID")%></td>

<td><%= empRS.getString("EMP_CODE")%></td>

<td><%= empRS.getString("USER_NAME")%></td>

<td><%= empRS.getString("REAL_NAME")%></td>

</tr>

<%

}// end while

%>

<tr>

<%

//显示总页数和当前页数(pageno)以及分页代码。

//此处doQuery为页面上提交查询动作的javascript函数名, pageno为标识当前页码的参数名

%>

<td colspan=4><%= empPage .getHTML("doQuery", "pageno")%></td>

</tr>

</table>

</form>

效果如图:

因为分页显示一般都会伴有查询条件和查询动作,页面应已经有校验查询条件和提交查询的javascript方法(如上面的doQuery),所以RowSetPage.getHTML()生成的分页代码在用户选择新页码时直接回调前面的处理提交查询的javascript方法。注意在显示查询结果的时候上次的查询条件也需要保持,如<input type=text name=gender size=1 value="<%=request.getParameter("gender")%>">。同时由于页码的参数名可以指定,因此也支持在同一页面中有多个分页区。

另一种分页代码实现是生成每一页的URL,将查询参数和页码作为QueryString附在URL后面。这种方法的缺陷是在查询条件比较复杂时难以处理,并且需要指定处理查询动作的servlet,可能不适合某些定制的查询操作。

如果对RowSetPage.getHTML()生成的默认分页代码不满意可以编写自己的分页处理代码,RowSetPage提供了很多getter方法用于获取相关信息(如当前页码、总页数、 总记录数和当前记录数等)。

在实际应用中可以将分页查询和显示做成jsp taglib, 进一步简化JSP代码,屏蔽Java Code。

附:分页工具类的源代码, 有注释,应该很容易理解。

1.Page.java

2.RowSetPage.java(RowSetPage继承Page)

3.PagedStatement.java

4.PagedStatementOracleImpl.java(PagedStatementOracleImpl继承PagedStatement)

您可以任意使用这些源代码,但必须保留author evan_zhao@hotmail.com字样

///////////////////////////////////

//

// Page.java

// author: evan_zhao@hotmail.com

//

///////////////////////////////////

package page;

import java.util.List;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Collections;

/**

* Title: 分页对象<br>

* Description: 用于包含数据及分页信息的对象<br>

* Page类实现了用于显示分页信息的基本方法,但未指定所含数据的类型,

* 可根据需要实现以特定方式组织数据的子类,<br>

* 如RowSetPage以RowSet封装数据,ListPage以List封装数据<br>

* Copyright: Copyright (c) 2002 <br>

* @author evan_zhao@hotmail.com <br>

* @version 1.0

*/

public class Page implements java.io.Serializable {

public static final Page EMPTY_PAGE = new Page();

public static final int DEFAULT_PAGE_SIZE = 20;

public static final int MAX_PAGE_SIZE = 9999;

private int myPageSize = DEFAULT_PAGE_SIZE;

private int start;

private int avaCount,totalSize;

private Object data;

private int currentPageno;

private int totalPageCount;

/**

* 默认构造方法,只构造空页

*/

protected Page(){

this.init(0,0,0,DEFAULT_PAGE_SIZE,new Object());

}

/**

* 分页数据初始方法,由子类调用

* @param start 本页数据在数据库中的起始位置

* @param avaCount 本页包含的数据条数

* @param totalSize 数据库中总记录条数

* @param pageSize 本页容量

* @param data 本页包含的数据

*/

protected void init(int start, int avaCount, int totalSize, int pageSize, Object data){

this.avaCount =avaCount;

this.myPageSize = pageSize;

this.start = start;

this.totalSize = totalSize;

this.data=data;

//System.out.println("avaCount:"+avaCount);

//System.out.println("totalSize:"+totalSize);

if (avaCount>totalSize) {

//throw new RuntimeException("记录条数大于总条数?!");

}

this.currentPageno = (start -1)/pageSize +1;

this.totalPageCount = (totalSize + pageSize -1) / pageSize;

if (totalSize==0 && avaCount==0){

this.currentPageno = 1;

this.totalPageCount = 1;

}

//System.out.println("Start Index to Page No: " + start + "-" + currentPageno);

}

public Object getData(){

return this.data;

}

/**

* 取本页数据容量(本页能包含的记录数)

* @return 本页能包含的记录数

*/

public int getPageSize(){

return this.myPageSize;

}

/**

* 是否有下一页

* @return 是否有下一页

*/

public boolean hasNextPage() {

/*

if (avaCount==0 && totalSize==0){

return false;

}

return (start + avaCount -1) < totalSize;

*/

return (this.getCurrentPageNo()<this.getTotalPageCount());

}

/**

* 是否有上一页

* @return 是否有上一页

*/

public boolean hasPreviousPage() {

/*

return start > 1;

*/

return (this.getCurrentPageNo()>1);

}

/**

* 获取当前页第一条数据在数据库中的位置

* @return

*/

public int getStart(){

return start;

}

/**

* 获取当前页最后一条数据在数据库中的位置

* @return

*/

public int getEnd(){

int end = this.getStart() + this.getSize() -1;

if (end<0) {

end = 0;

}

return end;

}

/**

* 获取上一页第一条数据在数据库中的位置

* @return 记录对应的rownum

*/

public int getStartOfPreviousPage() {

return Math.max(start-myPageSize, 1);

}

/**

* 获取下一页第一条数据在数据库中的位置

* @return 记录对应的rownum

*/

public int getStartOfNextPage() {

return start + avaCount;

}

/**

* 获取任一页第一条数据在数据库中的位置,每页条数使用默认值

* @param pageNo 页号

* @return 记录对应的rownum

*/

public static int getStartOfAnyPage(int pageNo){

return getStartOfAnyPage(pageNo, DEFAULT_PAGE_SIZE);

}

/**

* 获取任一页第一条数据在数据库中的位置

* @param pageNo 页号

* @param pageSize 每页包含的记录数

* @return 记录对应的rownum

*/

public static int getStartOfAnyPage(int pageNo, int pageSize){

int startIndex = (pageNo-1) * pageSize + 1;

if ( startIndex < 1) startIndex = 1;

//System.out.println("Page No to Start Index: " + pageNo + "-" + startIndex);

return startIndex;

}

/**

* 取本页包含的记录数

* @return 本页包含的记录数

*/

public int getSize() {

return avaCount;

}

/**

* 取数据库中包含的总记录数

* @return 数据库中包含的总记录数

*/

public int getTotalSize() {

return this.totalSize;

}

/**

* 取当前页码

* @return 当前页码

*/

public int getCurrentPageNo(){

return this.currentPageno;

}

/**

* 取总页码

* @return 总页码

*/

public int getTotalPageCount(){

return this.totalPageCount;

}

/**

*

* @param queryJSFunctionName 实现分页的JS脚本名字,页码变动时会自动回调该方法

* @param pageNoParamName 页码参数名称

* @return

*/

public String getHTML(String queryJSFunctionName, String pageNoParamName){

if (getTotalPageCount()<1){

return "<input type='hidden' name='"+pageNoParamName+"' value='1' >";

}

if (queryJSFunctionName == null || queryJSFunctionName.trim().length()<1) {

queryJSFunctionName = "gotoPage";

}

if (pageNoParamName == null || pageNoParamName.trim().length()<1){

pageNoParamName = "pageno";

}

String gotoPage = "_"+queryJSFunctionName;

StringBuffer html = new StringBuffer("\n");

html.append("<script language=\"Javascript1.2\">\n")

.append("function ").append(gotoPage).append("(pageNo){ \n")

.append( " var curPage=1; \n")

.append( " try{ curPage = document.all[\"")

.append(pageNoParamName).append("\"].value; \n")

.append( " document.all[\"").append(pageNoParamName)

.append("\"].value = pageNo; \n")

.append( " ").append(queryJSFunctionName).append("(pageNo); \n")

.append( " return true; \n")

.append( " }catch(e){ \n")

// .append( " try{ \n")

// .append( " document.forms[0].submit(); \n")

// .append( " }catch(e){ \n")

.append( " alert('尚未定义查询方法:function ")

.append(queryJSFunctionName).append("()'); \n")

.append( " document.all[\"").append(pageNoParamName)

.append("\"].value = curPage; \n")

.append( " return false; \n")

// .append( " } \n")

.append( " } \n")

.append( "}")

.append( "</script> \n")

.append( "");

html.append( "<table border=0 cellspacing=0 cellpadding=0 align=center width=80%> \n")

.append( " <tr> \n")

.append( " <td align=left><br> \n");

html.append( " 共" ).append( getTotalPageCount() ).append( "页")

.append( " [") .append(getStart()).append("..").append(getEnd())

.append("/").append(this.getTotalSize()).append("] \n")

.append( " </td> \n")

.append( " <td align=right> \n");

if (hasPreviousPage()){

html.append( "[<a href='javascript:").append(gotoPage)

.append("(") .append(getCurrentPageNo()-1)

.append( ")'>上一页</a>] \n");

}

html.append( " 第")

.append( " <select name='")

.append(pageNoParamName).append("' onChange='javascript:")

.append(gotoPage).append("(this.value)'>\n");

String selected = "selected";

for(int i=1;i<=getTotalPageCount();i++){

if( i == getCurrentPageNo() )

selected = "selected";

else selected = "";

html.append( " <option value='").append(i).append("' ")

.append(selected).append(">").append(i).append("</option> \n");

}

if (getCurrentPageNo()>getTotalPageCount()){

html.append( " <option value='").append(getCurrentPageNo())

.append("' selected>").append(getCurrentPageNo())

.append("</option> \n");

}

html.append( " </select>页 \n");

if (hasNextPage()){

html.append( " [<a href='javascript:").append(gotoPage)

.append("(").append((getCurrentPageNo()+1))

.append( ")'>下一页</a>] \n");

}

html.append( "</td></tr></table> \n");

return html.toString();

}

}

///////////////////////////////////

//

// RowSetPage.java

// author: evan_zhao@hotmail.com

//

///////////////////////////////////

package page;

import javax.sql.RowSet;

/**

* <p>Title: RowSetPage</p>

* <p>Description: 使用RowSet封装数据的分页对象</p>

* <p>Copyright: Copyright (c) 2003</p>

* @author evan_zhao@hotmail.com

* @version 1.0

*/

public class RowSetPage extends Page {

private javax.sql.RowSet rs;

/**

*空页

*/

public static final RowSetPage EMPTY_PAGE = new RowSetPage();

/**

*默认构造方法,创建空页

*/

public RowSetPage(){

this(null, 0,0);

}

/**

*构造分页对象

*@param crs 包含一页数据的OracleCachedRowSet

*@param start 该页数据在数据库中的起始位置

*@param totalSize 数据库中包含的记录总数

*/

public RowSetPage(RowSet crs, int start, int totalSize) {

this(crs,start,totalSize,Page.DEFAULT_PAGE_SIZE);

}

/**

*构造分页对象

*@param crs 包含一页数据的OracleCachedRowSet

*@param start 该页数据在数据库中的起始位置

*@param totalSize 数据库中包含的记录总数

*@pageSize 本页能容纳的记录数

*/

public RowSetPage(RowSet crs, int start, int totalSize, int pageSize) {

try{

int avaCount=0;

if (crs!=null) {

crs.beforeFirst();

if (crs.next()){

crs.last();

avaCount = crs.getRow();

}

crs.beforeFirst();

}

rs = crs;

super.init(start,avaCount,totalSize,pageSize,rs);

}catch(java.sql.SQLException sqle){

throw new RuntimeException(sqle.toString());

}

}

/**

*取分页对象中的记录数据

*/

public javax.sql.RowSet getRowSet(){

return rs;

}

}

///////////////////////////////////

//

// PagedStatement.java

// author: evan_zhao@hotmail.com

//

///////////////////////////////////

package page;

import foo.DBUtil;

import java.math.BigDecimal;

import java.util.List;

import java.util.Iterator;

import java.util.Collections;

import java.sql.Connection;

import java.sql.SQLException;

import java.sql.ResultSet;

import java.sql.Statement;

import java.sql.PreparedStatement;

import java.sql.Timestamp;

import javax.sql.RowSet;

/**

* <p>Title: 分页查询</p>

* <p>Description: 根据查询语句和页码查询出当页数据</p>

* <p>Copyright: Copyright (c) 2002</p>

* @author evan_zhao@hotmail.com

* @version 1.0

*/

public abstract class PagedStatement {

public final static int MAX_PAGE_SIZE = Page.MAX_PAGE_SIZE;

protected String countSQL, querySQL;

protected int pageNo,pageSize,startIndex,totalCount;

protected javax.sql.RowSet rowSet;

protected RowSetPage rowSetPage;

private List boundParams;

/**

* 构造一查询出所有数据的PageStatement

* @param sql query sql

*/

public PagedStatement(String sql){

this(sql,1,MAX_PAGE_SIZE);

}

/**

* 构造一查询出当页数据的PageStatement

* @param sql query sql

* @param pageNo 页码

*/

public PagedStatement(String sql, int pageNo){

this(sql, pageNo, Page.DEFAULT_PAGE_SIZE);

}

/**

* 构造一查询出当页数据的PageStatement,并指定每页显示记录条数

* @param sql query sql

* @param pageNo 页码

* @param pageSize 每页容量

*/

public PagedStatement(String sql, int pageNo, int pageSize){

this.pageNo = pageNo;

this.pageSize = pageSize;

this.startIndex = Page.getStartOfAnyPage(pageNo, pageSize);

this.boundParams = Collections.synchronizedList(new java.util.LinkedList());

this.countSQL = "select count(*) from ( " + sql +") ";

this.querySQL = intiQuerySQL(sql, this.startIndex, pageSize);

}

/**

*生成查询一页数据的sql语句

*@param sql 原查询语句

*@startIndex 开始记录位置

*@size 需要获取的记录数

*/

protected abstract String intiQuerySQL(String sql, int startIndex, int size);

/**

*使用给出的对象设置指定参数的值

*@param index 第一个参数为1,第二个为2

JAVA 用JSP分页有数字

带有数字分页的jsp代码实现方式如下:

首先要定义四个变量:

int pageSize:每页显示多少条记录

int pageNow:希望显示第几页

int pageCount:一共有多少页

int rowCount:一共有多少条记录

说明:

pageSize是指定的 pageNow是用户选择的

rowCount是计算出来的 该计算式为

if(rowCount%pageSize==0){

pageCount=rowCount/pageSize;

}else{

pageCount=rowCount/pageSize+1;

}

(技巧:

数据库插入:

insert into 表名(字段1,2,。。。)select 字段1,2,...from 表名

)

查询语句

select top pageSize字段名列表from表名where id not in

(select top pageSize*(pageNow-1)id from 表名)

以我们前面的users表为例,显示第二页,该查询语句就是:

select top 3 * from users where userId not in(select top 3 userId from users)

(select top 3 userId from users):选出这个表的前三条 前面再选三条

<h1>用户信息列表</h1>

<%

//定义四个分页会用到的变量

int pageSize=3;

int pageNow=1;//默认显示第一页

int rowCount=0;//该值从数据库中查询

int pageCount=0;//该值是通过pageSize和rowCount

//接受用户希望显示的页数(pageNow)

String s_pageNow=request.getParameter("pageNow");

if(s_pageNow!=null){

//接收到了pageNow

pageNow=Integer.parseInt(s_pageNow);

}

//查询得到rowCount

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

Connection ct=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;dataBaseName=System","sa","");

Statement sm=ct.createStatement();

ResultSet rs=sm.exeuteQuery("select count(*) form users ");

if(rs.next()){

rowCount=rs.getInt(1);

}

//计算pageCount

if(rowCount%pageSize==0){

pageCount=rowCount/pageSize;

}else{

pageCount=rowCount/pageSize+1;

}

//查询出需要显示的记录

rs=sm.exeuteQuery("select top "+pageSize

+" * from users where userId not in(select top "

+pageSize*(pageNow-1)+" userId from users) ");

%>

//显示

<table border="1">

<tr><td>用户ID</td><td>用户名字</td><td>密码</td><td>电邮</td><td>级别</td></tr>

<%

while(rs.next()){

%>

<tr><td><%=rs.getInt(1)%></td><td><%=rs.getString(2)%></td>

<td><%=rs.getString(3)%></td><td><%=rs.getString(4)%></td><td><%=rs.getInt(5)%></td></tr>

<%}%>

</table>

<%

//上一页

if(pageNow!=1){

out.println("<a href=wel.jsp?pageNow="+(pageNow-1)+">上一页</a>");

}

//显示超链接

for(int i=1;i<=pageCount;i++){

out.println("<a href=wel.jsp?pageNow="+i+">["+i+"]</a>");

}

//下一页

if(pageNow!=pageCount){

out.println("<a href=wel.jsp?pageNow="+(pageNow+1)+">下一页</a>");

}

%>

运行效果:

怎么在jsp页面把json数据实现分页显示

jsp页面分页显示json数据,需要有分页的方法:

参考举例:

function $(id) {

return document.getElementById(id);

} //定义获取ID的方法

function GotoPage(num) { //跳转页

Page = num;

OutputHtml();

}

var PageSize = 9; //每页个数

var Page = 1; //当前页码

function OutputHtml() {

var obj = eval(siteList); //获取JSON

var sites = obj.sites;

//获取分页总数

var Pages = Math.floor((sites.length - 1) / PageSize) + 1;

if (Page < 1) Page = 1; //如果当前页码小于1

if (Page > Pages) Page = Pages; //如果当前页码大于总数

var Temp = "";

var BeginNO = (Page - 1) * PageSize + 1; //开始编号

var EndNO = Page * PageSize; //结束编号

if (EndNO > sites.length) EndNO = sites.length;

if (EndNO == 0) BeginNO = 0;

if (! (Page <= Pages)) Page = Pages;

$("total").innerHTML = "Total:<strong class='f90'>" + sites.length + "</strong> Show:<strong class='f90'>" + BeginNO + "-" + EndNO + "</strong>";

//分页

if (Page > 1 && Page !== 1) {

Temp = "<a href='javascript:void(0)' onclick='GotoPage(1)'><<Index</a> <a href='javascript:void(0)' onclick='GotoPage(" + (Page - 1) + ")'>Previous</a> "

} else {

Temp = "<<Index Previous "

};

//完美的翻页列表

var PageFrontSum = 3; //当页前显示个数

var PageBackSum = 3; //当页后显示个数

var PageFront = PageFrontSum - (Page - 1);

var PageBack = PageBackSum - (Pages - Page);

if (PageFront > 0 && PageBack < 0) PageBackSum += PageFront; //前少后多,前剩余空位给后

if (PageBack > 0 && PageFront < 0) PageFrontSum += PageBack; //后少前多,后剩余空位给前

var PageFrontBegin = Page - PageFrontSum;

if (PageFrontBegin < 1) PageFrontBegin = 1;

var PageFrontEnd = Page + PageBackSum;

if (PageFrontEnd > Pages) PageFrontEnd = Pages;

if (PageFrontBegin != 1) Temp += '<a href="javascript:void(0)" onclick="GotoPage(' + (Page - 10) + ')" title="前10页">..</a>';

for (var i = PageFrontBegin; i < Page; i++) {

Temp += " <a href='javascript:void(0)' onclick='GotoPage(" + i + ")'>" + i + "</a>";

}

Temp += " <strong class='f90'>" + Page + "</strong>";

for (var i = Page + 1; i <= PageFrontEnd; i++) {

Temp += " <a href='javascript:void(0)' onclick='GotoPage(" + i + ")'>" + i + "</a>";

}

if (PageFrontEnd != Pages) Temp += " <a href='javascript:void(0)' onclick='GotoPage(" + (Page + 10) + ")' title='后10页'>..</a>";

if (Page != Pages) {

Temp += " <a href='javascript:void(0)' onclick='GotoPage(" + (Page + 1) + ");'>Next</a> <a href='javascript:void(0)' onclick='GotoPage(" + Pages + ")'>Last>></a>"

} else {

Temp += " Next Last>>"

}

$("pagelist").innerHTML = Temp;

//输出数据

if (EndNO == 0) { //如果为空

$("content").innerHTML += "<h1>No Images</h1>";

return;

}

var html = "";

for (var i = BeginNO - 1; i < EndNO; i++) {

html += "<div class='entry'>";

html += "<a href='" + sites[i].Url + "' rel='bookmark' title=" + sites[i].Name + ">";

html += "<img src='" + sites[i].Pic + "' width='200' height='170' />";

html += "<p class='url'><span>" + sites[i].Name + "</span></p></a>";

html += "</div>";

}

$("content").innerHTML = html;

clickShow(); //调用鼠标点击事件

//键盘左右键翻页

document.onkeydown = function(e) {

var theEvent = window.event || e;

var code = theEvent.keyCode || theEvent.which;

if (code == 37) {

if (Page > 1 && Page !== 1) {

GotoPage(Page - 1);

}

}

if (code == 39) {

if (Page != Pages) {

GotoPage(Page + 1);

}

}

}

//鼠标滚轮翻页

function handle(delta) {

if (delta > 0) {

if (Page > 1 && Page !== 1) {

GotoPage(Page - 1);

}

} else {

if (Page != Pages) {

GotoPage(Page + 1);

}

}

}

function wheel(event) {

var delta = 0;

if (!event)

/* For IE. */

event = window.event;

if (event.wheelDelta) {

/* IE或者Opera. */

delta = event.wheelDelta / 120;

/** 在Opera9中,事件处理不同于IE

*/

if (window.opera) delta = -delta;

} else if (event.detail) {

/** 兼容Mozilla. */

/** In Mozilla, sign of delta is different than in IE.

* Also, delta is multiple of 3.

*/

delta = -event.detail / 3;

}

/** 如果 增量不等于0则触发

* 主要功能为测试滚轮向上滚或者是向下

*/

if (delta) handle(delta);

}

/** 初始化 */

if (window.addEventListener)

/** Mozilla的基于DOM的滚轮事件 **/

window.addEventListener("DOMMouseScroll", wheel, false);

/** IE/Opera. */

window.onmousewheel = document.onmousewheel = wheel;

}

//获取链接地址和网站名称

function showLink(source) {

var siteUrl = $("siteurl");

var siteName = $("sitename");

var description = $("description");

if (source.getAttribute("rel") == "bookmark") {

var url = source.getAttribute("href");

var title = source.getAttribute("title");

siteUrl.innerHTML = "<a href='" + url + "' target='_blank'>" + url + "</a>";

siteName.innerHTML = title;

}

}

//鼠标点击事件

function clickShow() {

var links = $("content").getElementsByTagName("a");

for (var i = 0; i < links.length; i++) {

var url = links[i].getAttribute("href");

var title = links[i].getAttribute("title");

links[i].onclick = function() {

showLink(this);

return false;

}

}

}

说明:

1、读取外部数据JSON并根据设置分页显示,添加删除酷站都可以在JSON文件里改;

2、点击酷站后,右侧的框里显示网站的地址和名称并带有链接,DESCRIPTION部分偷了个懒没写,需要的可以自己加;

3、支持键盘翻页和鼠标滚轮翻页;

  • 本文相关:
  • jsp分页显示的实现代码
  • jsp分页显示的实例代码
  • jsp实现的简单分页示例
  • jsp hibernate的分页代码
  • jsp自定义分页标签tag全过程
  • jsp+servlet+javabean实现数据分页方法完整实例
  • jsp通用高大上分页代码(超管用)
  • jsp实现页面分页功能代码
  • 一个通用的jsp分页pagebean
  • 简单实现jsp分页显示效果
  • 用java实现http文件队列下载
  • jsp中el表达式的用法详解(必看篇)
  • jsp实现针对excel及word文档的打印方法
  • spring annotaion support详细介绍及简单实例
  • java下使用oracle存储过程(详解)
  • java语言中链表和双向链表
  • jsp页面验证码demo
  • win2000+php+mysql+tomcat+jsp完全整合安装手册
  • 详解spring data 定义默认时间与日期的实例
  • jsp实用教程之简易文件上传组件的实现方法(附源码)
  • JSP中, 怎样实现分页功能(代码)???
  • 如何在JSP中实现分页显示
  • 在JSP中如何实现分页技术啊?
  • JAVA 用JSP分页有数字
  • 怎么在jsp页面把json数据实现分页显示
  • jsp如何用c标签实现分页
  • JSP中如何实现上一篇:文字标题,下一篇:文字标题,这样的分页效果
  • JSP页面分页实现,大家帮忙啊
  • 看看JSP中怎样实现分页显示
  • 看看JSP中怎样实现分页显示
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved