Javaweb分頁顯示實現

分頁顯示對於數據在頁面中的展示是非常重要的工具,當數據條數較多時,就需要使用分頁來顯示。實現分頁顯示的思路包括:(1)確定數據庫中一共有多少條數據,即數據總數;(2)設定每頁準備顯示多少條數據,計算出一共需要分多少頁,即分頁數目=數據總數/每頁數目,由於用到除法,當數據總數能被每頁數目整除時,那就正好那麼多頁;當不能整除時就需要在分頁數目上加上一頁纔行;(3)有了數據總數,每頁數據條數,分頁數目後,開始使用數據庫查詢出每頁的數據,然後傳遞給Servlet處理,然後在視圖層顯示。(4)其中的數據總數,通過數據庫查詢獲得,每頁顯示數據條數,需要直接給定值,獲取每頁的數據,使用sql語句的"select * from user order by ID desc limit 每頁數目*當前頁數,每頁數目", 包括兩個變量:每頁數目,這是可以直接賦值的,當前頁數,則需要從前端jsp頁面獲取纔行。因此要實現分頁顯示,正好將數據庫、servlet、jsp頁面三個層次都用到。

下面進行一個實例,說明分頁顯示實現過程:

(1)先保證數據庫裏的表數據條目較多,比如本案例中學生用戶表一共8個用戶數據,每頁顯示3條,因此這裏就需要3頁顯示。

每頁數目=3;數據總數則需要查詢獲取。

(2)新建兩個實體:User和Page,User用於學生對象,Page用於分頁對象。

package org.student.entity;

public class User {
   private int ID;
   private String Name;
   private String Sex;
   
	public User(int iD) {	 
		this.ID = iD;
}
	public User(int iD, String name, String sex) {	 
		this.ID = iD;
		this.Name = name;
		this.Sex = sex;
}
	public int getID() {
		return ID;
	}
	public void setID(int iD) {
		ID = iD;
	}
	public String getName() {
		return Name;
	}
	public void setName(String name) {
		Name = name;
	}
	public String getSex() {
		return Sex;
	}
	public void setSex(String sex) {
		Sex = sex;
	}
}
package org.student.entity;
public class Page {
	 private int pageSize;
	 private int totalPage;  
	 private int Index;
     public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getTotalPage() {
		return totalPage;
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}	
	public int getIndex() {
		return Index;
	}
	public void setIndex(int index) {
		this.Index = index;
	}

    public Page() {
		super();
	}
	public Page(int Index, int pageSize) {
	 this.Index=Index;	 
	 this.pageSize=pageSize;
    } 
}


(3)根據需求編寫學生用戶、分頁接口及其實現類,習慣上接口命名爲IName,實現類命名爲NameImpl

分頁接口:

package org.student.dao;

public interface IpageDao {   
   public int getTotalPage(int pageSize);     
}

分頁實現類: 

