JSP实现分页效果
本文实例为大家分享了JSP实现分页的具体代码,供大家参考,具体内容如下
咱们在浏览网页的时候,当一个页面的数据不足以展示完全所有的内容,一般都涉及到分页,下一页的功能该怎么实现呢?首先我们来分析一下:
那么直接上代码:
这里需要备注一下,本次的代码是在对三层优化之后进行操作的,所以我先把数据访问层的重构代码贴出来:
packageorg.ThreeLayer.DButil; importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; importorg.ThreeLayer.Entity.Student; publicclassDButil { publicstaticfinalStringdriver="com.mysql.cj.jdbc.Driver"; publicstaticfinalStringurl="jdbc:mysql://localhost:3306/zxy?&useSSL=false&serverTimezone=UTF-8&useSSL=false&serverTimezone=GMT"; publicstaticfinalStringusername="root"; publicstaticfinalStringpassword="zxy170518."; publicstaticConnectionconnection=null;//链接数据库 publicstaticPreparedStatementpstmt=null;//执行sql语句 publicstaticResultSetrs=null; publicstaticConnectiongetConnection()throwsSQLException,ClassNotFoundException { Class.forName(driver); returnDriverManager.getConnection(url,username,password); } publicstaticintgetTotalCount(Stringsql) { intcount=0; try { pstmt=createPrepareStatement(sql,null); rs=pstmt.executeQuery(); if(rs.next()) { count=rs.getInt(1); } }catch(SQLExceptione) { e.printStackTrace(); }catch(ClassNotFoundExceptione) { e.printStackTrace(); }catch(Exceptione) { e.printStackTrace(); }finally { closeAll(connection,pstmt,rs); } returncount; } publicstaticPreparedStatementcreatePrepareStatement(Stringsql,Object[]obj)throwsClassNotFoundException,SQLException { pstmt=getConnection().prepareStatement(sql); if(obj!=null) { for(inti=0;i0) { returntrue; } else { returnfalse; } }catch(ClassNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); returnfalse; }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); returnfalse; }finally { closeAll(connection,pstmt,rs); } } publicstaticResultSetFindSQL(Stringsql,Object[]obj) { try { pstmt=createPrepareStatement(sql,obj); rs=pstmt.executeQuery(); returnrs; }catch(ClassNotFoundExceptione) { e.printStackTrace(); returnrs; }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); returnrs; }catch(Exceptione) { e.printStackTrace(); returnrs; } } publicstaticvoidcloseAll(Connectionconnection,PreparedStatementpstmt,ResultSetrs) { try { if(connection!=null); connection.close(); if(pstmt!=null); pstmt.close(); if(rs!=null); rs.close(); }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(Exceptione) { e.printStackTrace(); } } }
基本上就是普通的数据库操作功能,很好懂,就不多解释了;
对于数据访问层的Dao:
publicintgetTotalCount()//查询数据总数 { Stringsql="selectcount(1)fromstudent"; returnDButil.getTotalCount(sql); } publicListfindStudentByPage(intcurrentPage,intpageSize)//currentPage:当前页数;pageSize页面所能容纳的最大数据量 { Stringsql="select*fromstudentlimit?,?"; Object[]obj={currentPage*pageSize,pageSize}; List students=newArrayList<>(); ResultSetrs=DButil.FindSQL(sql,obj); try{ while(rs.next()) { Studentstudent=newStudent(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getInt(4)); students.add(student); } }catch(SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } returnstudents; }
对于业务逻辑层:
Server:
publicintgetTotalCount() { returnstudentdao.getTotalCount(); } publicListfindStudentByPage(intcurrentPage,intpageSize) { returnstudentdao.findStudentByPage(currentPage,pageSize); }
对于视图层的后台代码:
Servlet:
packageorg.Three.Servlet; importjava.io.IOException; importjava.util.List; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.ThreeLayer.Entity.Page_S; importorg.ThreeLayer.Entity.Student; importorg.ThreeLayer.Server.Student_Server; publicclassfindStudentByPageextendsHttpServlet{ protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ Student_ServerstudentS=newStudent_Server(); //intcurrentPage=2; Page_Spag=newPage_S(); Stringtmp=request.getParameter("currentPage"); if(tmp==null)//判断是否为第一次进行访问 { tmp="0"; } intsum=studentS.getTotalCount(); pag.setTotalCount(sum); intcurrentPage=Integer.parseInt(tmp); pag.setCurrentPage(currentPage); Stringtmp2=request.getParameter("choose"); if(tmp2==null)//默认一页3个内容 { tmp2="3"; } intpageSize=Integer.parseInt(tmp2); pag.setPageSize(pageSize); Liststudents=studentS.findStudentByPage(currentPage,pageSize); pag.setStudents(students); request.setAttribute("pag",pag); request.getRequestDispatcher("index.jsp").forward(request,response); System.out.print(students); System.out.print(sum); } protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ doGet(request,response); } }
还有一个实体类:Page:
packageorg.ThreeLayer.Entity; importjava.util.List; publicclassPage_S{//为了不出现于重名,改了一下 privateintcurrentPage; privateintpageSize;//页面大小,即页面数据个数 privateinttotalCount;//总数据 privateinttotalPage;//总页数 privateListstudents; publicPage_S(){ } publicPage_S(intcurrentPage,intpageSize,inttotalCount,inttotalPage,List students){ this.currentPage=currentPage; this.pageSize=pageSize; this.totalCount=totalCount; this.totalPage=totalPage; this.students=students; } publicintgetCurrentPage(){ returncurrentPage; } publicvoidsetCurrentPage(intcurrentPage){ this.currentPage=currentPage; } publicintgetPageSize(){ returnpageSize; } publicvoidsetPageSize(intpageSize){ this.pageSize=pageSize; this.totalPage=this.totalCount%this.pageSize==0?this.totalCount/this.pageSize:this.totalCount/this.pageSize+1; } publicintgetTotalCount(){ returntotalCount; } publicvoidsetTotalCount(inttotalCount){ this.totalCount=totalCount; } publicintgetTotalPage(){ returntotalPage; } publicvoidsetTotalPage(inttotalPage){ this.totalPage=totalPage; } publicList getStudents(){ returnstudents; } publicvoidsetStudents(List students){ this.students=students; } }
最后贴上index.jsp:
<%@pageimport="java.util.List"%> <%@pageimport="org.ThreeLayer.Entity.Student"%> <%@pageimport="org.ThreeLayer.Entity.Page_S"%> <%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>学生信息管理 <% Page_Spagg=(Page_S)request.getAttribute("pag"); for(Studentstudent:pagg.getStudents()) { %> 学号 姓名 性别 操作 <% } %> "><%=student.getId()%> <%=student.getName()%> <%=student.getSex()%> ">删除 增加 <% if(pagg.getCurrentPage()==0)//用户位于首页的时候 { %> ">下一页 ">尾页 <% }elseif(pagg.getCurrentPage()==pagg.getTotalPage()-1)//用户位于尾页的时候 { %> 首页 ">上一页 <% }else//用户位于中间页面的时候 { %> 首页 ">下一页 ">上一页 ">尾页 <% } %>
看一下效果图:
首先看数据库内容:
然后是首页:
下一页:
最后是尾页:
总的说明一下:
首先对于功能的阐述,第一步计算总的数据量,然后规定默认容量大小为3,最终在jsp代码中加上跟用户进行交互的功能,即让用户选择一页多少内容(由于我写的那个有点bug,就先不贴,等后面自己能完美实现之后,再更新),之后对前端数据进行打包,要思考的是,我们对于这个功能我们所需要的数据有哪些呢?首先,总数据量要吧?然后要存放总的数据内容吧?然后页面大小需要吧?然后用户所在页面的那个页面位置的数要吧?最后一个就是通过总数据量和页面大小计算出来的总页面数也需要吧?所以,一共就需要记录5个属性值,那就打包成一个JavaBean吧,前面代码也贴出来了。最后要提一点,对于如果我第一次进行访问页面的时候,我应该是有一些属性值是为null的,这样是会报空指针异常的,那么就要进行一些小小的处理,哪些呢?比如如果用户第一次进行访问,系统是收不到用户当前所在页面的页面数值的,那么就要判断一下,(此处上代码)如果是第一次进行访问,那么就给与一个默认值0,也就是第一页,那么就处理好了这个小问题了,诸如此类问题还有就是用户在进行选择一页多少内容的时候,也是需要进行赋予一个默认值的,不然也会报空指针。然后对于web.xml文件内容的设置,首页应该设置为实现分页功能的Servlet,因为你每做一次翻页或者首次访问,虽然都是在index.jsp中,但是你需要把每次做完动作之后得到的新的内容进行请求转发,这样才能实现更新,不然程序会报错。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。