• 分页探究--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就好。

  • 相关阅读:
    镜像的上传和下载
    ps 命令
    过滤不合格数据
    云计算5-3-2法则
    Python Django初入门
    python web框架
    BootStrap、EasyUI、JQueryUI
    JS正则
    ngonx FastCGI 相关参数调优
    Windows10远程连接错误-出现身份验证错误
  • 原文地址:https://www.cnblogs.com/chentingk/p/5825957.html
Copyright © 2020-2023  润新知