package org.student.dao;
import java.sql.SQLException;
public class PageDaoImpl implements IpageDao {
	@Override
	public int getTotalPage(int pageSize) {  //總共多少頁數
		 DButil db=new DButil();
		 int total=0,totalPage=0;  
		 String sql="select count(ID) from user";
		 try {
			total=db.getTotalCount(sql);  //總數
			totalPage=total%pageSize>0?total/pageSize+1:total/pageSize;  //總頁數		
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //總數量  	 
		
		 return totalPage; 		 
	}
}

用戶接口類:

package org.student.dao;

import java.util.List;

import org.student.entity.Page;
import org.student.entity.User;

public interface IUser {
  public List<User> queryUserByPage(Page page);
}

用戶實現類,實現分頁查詢獲得每頁的數據,關鍵參數給定就是當前頁數和每頁數目: 

package org.student.dao;

import java.sql.*;
import java.util.*;
import org.student.entity.Page;
import org.student.entity.User;

public class UserDaoImpl implements IUser {
	public Connection con=null;
    public PreparedStatement pst=null;
    public Statement sm=null;
	public ResultSet rs=null;
	@Override
	public List<User> queryUserByPage(Page page) throws SQLException {
		List<User> arr=new ArrayList(); 
		 DButil db=new DButil();  //實例化數據庫db
		 try {
			con=db.initConnection();	//連接數據庫		 
		 String sql1="select * from user limit ?,? ";  //分頁查詢
		 pst=con.prepareStatement(sql1);
		 pst.setInt(1, page.getIndex()*page.getPageSize());	//當前頁*每頁數目	
		 pst.setInt(2, page.getPageSize());//每頁數目
		 rs=pst.executeQuery();
		 while(rs.next()) {
			 User stu=new User(rs.getInt(1),rs.getString(2),rs.getString(3));//查詢數據存到user對象
			 arr.add(stu);//存成List集合
		 }
		 } catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		db.close();//關閉數據庫
		return arr;
	}

}

(4)上述用戶分頁查詢實現類中參數每頁數目可以直接賦值,而當前頁數則需要前端頁面獲取,如當前頁爲1,當前頁爲2等。在實現的時候在jsp頁面使用javabean封裝,頁面列表下方呈現分頁標記:首頁   前一頁   後一頁  末頁。每一組文字均爲超鏈接a,首頁<a href="?start=0">,使用?傳值,start爲起始頁數變量,index爲0表示第一頁,末頁<a href="?start=TotalPage-1>",TotalPage爲總頁數,在page實現類中傳值過來。如下爲前端jsp頁面。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" import="org.student.entity.User" import="org.student.entity.Page"%>
 <jsp:useBean id="user" scope="page" class="org.student.dao.UserDaoImpl"/>
 <jsp:useBean id="pg" scope="page" class="org.student.dao.PageDaoImpl"/>
 <!DOCTYPE html>
<html>  
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>所有用戶列表</h4>
<table border="1" width="60%">
  <tr>
    <td>用戶姓名</td>
    <td>用戶性別</td>
    <td>操作</td>  
  </tr> 
  <%
  request.setCharacterEncoding("UTF-8");
  //獲取當前頁數,首次進入時start爲0,點擊超鏈接時獲取start頁數
  int start=request.getParameter("start")==null?0:Integer.parseInt(request.getParameter("start"));
  //通過page實現類獲得總頁數,這裏的3爲每頁數目
  int pageSize=3;
  int totalPage=pg.getTotalPage(pageSize); 
  //前一頁頁數、後一頁變量值
  int prePage=start-1>0?start-1:start+1;
  int nextPage=start+1<totalPage?start+1:totalPage-1;
  //使用request.setAttribute方法便於頁面中使用el語法
  request.setAttribute("totalPage", totalPage);
  request.setAttribute("prePage", prePage);
  request.setAttribute("nextPage", nextPage);
  //獲得當前頁的數據
  Page pg1=new Page(start,pageSize);   
  List<User> currentUser=(List<User>)user.queryUserByPage(pg1); 
  //遍歷顯示
  for(User userlist:currentUser){ 
  %>
   <tr>
    <td><%=userlist.getName() %></td>
     <td><%=userlist.getSex() %></td>
      <td><a href="deleteStudent.jsp?ID=<%=userlist.getID() %>">刪除</a><br><a href="updateStudent.jsp?ID=<%=userlist.getID() %>">修改</a></td>
  </tr>
  <% } %>

</table>
	<nav>
	    <ul class="pagination">
	        <li>
	            <a  href="?start=0">
	                <span>首頁</span>
	            </a>
	        </li>        
	        <li>
	            <a  href="?start=${requestScope.prePage }">
	                <span>前一頁</span>
	            </a>
	        </li> 
	        <li>
	            <a  href="?start=${requestScope.nextPage }">
	                <span>後一頁</span>
	            </a>
	        </li> 
	        <li>
	            <a href="?start=${requestScope.totalPage-1} ">
	                <span>尾頁</span>
	            </a>
	        </li>
	    </ul>   
	</nav>
</body>
</html>

上述頁面中頭部有不少java代碼,從MVC角度考慮如果需要將頁面不含java代碼,可以考慮增加一個servlet服務層,將這些java代碼放到servlet服務層中,然後再來進行頁面跳轉。如下爲userPageServlet代碼:

@WebServlet("/userPageServlet" )
public class userPageServlet extends HttpServlet { 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 doPost(request,response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		  request.setCharacterEncoding("UTF-8");
		  System.out.println("welcome");
		  //獲取當前頁數,首次進入時start爲0,點擊超鏈接時獲取start頁數
		  int start=request.getParameter("start")==null?0:Integer.parseInt(request.getParameter("start"));
		  //通過page實現類獲得總頁數,這裏的3爲每頁數目
		  int pageSize=3;
		  PageDaoImpl pg=new PageDaoImpl();
		  int totalPage=pg.getTotalPage(pageSize); 
		  //前一頁頁數、後一頁變量值
		  int prePage=start-1>0?start-1:start+1;
		  int nextPage=start+1<totalPage?start+1:totalPage-1;
		  //使用request.setAttribute方法便於頁面中使用el語法
		  request.setAttribute("totalPage", totalPage);
		  request.setAttribute("prePage", prePage); 
		  request.setAttribute("nextPage", nextPage);
		  //獲得當前頁的數據
		  Page pg1=new Page(start,pageSize); 
		  UserDaoImpl user=new UserDaoImpl();
		  try {
			List<User> currentUser=(List<User>)user.queryUserByPage(pg1);
			 request.setAttribute("userList", currentUser);
			 request.getRequestDispatcher("userPage.jsp").forward(request, response);
		   } catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		  }
	     
	}

}

然後在userPage.jsp頁面中只需要request.getAttributes獲取到數據,即可。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" import="org.student.entity.User" import="org.student.entity.Page"%>
 
 <!DOCTYPE html>
<html>  
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>所有用戶列表</h4>
<table border="1" width="60%">
  <tr>
    <td>用戶姓名</td>
    <td>用戶性別</td>
    <td>操作</td>  
  </tr> 
  <%
  request.setCharacterEncoding("UTF-8");
  List<User> currentUser=(List<User>)request.getAttribute("userList");   
  //遍歷顯示
  for(User userlist:currentUser){ 
  %>
   <tr>
    <td><%=userlist.getName() %></td>
     <td><%=userlist.getSex() %></td>
      <td><a href="deleteStudent.jsp?ID=<%=userlist.getID() %>">刪除</a><br><a href="updateStudent.jsp?ID=<%=userlist.getID() %>">修改</a></td>
  </tr>
  <% } %>
</table>
	<nav>
	    <ul class="pagination">
	        <li>
	            <a  href="userPageServlet?start=0">
	                <span>首頁</span>
	            </a>
	        </li>        
	        <li>
	            <a  href="userPageServlet?start=${requestScope.prePage }">
	                <span>前一頁</span>
	            </a>
	        </li> 
	        <li>
	            <a  href="userPageServlet?start=${requestScope.nextPage }">
	                <span>後一頁</span>
	            </a>
	        </li> 
	        <li>
	            <a href="userPageServlet?start=${requestScope.totalPage-1} ">
	                <span>尾頁</span>
	            </a>
	        </li>
	    </ul>   
	</nav>
</body>
</html>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章