最近卡了一個功能就是分頁,查了很多資料,分頁大概是兩種類型:一種是把數據庫的東西全部查出來然后放在session里,用list一頁一頁傳到頁面,這樣的消耗比較大;另一種就是使用sql語句的limit來進行數據庫分頁查詢。我使用的是后者。
大致邏輯: (1)需要currentPage,count屬性。
? (2)需要注意current不能點擊。
(3)全使用a標簽進行頁面跳轉。并附上請求頁碼。
?(4)初始化查詢0頁,并用filter裝入list中,在頁面顯示的時候方便遍歷。
(5)過程:頁面加載->filter查詢初始數據裝入request->頁面遍歷并計算出頁碼請求附帶在url后->請求發出后filter使用getParameter獲得頁碼對數據庫進行查詢,并裝入list中->頁面加載的時候遍歷list出現新數據。
頁面如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page contentType="text/html; charset=utf-8" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>分頁列表</title> </head> <body> <center><%int currenPage=((Integer)request.getAttribute("currenPage")).intValue();int count=((Integer)request.getAttribute("count")).intValue();%><table border="1px"><tr><td>ID</td><td>用戶名</td><td>性別</td><td>年齡</td></tr><c:forEach var="usr" items="${list}"><tr><td>${usr.id}</td><td>${usr.name}</td><td>${usr.sex}</td><td>${usr.age}</td></tr></c:forEach></table><%int prePage=currenPage-1;if(currenPage==1)prePage=currenPage;%><a href="Demo2.jsp?<%="curren="+prePage%>">上一頁</a> <%int i=1;int end=currenPage+5;if(currenPage>5){i=currenPage-5;}if(end>count/10){end=count/10;System.out.println("end="+end);}for(;i<=end;i++){System.out.println("i="+i);if(i == (currenPage)){%>[<%=currenPage%>] <% }else{%><a href="Demo2.jsp?<%="curren="+i%>"><%=i%></a> <% }}%><%int nextPage=currenPage+1;if(nextPage>count/10)nextPage--;%><a href="Demo2.jsp?<%="curren="+nextPage%>">下一頁</a> </center> </body> </html>
Filter如下
package filter;import java.io.IOException; import java.util.List;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter;import dividedpage.SelectService; import model.test_u;/*** Servlet Filter implementation class divideFilter*/ @WebFilter("/Demo2.jsp") public class divideFilter implements Filter {private static final long serialVersionUID = 1L;private int start=0;private int size=10;private SelectService ss;private List<test_u> list;/*** Default constructor. */public divideFilter() {// TODO Auto-generated constructor stubss = new SelectService();}/*** @see Filter#destroy()*/public void destroy() {// TODO Auto-generated method stub }/*** @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stub// place your code hereString cu=request.getParameter("curren");if(cu!=null){start=Integer.parseInt(cu);}System.out.println(start);list = ss.selectLimit((start-1)*size, size);int count = ss.getConut(); request.setAttribute("list", list);request.setAttribute("count", count);request.setAttribute("currenPage", start);// pass the request along the filter chainSystem.out.println("執行過濾");chain.doFilter(request, response);}/*** @see Filter#init(FilterConfig)*/public void init(FilterConfig fConfig) throws ServletException {// TODO Auto-generated method stub }}
JDBC如下
package DAO; import java.sql.*; public class Connect2DB {String driver="com.mysql.jdbc.Driver"; Connection con; String url="jdbc:mysql://localhost:3306/MyData"; String user="root"; String pwd="qwert123";public Connect2DB(){connection2MYSQL() ;}public void connection2MYSQL() { try { Class.forName(driver); con=DriverManager.getConnection(url,user,pwd); if(!con.isClosed()) System.out.println("連接成功"); } catch (Exception e) { e.printStackTrace(); } }public Connection getConn(){return con;} }
package DAO;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 model.test_u;public class OperatorDB {private Connection con;public OperatorDB(){con=new Connect2DB().getConn();}public void addUser(test_u u){String sql="insert into test_u(id,name,sex,age) values(?,?,?,?)";PreparedStatement ps; try {ps=con.prepareStatement(sql);ps.setInt(1, u.getId());ps.setString(2, u.getName());ps.setString(3, u.getSex());ps.setString(4, u.getAge());ps.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch block e.printStackTrace();}}public void delUserById(int id){String sql="delete from test_u where stu_id = ?";PreparedStatement ps; try {ps=con.prepareStatement(sql);ps.setInt(1, id);ps.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch block e.printStackTrace();}}public List<test_u> selectLimit(int start,int size){String sql = "select * from test_u limit ?,?";List<test_u> result=new ArrayList<test_u>();PreparedStatement ps;try {ps = con.prepareStatement(sql);ps.setInt(1, start);ps.setInt(2, size);ResultSet rs = ps.executeQuery();while(rs.next()){int id=rs.getInt("id");String name=rs.getString("name");String sex=rs.getString("sex");String age=rs.getString("age");test_u t=new test_u(id,name,sex,age);result.add(t);}} catch (SQLException e) {// TODO Auto-generated catch block e.printStackTrace();}return result;}public int getCount(){String sql="SELECT COUNT(*) FROM test_u";int rowCount = 0;try {PreparedStatement ps;ps = con.prepareStatement(sql);ResultSet rs = ps.executeQuery(sql);rs.next(); rowCount = rs.getInt(1);} catch (SQLException e) {// TODO Auto-generated catch block e.printStackTrace();} return rowCount;}public void close(){try {if(!con.isClosed())con.close();} catch (SQLException e) {// TODO Auto-generated catch block e.printStackTrace();}} }
Service如下
package dividedpage;import java.util.List;import DAO.OperatorDB; import model.test_u;public class SelectService {public List<test_u> selectLimit(int start,int size){OperatorDB odb=new OperatorDB();List<test_u> list=odb.selectLimit(start, size);odb.close();return list;}public int getConut(){OperatorDB odb=new OperatorDB();int count = odb.getCount();odb.close();return count;} }
Bean如下
package model;public class test_u {private int id;private String name;private String sex;private String age;public test_u(){}public test_u(int id, String name, String sex, String age) {super();this.id = id;this.name = name;this.sex = sex;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}}
數據表如下,插入100條記錄
感覺代碼很冗余,頁面不夠干凈,不過也訓練了分頁的思想。
下列標簽欄全是a標簽,上一頁current-1,下一頁current+1;需要注意頁面邊界(最大,最小頁)。查詢limit大概是((current-1)*size,size)這樣的公式。
目錄樹如下:
JSTL需要下載個jar包,很容易找到,添加他們進path就好。