javaweb实现分页(二)
前言:我們都知道,實現分頁需要三個步驟。第一,確定頁大小(每頁顯示的數據量)。第二,計算顯示的總頁數。第三,寫分頁的sql語句。這三步已經在昨天的推文中詳細說明,需要的可以點擊這里快速瀏覽:javaweb實現分頁(一)
開發環境:
Myeclipse 10.5,Mysql 5.5,Tomcat 7.0,JDK 1.7,Chrome瀏覽器
數據庫和表結構:
下面是表中的測試數據,需要說明的是saddress這一列,本來是當做地址的,現在有其他的需求,就當成了角色使用,但是并不影響分頁。
Javaweb代碼:
Java代碼是以分層開發的思想來實現的,其中有實體類:Student,Dao類和接口:BaseDaoNew,IStudentDao,Dao層實現類StudentDaoImpl:Service接口和實現類IStudentService,StudentService以及最后的工具類PageUtils
代碼如下:
實體類:Student
BaseDaoNew:
package org.dao;import java.sql.*; import java.util.List;import com.sun.org.glassfish.external.statistics.annotations.Reset;/*** * @author 24519* 連接數據庫的工作類**/ public class BaseDaoNew {private Connection conn = null;private PreparedStatement pre;private ResultSet rs;//連接數據庫public Connection getConn(){try{//加載驅動Class.forName("com.mysql.jdbc.Driver");//數據庫連接字符串String url= "jdbc:mysql://localhost:3306/schooldb?user=root&password=root";//連接數據庫conn = DriverManager.getConnection(url);}catch(Exception ex){ex.printStackTrace();}return conn;}//增刪改public int ExecuteUpdate(String sql,List params) throws SQLException{int rel = 0;conn = getConn();pre = conn.prepareStatement(sql);if(params!=null){for(int i = 0;i<params.size();i++){pre.setObject(i+1, params.get(i));}}rel = pre.executeUpdate();return rel;}//查詢public ResultSet ExecuteQuerty(String sql,List params) throws SQLException{conn = getConn();pre = conn.prepareStatement(sql);if(params!=null){for(int i = 0;i<params.size();i++){pre.setObject(i+1, params.get(i));}}return pre.executeQuery();}//關閉連接public void closeConn(Connection conn,PreparedStatement pre,ResultSet rs){try {if(rs!=null){rs.close();}if(pre!=null){pre.close();}if(conn!=null){conn.close();}} catch (SQLException e) {e.printStackTrace();}}}IStudentDao:
package org.dao;import java.util.List;import org.entity.Student;//學生信息的接口 public interface IStudentDao {//增加學生信息public int addStudent(Student stu);//修改學生信息public int updateStudent(Student stu);//刪除學生信息public int delStudent(int sid);//根據編號查詢學生信息public Student findStudentById(int sid);//查詢全部學生信息public List<Student> findStudentAll();//登錄public Student login(String name,String pass);//總記錄數public int findAllStudentCount();//分頁查詢public List<Student> findStudentByPage(int currIndex,int pageSize); }StudentDaoImpl:
package org.dao.impl;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import org.dao.BaseDao; import org.dao.BaseDaoNew; import org.dao.IStudentDao; import org.entity.Student;import com.sun.xml.internal.ws.Closeable;/*** * @author 24519* 學生信息的實現類**/ public class StudentDaoImpl implements IStudentDao {BaseDao base = new BaseDao();private Connection conn = base.getConn();PreparedStatement pre = null;ResultSet rs = null;@Overridepublic int addStudent(Student stu) {int rel = 0;String sql = "insert into Student values(?,?,?,?,?,?);";try {List<Object> params = new ArrayList<Object>();params.add(stu.getSid());params.add(stu.getSname());params.add(stu.getSphone());params.add(stu.getSpass());params.add(stu.getSaddress());params.add(stu.getSage());rel = base.ExecuteUpdate(sql, params);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return rel;}@Overridepublic int updateStudent(Student stu) {String sql = "update student set sname = ?," +"sphone = ?,spass=?,saddress=?,sage=? where sid = ?";int rel = 0;try {List<Object> params = new ArrayList<Object>();params.add(stu.getSname());params.add(stu.getSphone());params.add(stu.getSpass());params.add(stu.getSaddress());params.add(stu.getSage());params.add(stu.getSid());rel = base.ExecuteUpdate(sql, params);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return rel;}@Overridepublic int delStudent(int sid) {String sql = "delete from Student where sid = ?";int rel = 0;try {List<Object> params = new ArrayList<Object>();params.add(sid);rel = base.ExecuteUpdate(sql, params);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return rel;}@Overridepublic Student findStudentById(int sid) {Student student = new Student();String sql = "select * from student where sid = ?";try {List<Object> params = new ArrayList<Object>();params.add(sid);rs = base.ExecuteQuery(sql, params);while(rs.next()){student.setSid(rs.getInt(1));student.setSname(rs.getString(2));student.setSphone(rs.getString(3));student.setSpass(rs.getString(4));student.setSaddress(rs.getString("saddress"));student.setSage(rs.getInt(6));}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return student;}@Overridepublic List<Student> findStudentAll() {List<Student> stus = new ArrayList<Student>();String sql = "select * from Student";try {rs = base.ExecuteQuery(sql, null);while(rs.next()){Student student = new Student();student.setSid(rs.getInt(1));student.setSname(rs.getString(2));student.setSphone(rs.getString(3));student.setSpass(rs.getString(4));student.setSaddress(rs.getString(5));student.setSage(rs.getInt(6));stus.add(student);//將信息放入集合中}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return stus;}//登陸@Overridepublic Student login(String name, String pass) {Student student = new Student();String sql = "select * from student where sname = ? and spass = ?;";try {List<Object> params = new ArrayList<Object>();params.add(name);params.add(pass);rs = base.ExecuteQuery(sql, params);while(rs.next()){student.setSid(rs.getInt(1));student.setSname(rs.getString(2));student.setSphone(rs.getString(3));student.setSpass(rs.getString(4));student.setSaddress(rs.getString(5));student.setSage(rs.getInt(6));}} catch (SQLException e) {e.printStackTrace();}return student;}//查詢總記錄數@Overridepublic int findAllStudentCount() {String sql = "select count(*) from student";int count = 0;try {rs = base.ExecuteQuery(sql, null);rs.next();count = rs.getInt(1);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return count;}//分頁查詢@Overridepublic List<Student> findStudentByPage(int currIndex, int pageSize) {String sql = "select * from student limit ? ,?";int one = (currIndex-1)*pageSize;List<Object> params = new ArrayList<Object>();params.add(one);params.add(pageSize);List<Student> sList = new ArrayList<Student>();try {rs = base.ExecuteQuery(sql, params);while(rs.next()){Student stu = new Student();stu.setSid(rs.getInt(1));stu.setSname(rs.getString(2));stu.setSphone(rs.getString(3));stu.setSpass(rs.getString(4));stu.setSaddress(rs.getString(5));stu.setSage(rs.getInt(6));sList.add(stu);}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return sList;}}IStudentService:
package org.service;import java.util.List;import org.entity.Student;public interface IStudentService {//增加學生信息public int addStudent(Student stu);//修改學生信息public int updateStudent(Student stu);//刪除學生信息public int delStudent(int sid);//根據編號查詢學生信息public Student findStudentById(int sid);//查詢全部學生信息public List<Student> findStudentAll();//登錄public Student login(String name,String pass);//計算總記錄數public int findAllStudentCount();//分頁查詢public List<Student> findStudentByPage(int currIndex,int pageSize);}StudentService:
package org.service.impl;import java.util.List;import org.dao.IStudentDao; import org.dao.impl.StudentDaoImpl; import org.entity.Student; import org.service.IStudentService;public class StudentServiceImpl implements IStudentService {//創建Dao層的對象private IStudentDao sDao = new StudentDaoImpl();@Overridepublic int addStudent(Student stu) {return sDao.addStudent(stu);}@Overridepublic int updateStudent(Student stu) {return sDao.updateStudent(stu);}@Overridepublic int delStudent(int sid) {return sDao.delStudent(sid);}@Overridepublic Student findStudentById(int sid) {return sDao.findStudentById(sid);}@Overridepublic List<Student> findStudentAll() {return sDao.findStudentAll();}@Overridepublic Student login(String name, String pass) {return sDao.login(name, pass);}@Overridepublic int findAllStudentCount() {return sDao.findAllStudentCount();}//分頁查詢@Overridepublic List<Student> findStudentByPage(int currIndex, int pageSize) {return sDao.findStudentByPage(currIndex, pageSize);}}PageUtils:
package org.utils;import java.util.List;import org.entity.Student;/*** * @author 24519* 分頁的工具類**/ public class PageUtils {//頁大小(每頁顯示多少條記錄)private int pageSize;//當前頁private int currIndex;//總記錄數private int totalCount;//總頁數private int totalPage;//每頁顯示的數據List<Student> sList;public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getCurrIndex() {return currIndex;}//設置當前頁public void setCurrIndex(int currIndex) {//判斷當前頁是否小于0,如果是,則默認第一頁if(currIndex<=0){this.currIndex = 1;}else{this.currIndex = currIndex;}}public int getTotalCount() {return totalCount;}//計算總頁數public void setTotalCount(int totalCount) {this.totalCount = totalCount;int pages = totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;totalPage = pages;}public int getTotalPage() {return totalPage;}public void setTotalPage(int totalPage) {this.totalPage = totalPage;}public List<Student> getsList() {return sList;}public void setsList(List<Student> sList) {this.sList = sList;}}代碼解析:我們可以看到,在IStudentDao中,除了有增刪改和登錄的接口外,還有兩個接口,一個是查詢總記錄數,另一個為分頁查詢數據.
//總記錄數public int findAllStudentCount();//分頁查詢public List<Student> findStudentByPage(int currIndex,int pageSize);總記錄數的作用就是對總頁數進行計算,公式為,總頁數=總記錄數%頁大小==0?總記錄數/頁大小:總記錄數/頁大小+1;
分頁查詢的數據,由于是多條,即返回List集合,每頁顯示5條數據,那我們就查詢5條,即參數pageSize的值為5.currIndex的作用是用來記錄當前頁。
實現類對于這兩個接口的關鍵代碼如下:
//查詢總記錄數@Overridepublic int findAllStudentCount() {String sql = "select count(*) from student";int count = 0;try {rs = base.ExecuteQuery(sql, null);rs.next();count = rs.getInt(1);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return count;}//分頁查詢@Overridepublic List<Student> findStudentByPage(int currIndex, int pageSize) {String sql = "select * from student limit ? ,?";int one = (currIndex-1)*pageSize;List<Object> params = new ArrayList<Object>();params.add(one);params.add(pageSize);List<Student> sList = new ArrayList<Student>();try {rs = base.ExecuteQuery(sql, params);while(rs.next()){Student stu = new Student();stu.setSid(rs.getInt(1));stu.setSname(rs.getString(2));stu.setSphone(rs.getString(3));stu.setSpass(rs.getString(4));stu.setSaddress(rs.getString(5));stu.setSage(rs.getInt(6));sList.add(stu);}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return sList;}PageUtils類的我們需要注意,在設置當前頁currIndex的值時,要對齊進行判斷,因為當前頁永遠永遠的不可能小于0 或者大于總頁數,設置的關鍵代碼如下:
//設置當前頁public void setCurrIndex(int currIndex) {//判斷當前頁是否小于0,如果是,則默認第一頁if(currIndex<=0){this.currIndex = 1;}else{this.currIndex = currIndex;}}設置總記錄數的關鍵代碼如下:順便對總頁數進行計算
//計算總頁數public void setTotalCount(int totalCount) {this.totalCount = totalCount;int pages = totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;totalPage = pages;}接下來就可以在表現層進行分頁,我們在進分頁查詢的頁面之前,先進doPage.jsp對數據進行處理,將所有需要用到的分頁數據全部封裝至PageUtils類中,完整實現代碼如下:各個關鍵步驟均有注釋
<%@page import="org.entity.Student"%> <%@page import="org.service.impl.StudentServiceImpl"%> <%@page import="org.service.IStudentService"%> <%@page import="org.utils.PageUtils"%> <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%//Student stu = (Student) request.getAttribute("student");//判斷是否是管理員//if (stu.getSaddress().equals("管理員")) {//獲取當前頁,//如果是空,默認是1String curr = request.getParameter("currIndex");if (curr == null) {curr = "1";}Integer currIndex = Integer.parseInt(curr);PageUtils p = new PageUtils();p.setPageSize(5);//計算總記錄數IStudentService s = new StudentServiceImpl();//從數據庫中查詢總記錄數p.setTotalCount(s.findAllStudentCount());//如果當前頁大于等于總頁數,那當前頁就是總頁數if (currIndex >= p.getTotalPage()) {currIndex = p.getTotalPage();} else if (currIndex <= 0) {//如果當前頁小于等于0,則當前頁等于1currIndex = 1;}p.setCurrIndex(currIndex);//從數據庫中查詢每頁顯示的數據放在集合中List<Student> sList = s.findStudentByPage(currIndex, 5);p.setsList(sList);//將p對象放在request作用域中,在請求的頁面中獲取request.setAttribute("p", p);//跳轉到分頁的頁面request.getRequestDispatcher("findStudentPage.jsp").forward(request, response);//} else {//普通員工//跳轉到查詢自己信息的頁面/* request.setAttribute("stu", stu);request.getRequestDispatcher("shouInfo.jsp").forward(request,response); }*/ %>注意看這一行代碼,當我們將一切處理完之后,通過這行代碼轉發至分頁顯示信息的頁面,
request.getRequestDispatcher(“findStudentPage.jsp”).forward(request, response);
下面就是分頁顯示數據的頁面了:
<%@page import="org.utils.PageUtils"%> <%@page import="org.entity.Student"%> <%@page import="org.service.impl.StudentServiceImpl"%> <%@page import="org.service.IStudentService"%> <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% 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 'FindStudentPage.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="styles.css">--></head><body><%//獲取所有的數據PageUtils p = (PageUtils)request.getAttribute("p");//從工具類中獲取每頁顯示的數據List<Student> sList =p.getsList() ;%><table border="1"><tr><td>編號</td><td>姓名</td><td>電話</td><td>密碼</td><td>地址</td><td>年齡</td></tr><%for(Student stu :sList){%><tr><td><%=stu.getSid() %></td><td><%=stu.getSname() %></td><td><%=stu.getSphone() %></td><td><%=stu.getSpass() %></td><td><%=stu.getSaddress()%></td><td><%=stu.getSage() %></td></tr><%}%> </table><a href="doPage.jsp?currIndex=1">首頁</a><a href="doPage.jsp?currIndex=<%=p.getCurrIndex()-1%>">上一頁</a><%=p.getCurrIndex()%> / <%=p.getTotalPage()%><a href="doPage.jsp?currIndex=<%=p.getCurrIndex()+1%>">下一頁</a><a href="doPage.jsp?currIndex=<%=p.getTotalPage()%>">末頁</a><br/><form action="doPage.jsp" method="post">至<input type="number" max="<%=p.getTotalPage() %>" min="1" value="<%=p.getCurrIndex() %>" style="display:inline-block; width:50px" name="currIndex"/>頁<input type="submit" value="跳轉"></form></body> </html>代碼解析:
先從request中獲取doPage.jsp中放入的數據,然后以表格的形式展示出來。
翻頁解析:
首頁,很簡單,當前頁碼必定是1,所以直接寫currIndex=1即可。
上一頁,假如當前也是2,那么上一頁就是當前也減去1,所以上一頁就是currIndex-1。
下一頁,正好和上一頁相反,即currIndex+1。
尾頁,假如一共有5頁,那么尾頁就是5,即currIndex=5。
當前頁和總頁數由于我們在doPage都放在了PageUtils中,所以直接從PageUtils中獲取即可。
注意我們無論是點擊上一頁還是下一頁,或者首頁尾頁,均是跳轉至doPage.jsp中操作,在doPage.jsp中,直接獲取currIndex的值,然后在調用Service里面的方法進行分頁查詢。
運行效果如下所示:
最后歡迎關注作者公眾號:雄雄的小課堂
總結
以上是生活随笔為你收集整理的javaweb实现分页(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用纸条怎么扎钱 扎钞纸使用方法
- 下一篇: java中的Queue队列的用法