这是看韩顺平老师的servlet视频,自己动手写的,楼主看韩顺平老师的servlet是2006制作的,用的是sql server数据库,自己又用的是oracle数据库,所以怕有的同学遇到同样的问题,不知道去哪参考oracle,所以想写一写oracle版本的servler分页技术!在写代码之前,首先要弄明白分页算法:

四个变量,int pageSize:每页显示多少条记录.int pageNow:希望显示第几页.int pageCount:一共有多少页,int rowCount:一共有多少条记录! 其中,pageSize是指定的,pageNow是用户或者默认的,就是现在显示第几条,rowCount是从表中查询得到的,pageCount是表示页数,有多少页,需要计算,计算的算法是:

if(rowCount%pageSize == 0) {
   pageCount = rowCount/pageSize;
} else {
   pageCount = rowCount/pageSize + 1;
}

从数据库中查询出记录总数的slq语句:

select count(*) from users

分页时候遇到一个问题,如果第十一条数据到第二十条数据中,缺少一条,也就是说,记录顺序不是连续的,是断开的,怎么查询出连续的记录?sql语句如下:

rs = st.executeQuery("select * from(select t.*, rownum rn from(select * from users order by userid) t where rownum <=" + pageNow*pageSize+ ") where rn >=" + ((pageNow-1)*pageSize+1) +"");

在不断的调试代码过程中,还顺便引入了css和加入动态图片,效果如图,

java代码:

package cn.com.shizongger;

import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import java.io.*;

public class FenYe extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res){
		int pageSize = 5;	//每页显示5条记录
		int pageNow = 1;	//希望显示第几页,默认第一页
		int pageCount = 0; //总数页,用总记录数除每页显示多少条记录
		int rowCount = 0; //总记录数

		//从数据库中计算出总记录数
		Connection ct = null;
		Statement st = null;
		ResultSet rs = null;

		res.setContentType("text/html;charset=gbk");

		//从url中获取要现实的页数
		String pageStr = req.getParameter("pageNow");

		try{
			PrintWriter out = res.getWriter();

			//1.加载驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//2.得到链接
			ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl",
						"scott", "Shizongger_5476");
			//获取状态
			st = ct.createStatement();

			//从数据库中获取总记录数
			rs = st.executeQuery("select count(*) from users");
			if(rs.next()) {
				rowCount = rs.getInt(1);
				if(rowCount%pageSize == 0) {
					pageCount = rowCount/pageSize;
				} else {
					pageCount = rowCount/pageSize + 1;
				}
			}

			if(pageStr != null) {
				//从字符串中转整型
				pageNow = Integer.parseInt(pageStr);
				if(pageNow > pageCount) {
					pageNow = pageCount;
				} else if(pageNow < 1) {
					pageNow = 1;
				}
			}

			//从数据库中查询记录
			//rs = st.executeQuery("select * from users where userid between " + ((pageNow-1)*pageSize+1)
			//			+ " and " + pageNow*pageSize + " order by userid");

			rs = st.executeQuery("select * from(select t.*, rownum rn from(select * from users order by userid) t where rownum <=" + pageNow*pageSize+ ") where rn >=" + ((pageNow-1)*pageSize+1) +"");
System.out.println(((pageNow-1)*pageSize+1) + " " + (pageNow*pageSize));
			out.println("<html>\n<head>");
			//为页面添加css样式
			out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"mycss.css\" />");
			out.println("</head>\n<body background=hudie.gif><center>");
			out.println("<h1>恭喜,你已经成功登录系统</h1>");
			out.println("总记录:" + rowCount);
			out.println("<table>");
			out.println("<tr><th>用户ID</th><th>用户名</th><th>密码</th><th>Email</th><th>等级</th></tr>");
			while(rs.next()) {
				out.println("<tr>");
				out.println("<td>" + rs.getInt(1) + "</td>");
				out.println("<td>" + rs.getString(2) + "</td>");
				out.println("<td>" + rs.getString(3) + "</td>");
				out.println("<td>" + rs.getString(4) + "</td>");
				out.println("<td>" + rs.getInt(5) + "</td>");
				out.println("</tr>");
			}
			out.println("</table>");

			//显示首页
			out.println("<a href=fenye?pageNow=" + 1 + " >" + "首页" + "</a>");
			//显示上一页
			out.println("<a href=fenye?pageNow=" + (pageNow-1) + " >" + "上一页" + "</a>");

			//显示页数
			int start = (int)(pageNow/10)*10 + 1;
			for(int i = start; i <= start+9; i++) {
				if(i >= 1 && i <= pageCount) {
					if(i != pageNow) {
						out.println("<a href=fenye?pageNow=" + i + " >" + i + "</a>");
					} else {
						out.println("<a class=style1 href=fenye?pageNow=" + i + " >" + i + "</a>");
					}
				}
			}

			//显示上一页
			out.println("<a href=fenye?pageNow=" + (pageNow+1) + " >" + "下一页" + "</a>");
			//尾页
			out.println("<a href=fenye?pageNow=" + pageCount + " >" + "尾页" + "</a>");

			out.println("</center>\n</body>\n</html>");

		} catch(Exception ex) {
			ex.printStackTrace();
		}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res) {
		this.doGet(req, res);
	}
}

外部css代码:

