JSP页面实现分页功能
2012-08-20 22:46
691 查看
网上看了很多分页功能的实现,有的觉得太乱,有的真心看不懂,可能是自己知识还不够。
自己根据学的知识,封装分页方法,在界面内实现,供大家参考,肯定有不完善的地方,大家多多指教。
相信看过我前面几个文章的同志都应该知道,我一般都是把方法封装到一个Manager父类,然后其他管理类继承,然后调用父类的方法。
由于我是把它放在一个小的练习项目里,所以拿出给大家看的话又可能不会太完整,大家见谅。
一、Manager管理抽象类:封装了子类查询,增删改方法,获得分页数的方法(里面的获取connection连接方式是我之前发的连接池,大家可以去看看,我就不重复发了)
Manager类代码如下:
这里我就拿教师管理类进行举例说明,大家主要看我加注释的分页方法就行。
二、教师管理类继承Manager管理类,重写父类的抽象方法,定义自己的分页方法,获得总页数方法,代码如下:
这里重点说一下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实现业务的操作,具体是调用教师管理类,学生管理类,班级管理类的的方法。这里只给大家列出教师的业务操作方法:
大家主要看我加注释的分页方法就行。
四、在界面中调用schoolManager业务管理类进行操作,界面的代码如下:
其实分页没这么复杂,可能主要是我抽象出方法,分层的缘故让大家看的有些绕,但我相信仔细认真看看你会明白的。
欢迎大家多给我提意见,帮助我,一起进步,谢谢。
自己根据学的知识,封装分页方法,在界面内实现,供大家参考,肯定有不完善的地方,大家多多指教。
相信看过我前面几个文章的同志都应该知道,我一般都是把方法封装到一个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" onmouseover="texiao(this,'#eeddff')" onmouseout="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>
其实分页没这么复杂,可能主要是我抽象出方法,分层的缘故让大家看的有些绕,但我相信仔细认真看看你会明白的。
欢迎大家多给我提意见,帮助我,一起进步,谢谢。
相关文章推荐
- jsp实现分页和页面跳转功能
- jsp实现页面分页功能代码
- jsp实现分页(限定显示指定页数)和页面跳转功能
- jsp中完整的分页显示和页面跳转功能实现的源代码
- ASP.NET实现新闻页面的分页功能[生成静态版]
- jsp分页功能的实现
- 图书购买系统之商品分类分页--根据主页面传来的值分类显示商品并实现动态分页功能
- jsp页面中实现目录树的功能
- jsp单页面数据库查询模板:支持分页、排序、简单搜索、设置每页显示页数功能
- 在JSP页面中实现检索数据的分页显示
- jsp、struts、spring、mybatis实现前端页面功能模块化拆分
- json得到数据在jsp页面实现分页
- jsp页面中实现分页效果
- Java JSP实现页面打印的功能
- jsp单页面数据库查询模板:支持分页、排序、简单搜索、设置每页显示页数功能
- jsp页面通过ajax向后台传参实现收藏功能
- Struts+Hibernate+jsp页面 实现分页
- jsp页面某项数据太长用特殊符号代替和全选并删除功能的实现
- ASP.NET实现新闻页面的分页功能
- 在JSP页面中实现检索数据的分页显示