1.jstl分页技术的实现:
package cn.bugu_tag.page;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
/**
*
* @author Xiaoping Huang (hxpwangyi@163.com)
*/
public class BuguPageTag extends TagSupport {
private int pageNum = 1;
private int pages;
private String url;
@Override
public int doStartTag() throws JspException {
HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
request.setAttribute("pageNum", pageNum);
request.setAttribute("pages", pages);
request.setAttribute("url", url);
try {
pageContext.include("/WEB-INF/template/page.jsp");
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
}
jsp页面:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<style>
@charset utf-8;
.pagination{height:30px;vertical-align:middle;margin:5px 10px 0;}
.pagination a{display:inline-block;margin-right:5px;width:25px;height:25px;line-height:25px;border:1px solid #ccc;text-align:center;text-decoration:none;color:#555;font-size:14px;overflow:hidden}
.pagination a:hover{background-color:#FFEDE1;text-decoration:none;font-weight:700;border-color:#FD6D01}
.pagination .current{display:inline-block;margin-right:5px;width:25px;height:25px;line-height:25px;border:1px solid #FD6D01;text-align:center;color:#555;font-size:14px;overflow:hidden;background-color:#FFEDE1;font-weight:700}
.pagination a.pagenum{width:52px;height:25px}
.pagination span{margin-right:5px;width:25px;height:25px;line-height:25px;display:inline-block;font-family:Tahoma,SimSun,Arial;font-size:12px;text-align:center;vertical-align:top;}
.pagination .prev,.pagination .next{display:inline-block;margin-right:5px;width:50px;height:25px;line-height:25px;border:1px solid #ccc;text-align:center;color:#999;font-size:14px;overflow:hidden}
.pagination .pagejump{width:auto;color:#666;vertical-align:top;padding:0 5px;}
.pagination .pagejump input{width:30px;height:20px;text-align:center;font-family:Tahoma,SimSun,Arial;color:#000;border:1px solid #999;margin:0 5px}
.pagination .pagejump button{width:50px;height:25px;cursor:pointer;border:1px solid #ccc;margin:0 0 0 5px}
</style>
<script type="text/javascript" src="/bugu_ui/jquery/jquery.min.js"></script>
<script type="text/javascript">
function beforeSubmit(){
var re = /^[1-9][0-9]*$/;
if(!re.test($("#pageNum1").val())){
$("#pageNum1").val(1);
}
if($("#pageNum1").val()>${pages}){
$("#pageNum1").val(${pages});
}
return true;
}
</script>
<c:if test="${pages>0}">
<div id="pagination" class="pagination">
<form action="${url}" method="post" onSubmit="beforeSubmit()">
<c:if test="${fn:indexOf(url,'?')==-1}">
<c:choose>
<c:when test="${pageNum==1}">
<span class="prev">首页</span>
<span class="prev">上一页</span>
</c:when>
<c:otherwise>
<a href="${url}?pageNum=1" class="pagenum" >首页</a>
<a href="${url}?pageNum=${pageNum-1}" class="pagenum" >上一页</a>
</c:otherwise>
</c:choose>
<c:if test="${pageNum-3>0}">
<a href="${url}?pageNum=${pageNum-3}" >${pageNum-3}</a>
</c:if>
<c:if test="${pageNum-2>0}">
<a href="${url}?pageNum=${pageNum-2}" >${pageNum-2}</a>
</c:if>
<c:if test="${pageNum-1>0}">
<a href="${url}?pageNum=${pageNum-1}" >${pageNum-1}</a>
</c:if>
<span class="current">${pageNum}</span>
<c:if test="${pageNum+1<=pages}">
<a href="${url}?pageNum=${pageNum+1}" >${pageNum+1}</a>
</c:if>
<c:if test="${pageNum+2<=pages}">
<a href="${url}?pageNum=${pageNum+2}" >${pageNum+2}</a>
</c:if>
<c:if test="${pageNum+3<=pages}">
<a href="${url}?pageNum=${pageNum+3}" >${pageNum+3}</a>
</c:if>
<c:choose>
<c:when test="${pageNum==pages}">
<span class="next">下一页</span>
<span class="next">末页</span>
</c:when>
<c:otherwise>
<a href="${url}?pageNum=${pageNum+1}" class="pagenum">下一页</a>
<a href="${url}?pageNum=${pages}" class="pagenum" >末页</a>
</c:otherwise>
</c:choose>
<span class="pagejump">共${count}条 跳到第<input type="text" value="${pageNum}" size="3" name="pageNum" id="pageNum1">页<button type="submit">确定</button></span>
</c:if>
<c:if test="${fn:indexOf(url,'?')!=-1}">
<c:choose>
<c:when test="${pageNum==1}">
<span class="prev">首页</span>
<span class="prev">上一页</span>
</c:when>
<c:otherwise>
<a href="${url}&pageNum=1" class="pagenum" >首页</a>
<a href="${url}&pageNum=${pageNum-1}" class="pagenum" >上一页</a>
</c:otherwise>
</c:choose>
<c:if test="${pageNum-3>0}">
<a href="${url}&pageNum=${pageNum-3}" >${pageNum-3}</a>
</c:if>
<c:if test="${pageNum-2>0}">
<a href="${url}&pageNum=${pageNum-2}" >${pageNum-2}</a>
</c:if>
<c:if test="${pageNum-1>0}">
<a href="${url}&pageNum=${pageNum-1}" >${pageNum-1}</a>
</c:if>
<span class="current">${pageNum}</span>
<c:if test="${pageNum+1<=pages}">
<a href="${url}&pageNum=${pageNum+1}" >${pageNum+1}</a>
</c:if>
<c:if test="${pageNum+2<=pages}">
<a href="${url}&pageNum=${pageNum+2}" >${pageNum+2}</a>
</c:if>
<c:if test="${pageNum+3<=pages}">
<a href="${url}&pageNum=${pageNum+3}" >${pageNum+3}</a>
</c:if>
<c:choose>
<c:when test="${pageNum==pages}">
<span class="next">下一页</span>
<span class="next">末页</span>
</c:when>
<c:otherwise>
<a href="${url}&pageNum=${pageNum+1}" class="pagenum">下一页</a>
<a href="${url}&pageNum=${pages}" class="pagenum" >末页</a>
</c:otherwise>
</c:choose>
<span class="pagejump">共${count}条 跳到第<input type="text" value="${pageNum}" size="3" name="pageNum" id="pageNum1">页<button type="submit">确定</button></span>
</c:if>
</form>
</div>
</c:if>
<c:if test="${pages==0}">
没有数据
</c:if>
tld文件
<?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 web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>pageTag</short-name>
<!-- 定义该标签库的URI -->
<uri>http://www.bugu_tag.cn/page</uri>
<!-- 定义第一个标签 -->
<tag>
<!-- 定义标签名 -->
<name>page</name>
<!-- 定义标签处理类 -->
<tag-class>cn.bugu_tag.page.BuguPageTag</tag-class>
<!-- 定义标签体为空 -->
<body-content>jsp</body-content>
<attribute>
<name>url</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pageNum</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pages</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
2.servlet分页技术的实现
1.jsp实现分也用到了servlet+jsp,其实现原理其实比较简单
/*
* PageNumber.java
*
* Created on 2006年10月9日, 上午8:21
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package page;
import java.io.*;
import java.sql.*;
import java.lang.String;
/**
*只需传进三个参数,一个是每页显示记录集数,一个是记录集,一个是URL
*取得分页效果只需调用一个getPage即可
* @mc1035
*/
public class PageNumber {
private int rowCount=1, //总的记录数。
pageSize=1, //每页显示的记录数。
showPage=1, //设置欲显示的页码数。
pageCount=1; //分页之后的总页数。
private ResultSet rs;
private String url;
private StringBuffer page=new StringBuffer();
private String formValue="-1";
/*
*设置记录集
*/
public void setRs(ResultSet a){
rs=a;
try {
rs.last(); //获取最后一行的行号:
rowCount=rs.getRow();//获取
} catch (SQLException ex) {
ex.printStackTrace();
}
}
public ResultSet getRs(){
return rs;
}
/*
*设置url
*/
public void setUrl(String a){
url=a;
}
public String getUrl(){
return url;
}
/*
*设置总记录数
*/
public void setRowCount(int n) {
rowCount=n;
}
public int getRowCount() {
return rowCount;
}
/*
*设置总的页数
*/
public void setPageCount() {
int n=(rowCount%pageSize)==0?(rowCount/pageSize):(rowCount/pageSize+1) ;
pageCount=n;
}
public int getPageCount() {
return pageCount;
}
/*
*设置显示第几页
*/
public void setShowPage(int n) {
showPage=n;
}
public int getShowPage() {
return showPage;
}
/*
*每页显示的记录数
*/
public void setPageSize(int n) {
pageSize=n;
}
public int getPageSize() {
return pageSize;
}
/*
*设置表单值
*/
public void setFormValue(String a){
formValue=a;
}
public String getFormValue(){
return formValue;
}
public void setForm(){
page.append("共有"+getRowCount()+"条记录 ");
page.append(" "+getPageCount()+"页 ");
page.append(" 当前为第"+getShowPage()+"页 ");
page.append("每页显示"+getPageSize()+"条记录");
if(getShowPage()!=1){
page.append("<Form action=/""+url+"/" method=/"post/">");
page.append("<Input Type=/"hidden/" name=/"formValue/" value=/"1/">");
page.append("<Input name=/"submit4/" type=/"submit/" value=/"首页/">");
page.append("</FORM>");
}else{
page.append("           ");
}
if(getShowPage()!=getPageCount()){
page.append("<Form action=/""+url+"/" method=/"post/">");
page.append("<Input Type=/"hidden/" name=/"formValue/" value=/""+(getShowPage()+1)+"/">");
page.append("<Input name=/"submit4/" type=/"submit/" value=/"下一页/">");
page.append("</FORM>");
}else{
page.append("           ");
}
if(getShowPage()!=1){
page.append("<Form action=/""+url+"/" method=/"post/">");
page.append("<Input Type=/"hidden/" name=/"formValue/" value=/""+(getShowPage()-1)+"/">");
page.append("<Input name=/"submit4/" type=/"submit/" value=/"上一页/">");
page.append("</FORM>");
}else{
page.append("           ");
}
if(getShowPage()!=getPageCount()){
page.append("<Form action=/""+url+"/" method=/"post/">");
page.append("<Input Type=/"hidden/" name=/"formValue/" value=/""+getPageCount()+"/">");
page.append("<Input name=/"submit4/" type=/"submit/" value=/"末页/">");
page.append("</FORM>");
}else{
page.append("           ");
}
page.append("<Form action=/""+url+"/" method=/"post/">");
page.append("输入欲要显示的页<Input Type=/"text/" name=/"formValue/" size=/"5/" value=/""+getShowPage()+"/">");
page.append("<Input name=/"submit4/" type=/"submit/" value=/"GO/">");
page.append("</FORM>");
}
public void showList(){
try{
page.append("<Table>");
page.append("<TR>");
ResultSetMetaData statName= rs.getMetaData();
for(int i=1;i<=statName.getColumnCount();i++){
page.append("<TH>"+statName.getColumnName(i));
}
page.append("</TR>");
for(int i=1;i<=getPageSize();i++) {
page.append("<TR>");
for(int j=1;j<=statName.getColumnCount();j++){
page.append("<TD>"+rs.getString(j)+"</TD>");
}
page.append("</TR>") ;
if(!rs.next()){
break;
}
}
page.append("</Table>");
setForm();
}catch(Exception e){
e.printStackTrace();
page.append(e);
}
}
public String getPage(){
setPageCount();
try{
int n=1;
if(formValue.equals("-1")){
formValue="1";
setShowPage(1);
rs.absolute((n-1)*getPageSize()+1);
}else {
try{
n=Integer.parseInt(formValue);
if(n>getPageCount()) {
n=getPageCount();
}
if(n<=0) {
n=1;
}
setShowPage(n);
rs.absolute((n-1)*getPageSize()+1);
} catch(NumberFormatException e){
e.printStackTrace();
n=getShowPage();
rs.absolute((n-1)*getPageSize()+1);
}
}
} catch(SQLException ex){
ex.printStackTrace();
}
showList();
String a=new String(page);
return a;
}
}
//index.jap文件,引用例子
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="java.sql.*"%>
<%@page import="page.PageNumber"%>
<%@page import="java.io.*"%>
<!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>JSP Page</title>
</head>
<body>
<jsp:useBean id="pageNum" scope="page" class="page.PageNumber" />
<%!
Connection con=null;
Statement sql=null;
ResultSet rs=null;
int rowCount=0;
int pageSize=5;//每页显示的记录集数
%>
<% try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:mcpage");
sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=sql.executeQuery("select * from user");
%>
<% //URL
String str=response.encodeRedirectURL("index.jsp");
//下面的是Bean的参数,可根据需要自行修改
%>
<jsp:setProperty name="pageNum" property="formValue" param="formValue"/>
<jsp:setProperty name="pageNum" property="rs" value="<%=rs%>"/>
<jsp:setProperty name="pageNum" property="pageSize" value="<%=pageSize%>"/>
<jsp:setProperty name="pageNum" property="url" value="<%=str%>"/>
<jsp:getProperty name="pageNum" property="page"/>
<%
rs.close();
con.close();
}catch(SQLException e){
e.printStackTrace();
out.print(e);
rs.close();
con.close();
}
%>
</body>
</html>