table {
	width:550px;
}
a:link{
	text-decoration:none;
	color:blue;
}
a:visited{
	text-decoration:line-through;
	color:blue;
}
a:hover{
	text-decoration:underline;
	color:red;
}
a:active{
	text-decoration:overline;
	color:red;
}
h1{
	font-size:24px;
	color:red;
}
.style1{
	font-size:22px;
}

Servlet分页技术的更多相关文章

  1. Servlet课程0426(八)Servlet分页技术

    Welcome.java //登录界面 package com.tsinghua; import javax.servlet.http.*; import java.io.*; import java ...

  2. jsp-------------之分页技术(一)

    jsp分页技术之: 如下图:百度的喵 看上图中卡哇伊的小苗的爪子下面的数字,就是分页啦!那我们如何做出这样一个效果呢? 下面我们来逐一分解: jsp分页技术一 :  (算法) /* int pageS ...

  3. Javaweb 第15天 web练习和分页技术

    第15天 web练习和分页技术 复习day14内容: 学习新技术的思路? 分析功能的思路? 使用queryRunner操作数据库的步骤? ResultSetHandler接口常用实现类(三个重点)? ...

  4. 改进Spring中的分页技术

    Spring中有一个PagedListHolder,能够实现分页. 但此类有几个缺点: 1. 使用此类的代码比較繁琐 2. 此类存放的数据源是全部的记录集,即对于记录数为1000条的数据,即使我们仅仅 ...

  5. JAVAEE之-----MySQL分页技术(带搜索)

    需求: 为什么须要採用分页技术呢?在数据库中我们查询数据的时候,须要将数据返回到显示页面.数据库中含有大量数据,所有显示在一个页面过于太多,所以我们须要採用分页技术.每一页显示不同数据. 主要解决这个 ...

  6. Mysql学习总结(32)——MySQL分页技术详解

    1.什么是数据分页:数据分页就是将很多条记录像书本一样分页,每页显示多少行记录: 2.为什么要数据分页:当我们进行sql语句查询时,假如数据有成千上万行记录,如果在同一个页面去显示,那这个页面得有多大 ...

  7. tp中使用分页技术

    1 public function showList() { $m_ld = D ( 'guangxi_ld' ); $page = I ( 'get.p', 1 ); // 在配置中获取分页值 $p ...

  8. 分页技术之PageDataSource类

    之前给大家介绍了分页技术之Gridview控件,今天给大家介绍另外一种分页技术,采用PageDataSource类 + Repeater控件来实现. 前台只需要拖出一个Repeater控件来绑定要显示 ...

  9. 分页技术之GridView控件

    GridView控件实现分页技术 第一步:设置GridView控件的属性,跟分页相关的属性设置如下: AllowPaging="true":允许分页, PageSize=" ...

随机推荐

  1. Headroom.js – 快速响应用户的页面滚动操作

    Headroom.js 是一个轻量级,高性能的JS插件(无依赖性!),允许你响应用户的滚动行为.Headroom.js 使您能够在适当的时候把元素融入视图,而其它时候让内容成为焦点.Headroom. ...

  2. ASP.NET程序中常用的三十三种代码

    1. 打开新的窗口并传送参数: 传送参数: response.write("<script>window.open(’*.aspx?id="+this.DropDown ...

  3. JavaScript数组与对象的关系

    JavaScript的数组,相比其他语言,是比较特殊的.数组是Object类型,只不过,有几个比较特殊的地方: 有索引下标 有默认的length属性 是有序的(注意,对象是无序的) 可以使用一些特殊的 ...

  4. 免费真机调试 -- Xcode7

    刚新安装了Xcode7 Version 7.1 beta , 据说这个版本可以免费真机调试,于是用了一个新的AppID测试了,发现真的可以免费真机调试了呢!新的appId账号,没有支付每年的99美刀, ...

  5. 解决Android studio 非法字符的问题

    前言:今天遇到一个问题,从一个项目中把一些类拷贝到Android studio 里面,运行的时候,报错. 显示刚才拷贝的类中有非法字符,我又检查了一遍,发现类中没有非法字符. 在网上查到了,相关的解决 ...

  6. objective-c系列-NSMutableString

    ********************************************** NSMutableString为NSString的子类,除了父类的方法,NSMutableStirng还有 ...

  7. 深入.net(数据类型)

    C#究竟为我们提供了哪些“数据类型”供我们使用?这些类型有什么样的“特征”? 数据类型的分类: --- 数据类型是存放数据的容器.那么我们就以它们“存放数据的方式”分类! 1.值类型:变量中直接存放着 ...

  8. iOS 开发之路(使用WKWebView加载Html5) 四

    基于Swift 3 . Xcode 8 . iOS 10 下的WKWebView的使用. 首先是WKWebView的基本用法: var wk:WKWebView! var progBar:UIProg ...

  9. iOS如何获取网络图片(三)有沙盒的

    沙盒 沙盒简介 默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件 Documents:苹果建议将程序中建立的或在程 ...

  10. 集群服务器 时间同步 - Chrony

    greenplum,openstack等云计算项目需要集群服务器部署,服务器之间的时间需要同步,但并不是所有机器可以 直接连外网,这时可以用Chrony工具解决. 解决方法是将其中一台设为时间服务器, ...