本文實例為大家分享了jsp實現分頁的具體代碼,供大家參考,具體內容如下
咱們在瀏覽網頁的時候,當一個頁面的數據不足以展示完全所有的內容,一般都涉及到分頁,下一頁的功能該怎么實現呢?首先我們來分析一下:
那么直接上代碼:
這里需要備注一下,本次的代碼是在對三層優(yōu)化之后進行操作的,所以我先把數據訪問層的重構代碼貼出來:
package org.threelayer.dbutil; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.resultset; import java.sql.sqlexception; import org.threelayer.entity.student; public class dbutil { public static final string driver = "com.mysql.cj.jdbc.driver"; public static final string url = "jdbc:mysql://localhost:3306/zxy?&usessl=false&servertimezone=utf-8&usessl=false&servertimezone = gmt"; public static final string username = "root"; public static final string password = "zxy170518."; public static connection connection = null;//鏈接數據庫 public static preparedstatement pstmt=null;//執(zhí)行sql語句 public static resultset rs=null; public static connection getconnection() throws sqlexception, classnotfoundexception { class.forname(driver); return drivermanager.getconnection(url,username,password); } public static int gettotalcount(string sql) { int count=0; try { pstmt=createpreparestatement(sql, null); rs=pstmt.executequery(); if(rs.next()) { count=rs.getint(1); } }catch(sqlexception e) { e.printstacktrace(); }catch(classnotfoundexception e) { e.printstacktrace(); }catch(exception e) { e.printstacktrace(); }finally { closeall(connection, pstmt, rs); } return count; } public static preparedstatement createpreparestatement(string sql,object[] obj) throws classnotfoundexception, sqlexception { pstmt=getconnection().preparestatement(sql); if(obj!=null) { for(int i=0;i<obj.length;i++) { pstmt.setobject(i+1, obj[i]);//進行更新動作 } } return pstmt; } public static boolean updatesql(string sql,object[] obj) { try { pstmt=createpreparestatement(sql, obj); int count=pstmt.executeupdate(); if(count>0) { return true; } else { return false; } } catch (classnotfoundexception e) { // todo auto-generated catch block e.printstacktrace(); return false; } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); return false; }finally { closeall(connection,pstmt,rs); } } public static resultset findsql(string sql,object[] obj) { try { pstmt=createpreparestatement(sql, obj); rs=pstmt.executequery(); return rs; }catch(classnotfoundexception e) { e.printstacktrace(); return rs; } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); return rs; }catch(exception e) { e.printstacktrace(); return rs; } } public static void closeall(connection connection,preparedstatement pstmt,resultset rs) { try { if(connection!=null); connection.close(); if(pstmt!=null); pstmt.close(); if(rs!=null); rs.close(); } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); }catch(exception e) { e.printstacktrace(); } } }
基本上就是普通的數據庫操作功能,很好懂,就不多解釋了;
對于數據訪問層的dao:
public int gettotalcount()//查詢數據總數 { string sql="select count(1) from student"; return dbutil.gettotalcount(sql); } public list<student> findstudentbypage(int currentpage,int pagesize)//currentpage:當前頁數;pagesize頁面所能容納的最大數據量 { string sql="select * from student limit ? , ?"; object[] obj= {currentpage*pagesize,pagesize}; list<student> students=new arraylist<>(); resultset rs=dbutil.findsql(sql, obj); try { while(rs.next()) { student student=new student(rs.getint(1),rs.getstring(2),rs.getstring(3),rs.getint(4)); students.add(student); } } catch (sqlexception e) { // todo auto-generated catch block e.printstacktrace(); }catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } return students; }
對于業(yè)務邏輯層:
server:
public int gettotalcount() { return studentdao.gettotalcount(); } public list<student> findstudentbypage(int currentpage,int pagesize) { return studentdao.findstudentbypage(currentpage, pagesize); }
對于視圖層的后臺代碼:
servlet:
package org.three.servlet; import java.io.ioexception; import java.util.list; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.threelayer.entity.page_s; import org.threelayer.entity.student; import org.threelayer.server.student_server; public class findstudentbypage extends httpservlet { protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { student_server students=new student_server(); // int currentpage=2; page_s pag=new page_s(); string tmp=request.getparameter("currentpage"); if(tmp==null)//判斷是否為第一次進行訪問 { tmp="0"; } int sum=students.gettotalcount(); pag.settotalcount(sum); int currentpage= integer.parseint(tmp); pag.setcurrentpage(currentpage); string tmp2=request.getparameter("choose"); if(tmp2==null)//默認一頁3個內容 { tmp2="3"; } int pagesize=integer.parseint(tmp2); pag.setpagesize(pagesize); list<student> students =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); } protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { doget(request, response); } }
還有一個實體類:page:
package org.threelayer.entity; import java.util.list; public class page_s {//為了不出現于重名,改了一下 private int currentpage; private int pagesize;//頁面大小,即頁面數據個數 private int totalcount;//總數據 private int totalpage;//總頁數 private list<student> students; public page_s() { } public page_s(int currentpage, int pagesize, int totalcount, int totalpage, list<student> students) { this.currentpage = currentpage; this.pagesize = pagesize; this.totalcount = totalcount; this.totalpage = totalpage; this.students = students; } public int getcurrentpage() { return currentpage; } public void setcurrentpage(int currentpage) { this.currentpage = currentpage; } public int getpagesize() { return pagesize; } public void setpagesize(int pagesize) { this.pagesize = pagesize; this.totalpage=this.totalcount%this.pagesize==0?this.totalcount/this.pagesize:this.totalcount/this.pagesize+1; } public int gettotalcount() { return totalcount; } public void settotalcount(int totalcount) { this.totalcount = totalcount; } public int gettotalpage() { return totalpage; } public void settotalpage(int totalpage) { this.totalpage = totalpage; } public list<student> getstudents() { return students; } public void setstudents(list<student> students) { this.students = students; } }
最后貼上index.jsp:
<%@page import="java.util.list"%> <%@page import="org.threelayer.entity.student"%> <%@page import="org.threelayer.entity.page_s"%> <%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <!doctype html> <html> <head> <meta charset="utf-8"> <title>學生信息管理</title> </head> <body> <table border=1px> <tr> <th>學號</th> <th>姓名</th> <th>性別</th> <th>操作</th> </tr> <% page_s pagg=(page_s)request.getattribute("pag"); for(student student:pagg.getstudents()) { %> <tr> <th><a href="findstudentbyid_servlet?uid=<%=student.getid()%>" ><%=student.getid() %></a></th> <th><%=student.getname() %></th> <th><%=student.getsex() %></th> <th><a href="deletestudent_servlet?uid=<%=student.getid()%>" >刪除</a></th> </tr> <% } %> </table> <a href="add.jsp" >增加</a> <% if(pagg.getcurrentpage()==0)//用戶位于首頁的時候 { %> <a href="findstudentbypage?currentpage=<%=pagg.getcurrentpage()+1%>" >下一頁</a> <a href="findstudentbypage?currentpage=<%=pagg.gettotalpage()-1%>" >尾頁</a> <% }else if(pagg.getcurrentpage()==pagg.gettotalpage()-1)//用戶位于尾頁的時候 { %> <a href="findstudentbypage?currentpage=0" >首頁</a> <a href="findstudentbypage?currentpage=<%=pagg.getcurrentpage()-1%>" >上一頁</a> <% }else//用戶位于中間頁面的時候 { %> <a href="findstudentbypage?currentpage=0" >首頁</a> <a href="findstudentbypage?currentpage=<%=pagg.getcurrentpage()+1%>" >下一頁</a> <a href="findstudentbypage?currentpage=<%=pagg.getcurrentpage()-1%>" >上一頁</a> <a href="findstudentbypage?currentpage=<%=pagg.gettotalpage()-1%>" >尾頁</a> <% } %> <br> </body> </html>
看一下效果圖:
首先看數據庫內容:
然后是首頁:
下一頁:
最后是尾頁:
總的說明一下:
首先對于功能的闡述,第一步計算總的數據量,然后規(guī)定默認容量大小為3,最終在jsp代碼中加上跟用戶進行交互的功能,即讓用戶選擇一頁多少內容(由于我寫的那個有點bug,就先不貼,等后面自己能完美實現之后,再更新),之后對前端數據進行打包,要思考的是,我們對于這個功能我們所需要的數據有哪些呢?首先,總數據量要吧?然后要存放總的數據內容吧?然后頁面大小需要吧?然后用戶所在頁面的那個頁面位置的數要吧?最后一個就是通過總數據量和頁面大小計算出來的總頁面數也需要吧?所以,一共就需要記錄5個屬性值,那就打包成一個javabean吧,前面代碼也貼出來了。最后要提一點,對于如果我第一次進行訪問頁面的時候,我應該是有一些屬性值是為null的,這樣是會報空指針異常的,那么就要進行一些小小的處理,哪些呢?比如如果用戶第一次進行訪問,系統(tǒng)是收不到用戶當前所在頁面的頁面數值的,那么就要判斷一下,(此處上代碼)如果是第一次進行訪問,那么就給與一個默認值0,也就是第一頁,那么就處理好了這個小問題了,諸如此類問題還有就是用戶在進行選擇一頁多少內容的時候,也是需要進行賦予一個默認值的,不然也會報空指針。然后對于web.xml文件內容的設置,首頁應該設置為實現分頁功能的servlet,因為你每做一次翻頁或者首次訪問,雖然都是在index.jsp中,但是你需要把每次做完動作之后得到的新的內容進行請求轉發(fā),這樣才能實現更新,不然程序會報錯。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持碩編程。
- jsp+servlet實現文件上傳與下載功能
- EJB3.0部署消息驅動Bean拋javax.naming.NameNotFoundException異常
- 在JSP中使用formatNumber控制要顯示的小數位數方法
- 秒殺系統(tǒng)Web層設計的實現方法
- 將properties文件的配置設置為整個Web應用的全局變量實現方法
- JSP使用過濾器防止Xss漏洞
- 在JSP頁面中動態(tài)生成圖片驗證碼的方法實例
- 詳解JSP 內置對象request常見用法
- 使用IDEA編寫jsp時EL表達式不起作用的問題及解決方法
- jsp實現局部刷新頁面、異步加載頁面的方法
- Jsp中request的3個基礎實踐
- JavaServlet的文件上傳和下載實現方法
- JSP頁面的靜態(tài)包含和動態(tài)包含使用方法