JSP页面实现分页功能

网上看了很多分页功能的实现,有的觉得太乱,有的真心看不懂,可能是自己知识还不够。

自己根据学的知识,封装分页方法,在界面内实现,供大家参考,肯定有不完善的地方,大家多多指教。

相信看过我前面几个文章的同志都应该知道,我一般都是把方法封装到一个Manager父类,然后其他管理类继承,然后调用父类的方法。

由于我是把它放在一个小的练习项目里,所以拿出给大家看的话又可能不会太完整,大家见谅。

 

一、Manager管理抽象类:封装了子类查询,增删改方法,获得分页数的方法(里面的获取connection连接方式是我之前发的连接池,大家可以去看看,我就不重复发了)

Manager类代码如下:

 

package com.jdbc.service;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import com.jdbc.tool.DBHelper;
import com.sun.corba.se.spi.orbutil.fsm.State;

 abstract class Manager {
	
	public abstract boolean insertInfo(Object entity);
	public abstract boolean deleteInfo(Object id);
	public abstract boolean updateInfo(Object entity);
	public abstract Object getAllInfoById(Object id);
	public abstract List getAllInfo();
	
	
	/**
	 * 根据传入的每页行数返回分页数
	 * @param tname 要分页的表名
	 * @param rowcount 每页行数
	 * @return 分页数
	 */
	int getPageSize(String tname,int rowcount){
		Connection con=DBHelper.getConnection();
		if(con==null){
			return -1;
		}
		Statement st=null;
		ResultSet rs=null;
		try {
			st=con.createStatement();
			rs=st.executeQuery("select count(*) from "+tname);
			int size=-1;
			if(rs.next()){
				size=rs.getInt(1);
				if(size%rowcount==0){
					return (size/rowcount);
				}
				
				return (size/rowcount)+1;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			DBHelper.closeJDBC(rs, st, con);
		}
		return -1;
	}
	/**
	 * 用于父类 封装 子类根据对象属性查询的方法
	 * @param tname  表名
	 * @param clname  要查询的列名
	 * @param clvalue 传入的列名的值
	 * @param cl 用于   指定 实体类  类文件
	 * @return  查询结果集封装的数据(实体类对象集合)
	 */
	 List getInfoByproperty(String tname,String[] clname,String[] clvalue,Class cl){
		
		String sql="select * from "+tname+" where 0=0 ";
		for (int i = 0; i < clname.length; i++) {
			sql+=" and "+clname[i]+"=?";
		}
		
		return this.getAllInfo(sql, clvalue, cl);
		
		
	}
	
	/**
	 * 用于父类 封装 增删改 的方法,供子类调用。
	 * @param sql  增删改语句
	 * @param args  条件值
	 * @param cl  用于   指定 集合中封装的 实体类  类文件
	 * @return  成功返回true 失败返回false
	 */
	boolean updateDB(String sql,String[] args){
		//获取连接并判断
		Connection con=DBHelper.getConnection();
		if(con==null){
			return false;
		}
		//获取操作指令装置,并执行sql(可赋值)
		PreparedStatement ps=null;
		try {
			ps=con.prepareStatement(sql);
			if(args!=null&&args.length>0){
				for (int i = 0; i < args.length; i++) {
					ps.setString(i+1, args[i]);
				}
			}
			return ps.executeUpdate()>0 ? true:false;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			DBHelper.closeJDBC(null, ps, con);
		}
		return false;
	}
	/**
	 * 用于父类 封装 查询 的方法,供子类调用。
	 * @param sql  查询语句(select .......)
	 * @param args  查询条件值(可以为null——基本查询)
	 * @param cl  用于   指定 集合中封装的 实体类  类文件
	 * @return  查询结果集封装的数据(实体类对象集合)
	 */
	List getAllInfo(String sql,String[] args,Class cl){
		//获取连接并判断
		Connection con=DBHelper.getConnection();
		//Connection con=DB_helper.getInstance().getConnection();
		if(con==null){
			return null;
		}
		//获取操作指令装置,并执行sql(可赋值)
		PreparedStatement ps=null;
		ResultSet rs=null;
		try {
			ps=con.prepareStatement(sql);
			if(args!=null){
				for (int i = 0; i < args.length; i++) {
						ps.setString(i+1, args[i]);
				}
			}
			rs=ps.executeQuery();
			//获取 rs 的源数据,从中得到操作表的 列数
			int colcount=rs.getMetaData().getColumnCount();
			//准备构造方法所用参数的数组,长度为 表 列数
			Object[] canshu=new Object[colcount];
			
			//封装返回值的容器
			List list=new ArrayList();
			//遍历 所有指定 实体类的构造方法,用 参数数组去获取 实体类 对象(如成功,则列值被封装成 对象 属性值)
			Object ob=null;
			
			//封装返回值的容器
			while(rs.next()){
				//将一行 表的数据 封装到 参数数组中
				for (int i = 0; i < canshu.length; i++) {
					canshu[i]=rs.getObject(i+1);
					//可用于查看 Oracle数据库对应的 java 数据类型
					//System.out.println(canshu[i].getClass());
				}
				//
				ob=getObject(cl, canshu);
				//如成功,则将封装有属性值的对象,放入 list 集合
				if(ob==null){
					return null;
				}
				//如成功,则将封装有属性值的对象,放入 list 集合
				list.add(ob);
			}
			return new ArrayList(list);
		} catch (Exception e) {
			
		}finally{
			DBHelper.closeJDBC(rs, ps, con);
			//DBHelper.closeJDBC(rs, ps, null);
			
		}
		return null;
	}
	List getAllInfoByProprety(String sql,String[] args,Class cl){

		return null;
	}
	/**
	  * 用于自动封装 行数据成为 指定类对象的方法
	  * @param cl 传进返回的实体类型
	  * @param canshu 进行参数匹配的数组
	  * @return 实体类型
	  */
	private Object getObject(Class cl,Object[] canshu){
		Constructor[] cons=cl.getConstructors();
		Object ob=null;
		for (int i = 0; i < cons.length; i++) {
			try {
				ob=cons[i].newInstance(canshu);
				return ob;
			} catch (Exception e) {
				continue;
			}
		}
		return null;
	}
	
}


这里我就拿教师管理类进行举例说明,大家主要看我加注释的分页方法就行。

二、教师管理类继承Manager管理类,重写父类的抽象方法,定义自己的分页方法,获得总页数方法,代码如下:

 

package com.jdbc.service;

import java.util.List;

import com.jdbc.entity.ClassInfoEntity;
import com.jdbc.entity.TeacherEntity;

public class TeacherService extends Manager{

	//根据传入每行的数目得到分页数
	public int getPageSize(int rowcount){
		return this.getPageSize("sa.teacher", rowcount);
	}
	//根据分页查看教师信息
	public List<TeacherEntity> getAllInfoByPageSize(int pagesize,int rowcount){
		String sql="select * from (select * from sa.teacher where tid not in(select * from (select tid from sa.teacher where rownum<=(?-1)*? order by tid)) order by tid)where rownum<=?";
		String[] args=new String[]{pagesize+"",rowcount+"",rowcount+""};
		return this.getAllInfo(sql, args, TeacherEntity.class);
	}
	@Override
	public boolean deleteInfo(Object id) {
		String sql="delete from sa.teacher where tid=?";
		String[] args=new String[]{id+""};
		return this.updateDB(sql, args);
	}

	@Override
	public List getAllInfo() {
		String sql="select * from sa.teacher";
		return this.getAllInfo(sql, null, TeacherEntity.class);
	}

	@Override
	public TeacherEntity getAllInfoById(Object id) {
		String sql="select * from sa.teacher where tid=?";
		String[] args=new String[]{id+""};
		List<TeacherEntity> list=this.getAllInfo(sql, args, TeacherEntity.class);
		return (list!=null&&list.size()>0) ? list.get(0):null;
	}

	@Override
	public boolean insertInfo(Object entity) {
		TeacherEntity t=(TeacherEntity) entity;
		String sql="insert into sa.teacher values(?,?,?)";
		String[] args=new String[]{t.getTid()+"",t.getTname(),t.getTage()+""};
		return this.updateDB(sql, args);
	}

	@Override
	public boolean updateInfo(Object entity) {
		TeacherEntity t=(TeacherEntity) entity;
		String sql="update sa.teacher set tname=?,tage=? where tid=?";
		String[] args=new String[]{t.getTname(),t.getTage()+"",t.getTid()+""};
		return this.updateDB(sql, args);
	}

}


这里重点说一下sql语句:

select * from (select * from sa.teacher where tid not in(select * from (select tid from sa.teacher where rownum<=(?-1)*? order by tid)) order by tid)where rownum<=?

可能还有的看不太明白这个语句就是负责实现页数的划分,子查询比较多,大家仔细看看就明白了。

 

 

三、我最后通过写的schoolManager实现业务的操作,具体是调用教师管理类,学生管理类,班级管理类的的方法。这里只给大家列出教师的业务操作方法:

大家主要看我加注释的分页方法就行。

 

package com.jdbc.manager;

import java.math.BigDecimal;
import java.util.List;

import com.jdbc.entity.TeacherEntity;
import com.jdbc.service.TeacherService;


public class SchoolManager {

	private static TeacherService teacherManager=new TeacherService();
	
	
	/**
	 * 添加新教师信息
	 * @param entity 添加教师的实体
	 * @return 成功返回true,失败返回false
	 */
	public static boolean addNewTeacherInfo(Object entity){
		return teacherManager.insertInfo(entity);
	}
	public static boolean delTeacherInfoById(Object id){
		return teacherManager.deleteInfo(id);
	}
	public static boolean updTeacherInfo(Object entity){
		return teacherManager.updateInfo(entity);
	}
	public static TeacherEntity getTeacherInfoById(Object id){
		return teacherManager.getAllInfoById(id);
	}
	public static List<TeacherEntity> getAllTeacherInfo(){
		return teacherManager.getAllInfo();
	}
	//通过传入的页数和每行显示的数目来进行信息的显示
	public static List<TeacherEntity> getAllTeacherInfoByPageSize(int pagesize,int rowcount){
		return teacherManager.getAllInfoByPageSize(pagesize, rowcount);
	}
	//根据每行显示的数量获得分页数
	public static int getTeacherPagesize(int rowcount){
		return teacherManager.getPageSize(rowcount);
	}
}


 

 

四、在界面中调用schoolManager业务管理类进行操作,界面的代码如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="com.jdbc.entity.StudentEntity"%>
<%@page import="com.jdbc.manager.SchoolManager"%>
<%@page import="com.jdbc.entity.UserInfoEntity"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'studentManager.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--  
	<link rel="stylesheet" type="text/css" href="../WEB-CSS/styles.css">
	-->
	<script type="text/javascript" src="WEB-JS/tx.js"></script>
  </head>
  
  <body>
     <%
     int rowcount=6;
     int pagesize=1;
     int sizemax=SchoolManager.getStudentPagesize(rowcount);
     String ps=request.getParameter("ps");
     if(ps!=null){
     pagesize=Integer.parseInt(ps);
     	if(pagesize<1){
     	pagesize=1;
     	}
     	if(pagesize>sizemax){
     	pagesize=sizemax;
     	}
     }
    UserInfoEntity user=(UserInfoEntity)session.getAttribute("user");
	String caozuo="style='display: block'";
	if(user.getUsertype().getUtid().intValue()==2){
	caozuo="style='display: none'";
	}
	List<StudentEntity> list=SchoolManager.getAllStudentInfoByPageSize(pagesize,rowcount);
 	%>
    <table align="center" cellspacing="0px" style="font-size:16px; width:80%; text-align: center;border: 1px;border-style: double;border-color: #998866;">
     <tr style="background-color: #998866;height: 30px;">
       <td>学号</td>
       <td>姓名</td>
       <td>性别</td>
       <td>入学日期</td>
       <td>所在班级</td>
       <td <%=caozuo%>>数据操作</td>
     </tr>
     <tr >
     		<td colspan="6"></td>
     </tr>
     <%for(int i=0;i<list.size();i++) {
     StudentEntity st=list.get(i); %>
     <tr style="height: 30px;background-color: #ffffff" οnmοuseοver="texiao(this,'#eeddff')" οnmοuseοut="texiao(this,'#ffffff')">
     	<td><%=st.getStid() %></td>
     	<td><%=st.getStname() %></td>
     	<td><%if(st.getStsex().intValue()==1) {%>
     		<%="男" %>
     		<%}else {%>
     		<%="女" %>
     		<%} %>
     	</td>
     	<td><%=st.getStdate() %></td>
     	<td><%=st.getClassinfo().getCltitle() %></td>
     	<td <%=caozuo%>><a href="javascript:xiugai('<%=st.getStid() %>')">update</a>      <a href="javascript:shanchu('<%=st.getStid() %>')">delete</a>
     	      <a href="InforManager/addStudent.jsp">insert</a>
     	</td>
     	
     </tr>
     <%} %>
     
    </table>
    <br/>
    <div style="text-align: center;color: #789789">
    <a href="InforShow/studentManager.jsp?ps=1">首页</a>
          
     <a href="InforShow/studentManager.jsp?ps=<%=pagesize-1 %>">上一页</a>
          
     <a href="InforShow/studentManager.jsp?ps=<%=pagesize+1 %>">下一页</a>
          
     <a href="InforShow/studentManager.jsp?ps=<%=sizemax %>">尾页</a>
          
    </div>
    <br/>
  </body>
  <script type="text/javascript">
  function shanchu(id){
	if(window.confirm("你确定要删除学号为 "+id+" 的信息?"))
		window.location.href="../stuservlet?caozuo=del&stid="+id;
		}
  function xiugai(id){
		window.location.href="../InforManager/updStudent.jsp?id="+id;
  }
  </script>
  
</html>


 

其实分页没这么复杂,可能主要是我抽象出方法,分层的缘故让大家看的有些绕,但我相信仔细认真看看你会明白的。

欢迎大家多给我提意见,帮助我,一起进步,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值