JSP实现分页显示

分页显示是针对数据库所进行的操作,分页技术主要有3种

  • 1、使用游标定位,丢弃不属于页面的数据
    这是最简单的分页显示实现技术,在每个页面查询得到所有的数据行,使用游标定位到结果集,读取现实数据,这种操作浪费大量内存资源,适用于数据量较少的查询
  • 2、使用缓存结果集,一次查询所有数据
    将查询结果存在Httpsession或状态bean中,翻页的时候从缓存中取出一页显示,可以节省数据库连接资源,但用户有可能看到的是过期数据,并且如果数据量非常大时第一次遍历查询会需要很多时间
  • 3、使用数据库提供的定位集的SQL语句,返回特定行的数据
    在用户的分页查询请求中,将获取的查询请求的行范围作为参数,生成SQL语句,然后每一次请求获得数据库连接对象执行SQL语句,返回查询结果,最后释放所有的数据库访问资源

分页显示的JavaBean实现

1、SQL Sever数据库的分页查询语句
从数据库表中的第m条记录开始取n条记录,利用top关键字进行查询,如果既有top又有order by,从排序好的结果中选择

select * from (
select top n*from(
select top(m+n-1)*from 表名称 order by 主键 desc) t1) t2 order by 主键 asc

2、Oracle数据库的分页语句
可以使用rownum来限制结果集的大小和起始位置,从数据库表中的第m条记录开始查询n条记录

  select * from (
  select rownum r,t1.* from 表名称 t1 where rownum < m+n) t2
  where t2.r >= 10

3、MySQL数据库的分页语句
从数据库表中的第m条记录开始查询n条记录

select * from 表名称 limit m-1,m

以MySQL数据库为例,介绍一个通用的分页显示类,任何用到分页显示的页面都可以调用这个类,新建splitPage.java

package jsp.test;


import java.sql.*;
import java.util.*;

public class splitPage {

//定义数据库连接对象和结果集对象
private Connection con = null;
private Statement stmt = null;
private ResultSet rs = null;
private ResultSetMetaData rsmd = null;
//定义SQL查询语句
private String sqlStr;
//总记录数目
private int rowCount = 0;
//所分的逻辑页数
private int pageCount = 0;
//每页显示的记录数目
private int pageSize = 0;
//设置参考值
public void setCon(Connection con){
	this.con = con;
	if(this.con == null){
		System.out.println("failure to get a connection");
	}
	else{
		System.out.println("success to get a connection");
	}
}
//初始化,获取数据表中的信息
public void initialize(String sqlStr,int pageSize,int ipage){
	
	int irows = pageSize*(ipage-1);
	this.sqlStr = sqlStr;
	this.pageSize = pageSize;
	
	try{
		stmt = this.con.createStatement();
		rs = stmt.executeQuery(this.sqlStr);
		
		if(rs != null){
			
			rs.last();
			this.rowCount = rs.getRow();
			rs.first();
			this.pageCount = (this.rowCount - 1)/this.pageSize + 1;
		}
		this.sqlStr = sqlStr+"  limit  " + irows + ","+pageSize;
		stmt = this.con.createStatement();
		rs = stmt.executeQuery(this.sqlStr);
		rsmd = rs.getMetaData();
		
	}
	catch (SQLException e) {
		
		System.out.println(e.toString());
		// TODO: handle exception
	}
		}
//将显示结果存到Vector集合类中
public Vector getPage(){
	Vector vData = new Vector();
	
	try{
		
		if(rs != null){
			
			while(rs.next())
			{
				String[] sData = new String[6];
				
				for(int j=0;j<rsmd.getColumnCount();j++){
					
					sData[j] = rs.getString(j+1);
				}
				vData.addElement(sData);
			}
		}
		rs.close();
		stmt.close();
		
		
	}
	catch (SQLException e) {
		
		// TODO: handle exception
		System.out.println(e.toString());
	}
	return vData;
}
//获得页面总数
public int getPageCount(){
	
	return this.pageCount;
}
//获取表中记录总数
public int getRowCount(){
	
	return this.rowCount;
	
}
}

然后新建word_list_javabean.jsp

