分页探究--Filter+JSTL

  最近卡了一个功能就是分页,查了很多资料,分页大概是两种类型:一种是把数据库的东西全部查出来然后放在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 stub
        ss = 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 here
        String 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 chain
        System.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就好。

原文地址:https://www.cnblogs.com/chentingk/p/5825957.html