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

时间: 2024-10-11 22:52:32

分页探究--Filter+JSTL的相关文章

分页管理的JSTL实现

userMgr.jsp 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 3 <% 4 String path = request.getContextP

sql server 分页存储过程

随着信息时代的发展信息系统的使用越来越多,信息量越来越大:当信息量越来越大,这在数据 展示,特别是报表这块对系统展现效率要求越来越高,对于千万级数据量的展示必须得使用分页来展示. www.2cto.com If object_id('SP_Pagination')is not null drop proc SP_Pagination go Create PROCEDURE SP_Pagination /**//* *****************************************

easyui datagrid 客户端搜索、分页、排序

easyui datagrid的排序默认是服务器端排序,可以用sorter实现客户端排序[2]:客户端分页可用filter实现[3]:客户端搜索同样可以用filter实现. 不多说直接上代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="keywords" con

eclipse 新建 maven 项目 添加 spring hibernate 的配置文件 详情

主要配置文件 pom.xml 项目的maven 配置文件 管理项目所需 jar 依赖支持 web.xml 项目的总 配置文件  :添加 spring和hibernate 支持 applicationContext.xml   hibernate的配置文件 sping-servlet.xml spring的配置文件 jdbc-properties 数据库连接属性 文件 ------------------------------pom.xml 开始-------------------------

HBase系统入门--整体介绍

转自:http://www.aboutyun.com/thread-8957-1-2.html 问题导读:1.HBase查询与写入哪个更好一些?2.HBase面对复杂操作能否实现?3.Region服务器由哪2部分构成?扩展:4.HBase能否实现join操作?5.二级索引的作用是什么? 前言如今在软件开发领域,谈及大数据已经是家常便饭.笔者相信在未来几年内,大数据的运算和存储一定会成为企业关注的核心.在此普及一个概念,什么级别的数据才能称之为大数据?如果你存储在DB中的数据达到了PB或者单表过亿

网上书城项目总结(servlet_jsp+javaBean)

网上书城项目总结 1 项目大纲设计: 需求分析 系统设计 详细设计 权限设计 2 技术选型: Servlet+jsp+javaBean Listener+Filter+jstl+fileupload+c3p0+dbutils+mysql 3 开发顺序: 从dao层到service层再到web层 网上书城需求分析: 分别对管理员,普通用户,系统三个用户角色的各个功能的实现. 其中包括管理员对图书商城的后台图书以及图书的类别分类增删查改,以及订单的状态; 普通用户对于图书的选购,浏览,购物车的管理以

ADO.NET Data Service

关于ADO.NET Entity Framework部分的内容见ADO.NET Entity Framework(1-4) http://www.cnblogs.com/foundation/archive/2008/10/06/1304718.html 本文例子下载: http://files.cnblogs.com/wxwinter/lz.rar 目录 1    ADO.NET Data Service介绍    2 2    创建DataService项目    3 2.1    数据表 

ecshop二次开发--后台秒杀

1.进入admin->includes->inc_menu.php中此文件为定义左侧功能模块超链接 2.添加include/inc_menu.php秒杀管理超链接找链接 $modules['03_promotion']['16_seckill'] = 'seckill_goods.php?act=add'; 3.找到languages/zh_cn/admin/common.php 添加秒杀功能 $_LANG['16_seckill']='秒杀管理'; 4.添加权限管理中的秒杀权限 1>向

ecshop 后台分页功能

Ecshop分页规则,分以下几个步骤 1.点击类别,获取第一页获取默认分类列表数据 2.点击“下一页”,采用ajax调取分页内容 实例分析(比如订单列表分页admin/order.php) 1.先写一个function order_list() 模块,里面要包括可以进行排序,分页,查询等功能 2.在order.php里面写一个elseif ($_REQUEST['act'] == 'list') ,这里是显示默认分页数据 3.在order.php写一个query(listtable.js默认的是