<%@ page language="java" contentType="text/html;charset=gbk"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="jsp.test.*" %>
<jsp:useBean id="pages" scope="page" class="jsp.test.splitPage"/>
<%!
	//每页显示的记录数
	int pageSize = 3;
	String sqlStr = "";
	//当前页
	int showPage = 1;
	String userName = "root";
	String userPassword="123456";
	//数据库的url
	String url="jdbc:mysql://localhost:3306/ch10?useUnicode=true&characterEncoding = gb2312";
	//定义连接对象
	Connection dbcon;
	 %>
	 <%
	 try{
	 //加载驱动程序
	 Class.forName("com.mysql.jdbc.Driver");
	 //获得数据库连接对象
	 dbcon = DriverManager.getConnection(url,userName,userPassword);
	 }
	 catch(SQLException ex){
	 
 	System.out.println(ex.toString());
 	}
 	catch(ClassNotFoundException ex){
 	
 	System.out.println(ex.toString());
 	}
 	//给page中参数con赋值
 	pages.setCon(dbcon);
 	sqlStr = "select * from words order by WordsId";
 	//查询数据表
 	String strPage = null;
 	//获取目的界面
 	strPage = request.getParameter("showPage");
 	if(strPage == null){
 	showPage = 1;
 	}
 	else{
 	
 		try{
 			showPage=Integer.parseInt(strPage);
 			}
 			catch(NumberFormatException e){
 			
 			showPage = 1;
 			}
 			if(showPage<1){
 			
 			showPage=1;
 	}
 	}
 	pages.initialize(sqlStr,pageSize,showPage);
 	//获取要显示的命令集
	 	Vector vData = pages.getPage();
	 	
	  %>

<html>
  <head>
  <meta http-equiv="Content-Type" content="text/html;charset=gbk">
    
    <title>分页显示</title>
	
  </head>
  
  <body bgcolor="#fff" text="#00000">
  <h1 align = center>留言本</h1>
  <div align = center>
  <table border="1" cellspacing="0" cellpadding="0" width="80%">
  		<tr>
  			<th width="20%">编号</th>
  			<th width="50%">留言标题</th>
  			<th width="30%">留言时间</th>
  		</tr>
  		
  		<%
  			for(int i = 0;i <vData.size();i++){
  				//显示数据
  				String[] sData=(String[])vData.get(i);
  			 %>  
    <tr>
    	<td><%=sData[0]%></td>
    	<td align=left><%=sData[1] %></td>
    	<td align=left>
    	<%
			//显示留言时间,省去时间串中的“.”后面的字符
			String str_WordsTime = sData[3];
			if(str_WordsTime.indexOf(".")>-1)
			{
			str_WordsTime=str_WordsTime.substring(0,str_WordsTime.indexOf("."));
			}
			out.println(str_WordsTime);
			
    	 %>
    	 </td>
    </tr>
    <%
    } %>
    	</table>
	    	<form action="word_list_javabean.jsp" method="get" target="_self">
	    	共<font color = red><%=pages.getRowCount()%></font>条&nbsp;
	    	<%=pageSize%>条/页&nbsp;
	    	第<font color = red><%=showPage%></font>页/共
	    	<font color = red><%=pages.getPageCount()%></font>页&nbsp;
	    	<a href="word_list_javabean.jsp?showPage=1"target="_self">[首页]</a>&nbsp;
	    	<%
	    		//判断“上一页”链接是否要显示
	    		if(showPage>1){
	    		
	    	 %>
	    			<a
	    				href="word_list_javabean.jsp?showPage
	    				=<%=showPage-1%>"target="_self">[上一页]
	    			</a>&nbsp;
	    				
	    				<%
	    				}else{ 
	    				%>
	    					[上一页]
	    	
	    	<%
    	} 
    	//判断下一页链接是否要显示
			if(showPage<pages.getPageCount())
			{    	
    	%>
    	
    	<a 
    		href="word_list_javabean.jsp?showPage=<%=showPage+1 %>"
    		 target="_self">[下一页]</a>
    		&nbsp;
    	
    	<%
    	}else{
    	 %>
    	 [下一页]&nbsp;
    	 <%
    	 } 
    	 %>
    	 <a href="word_list_javabean.jsp?showPage=<%=pages.getPageCount()%>"
    	 	target="_self">[尾页]</a>&nbsp;
    	 	
    	 	转到
    	 	<select name = "showPage">
    	 	<%
    	 		for(int x = 1;x <= pages.getPageCount();x++){
    	 		
    	 	 %>
    	 	 <option value="<%=x %>"<%if(showPage==x)
    	 	 		out.println("selected");%>>
    	 	 		<%=x %></option>
    	 	 		<%
    	 	 		}
    	 	 		 %>
    	 	 </select>
    	 	 页&nbsp;
    	 	 <input type="submit" name="go" value="提交"/>
    	 	 
    	</form>
    	<%
    	//关闭数据库连接
    	dbcon.close();
    	 %>
    	
    </div>
  </body>
</html>

word_list_javabean.jsp页面将SQL查询语句和每页要显示的信息数量传递给分类显示类中的方法,然后获得当前页面所要显示的数据的集合,最后将这些数据显示到页面上

最后来看一下运行效果
在这里插入图片描述

  • 9
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSP实现分页显示数据的步骤如下: 1. 在JSP页面中使用JSTL标签库中的<c:forEach>标签或者JSP自带的<% %>标签,遍历数据集合并将数据显示在页面上。 2. 在页面上添加分页导航条,用于用户切换不同页面的数据。可以通过<a>标签或者<button>标签来实现。 3. 在后台代码中,根据用户请求的当前页码以及每页显示的数据量,计算出要显示的数据的起始位置和结束位置。 4. 从数据源中查询数据,并根据起始位置和结束位置来限制查询结果的数量。 5. 将查询结果封装成JavaBean对象,然后将JavaBean对象放入请求作用域(request)中,以便在JSP页面中遍历和显示。 6. 在JSP页面中根据分页导航条传递的参数,重新查询数据并显示在页面上。 示例代码如下: ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSP分页显示数据</title> </head> <body> <h1>用户列表</h1> <table> <tr> <th>ID</th> <th>用户名</th> <th>邮箱</th> </tr> <c:forEach var="user" items="${users}"> <tr> <td>${user.id}</td> <td>${user.username}</td> <td>${user.email}</td> </tr> </c:forEach> </table> <br> <div> <c:if test="${currentPage > 1}"> <a href="list.jsp?page=${currentPage - 1}">上一页</a> </c:if> <c:forEach begin="1" end="${totalPage}" varStatus="status"> <c:choose> <c:when test="${status.index == currentPage}"> <span>${status.index}</span> </c:when> <c:otherwise> <a href="list.jsp?page=${status.index}">${status.index}</a> </c:otherwise> </c:choose> </c:forEach> <c:if test="${currentPage < totalPage}"> <a href="list.jsp?page=${currentPage + 1}">下一页</a> </c:if> </div> </body> </html> ``` 在后台代码中,我们需要根据参数page和pageSize来计算出要查询的数据的起始位置和结束位置,然后从数据源中查询数据,并将查询结果封装成JavaBean对象放入请求作用域中。 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="com.example.User" %> <% int currentPage = Integer.parseInt(request.getParameter("page")); int pageSize = 10; int totalCount = 100; int totalPage = (totalCount + pageSize - 1) / pageSize; int startIndex = (currentPage - 1) * pageSize; int endIndex = startIndex + pageSize; List<User> users = new ArrayList<User>(); for (int i = startIndex; i < endIndex && i < totalCount; i++) { User user = new User(); user.setId(i + 1); user.setUsername("user" + (i + 1)); user.setEmail("user" + (i + 1) + "@example.com"); users.add(user); } request.setAttribute("users", users); request.setAttribute("currentPage", currentPage); request.setAttribute("totalPage", totalPage); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSP分页显示数据</title> </head> <body> <%@ include file="list.jsp" %> </body> </html> ``` 在JSP页面中,我们需要根据请求作用域中的数据来渲染分页导航条和数据列表。 注意:为了防止SQL注入等安全问题,我们在实际开发中应该使用PreparedStatement来查询数据,并对用户输入的参数进行过滤和验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值