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

转载于:https://www.cnblogs.com/chentingk/p/5825957.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python能做大型游戏吗_python有做大型游戏的潜力吗?

著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 岂止是有潜力&#xff0c;简直是很合适&#xff01; 猪厂两大游戏客户端引擎&#xff0c;NeoX 和 Messiah&#xff0c;都使用 Python 作为脚本语言。 你最近所了解的比较火的挂着猪厂旗号的&a…

第4章 Python 数字图像处理(DIP) - 频率域滤波2 - 复数、傅里叶级数、连续单变量函数的傅里叶变换、卷积

目录基本概念复数傅里叶级数冲激函数及其取样&#xff08;筛选&#xff09;性质连续单变量函数的傅里叶变换卷积基本概念 复数 复数CCC的定义为 CRjI(4.3)C R jI \tag{4.3}CRjI(4.3) R,IR,IR,I为实数&#xff0c;RRR是实部&#xff0c;III是虚部&#xff0c;j−1j \sqrt{-…

不要迷失在技术的海洋中【转】

转自http://www.cnblogs.com/lovecherry/archive/2007/10/28/940555.html 不要迷失在技术的海洋中 技术就好像一片汪洋大海&#xff0c;越深入越望不到边际。就拿自己的体验来说吧&#xff0c;2000年的时候在学校搞ASP&#xff0c;觉得网页开发就是这么简单&#xff0c;把数据库…

使用代码设置Item级的权限(权限总结1)

itle in english:set Item Level Permission for SharePoint (MOSS/WSS) List/Document Library Programmatically 有些时候&#xff0c;我们需要为文档库里面某个文件设置特殊的权限&#xff0c;这个权限不继承自列表权限&#xff0c;当然最简单的最好是再创建一个列表&#…

echarts 4.0.4怎么下载_怎么让ECharts的提示框tooltip自动轮播?

1. 怎么让ECharts的提示框tooltip自动轮播?在用ECharts做大屏或者可视化展示项目的时候&#xff0c;让提示框tooltip自动轮播是比较常见的需求&#xff0c;给大家推荐一个插件叫echarts-tooltip-auto-show,名字是有点长&#xff0c;但是挺好用的。在hover显示tooltip之后&…

[React Native]高度自增长的TextInput组件

之前我们学习了从零学React Native之11 TextInput了解了TextInput相关的属性。 在开发中,我们有时候有这样的需求, 希望输入区域的高度随着输入内容的长度而增长, 如下&#xff1a; 这时候我们需要自定义一个组件&#xff1a; 在项目中创建AutoExpandingTextInput.js import …

第4章 Python 数字图像处理(DIP) - 频率域滤波3 - 取样和取样函数的傅里叶变换、混叠

目录取样和取样函数的傅里叶变换取样取样后的函数的傅里叶变换取样定理混叠由取样后的数据重建&#xff08;复原&#xff09;函数取样和取样函数的傅里叶变换 取样 fˉ(t)f(t)sΔT(t)∑n−∞∞f(t)δ(t−nΔT)(4.27)\bar f(t) f(t)s_{\Delta T}(t) \sum_{n-\infty}^{\infty}…

[转]Android开发,实现可多选的图片ListView,便于批量操作

本文转自&#xff1a;http://www.cnblogs.com/gergulo/archive/2011/06/14/2080629.html 之前项目需要实现一个可多选的图片列表&#xff0c;用户选中一到多张图片后&#xff0c;批量上传。但是网上有可多选普通列表的代码、也有单纯图片列表的代码&#xff0c;却没有两者合并的…

个人信息安全影响评估指南_发布 | 网络安全标准实践指南—移动互联网应用程序(App)收集使用个人信息自评估指南...

关于发布《网络安全标准实践指南—移动互联网应用程序(App)收集使用个人信息自评估指南》的通知信安秘字[2020] 40号各有关单位&#xff1a;为落实《网络安全法》相关要求&#xff0c;围绕中央网信办、工信部、公安部、市场监管总局联合制定的《App违法违规收集使用个人信息行为…

在线生成 CSS3 的工具

1) CSS Creator – Layout Design 2) CSS Menu Maker 3) CSS3 Please 4) CSS3 Generator 5) CSS Border Radius 6) CSS3 Gradient Generator 7) CSS3 Button Generator 8 ) Mike Plate’s CSS3 Playground 9) Border Image Generator 10) CSS3 WRAP 11) Button Maker 12) Font…

python image 转成字节_就是这么牛!三行Python代码,让数据处理速度提高2到6倍

本文可以教你仅使用 3 行代码&#xff0c;大大加快数据预处理的速度。Python 是机器学习领域内的首选编程语言&#xff0c;它易于使用&#xff0c;也有很多出色的库来帮助你更快处理数据。但当我们面临大量数据时&#xff0c;一些问题就会显现……在默认情况下&#xff0c;Pyth…

第4章 Python 数字图像处理(DIP) - 频率域滤波5 - 二变量函数的傅里叶变换、图像中的混叠、二维离散傅里叶变换及其反变换

目录二变量函数的傅里叶变换二维冲激及其取样性质二维连续傅里叶变换对二维取样和二维取样定理图像中的混叠二维离散傅里叶变换及其反变换二变量函数的傅里叶变换 二维冲激及其取样性质 两个连续变量的冲激函数定义为&#xff1a; δ(t,z){1,tz00,others(4.52)\delta(t, z) …

QC4+充电协议_一文看懂各家充电协议!总算彻底理清了

五一小长假马上就要到了&#xff0c;虽说今年的五一小长假是一个长达5天的“Plus”版小长假&#xff0c;但是受到疫情的影响&#xff0c;大多数人还是选择了在家中度过这个假期。既然说到了宅在家里度过这个假期&#xff0c;那么很多人都会选择让手机来陪伴自己度过。虽然最近几…

类图 示例

神州六号飞船是神州飞船系统的一种&#xff0c;它由轨道舱、返回舱、推进舱和逃逸求生塔等组成&#xff1b;航天员可以在返回舱内驾驶飞船&#xff0c;轨道舱由是航天员工作和休息的场所。在紧急的情况下&#xff0c;可以利用逃逸求生塔逃生。在飞船两侧有多个太阳能电池翼&…

bat 命令返回结果_bat教程[284] unzip解压

古树屋Click to follow us(1)unzip命令的简介C:\Users\86137\Desktop>unzip -hUnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spieler. Sendbug reports using http://www.info-zip.org/zip-bug.html; see README for details.Usage: unzip [-Z] [-opts[mo…

Framework7:不会Objective-C,也能开发iOS7应用

摘要&#xff1a;Framework7是一款开源的轻量级HTML框架&#xff0c;用来创建混合或有着iOS7原生体验的Web应用。其包含HTML布局、所有基础界面、动画效果、视图以及简单的自定义样式&#xff0c;让你无需修炼Objective-C语言&#xff0c;就可以构建自己的iOS7应用。 Framework…

第4章 Python 数字图像处理(DIP) - 频率域滤波7 - 二维DFT和IDFT的一些性质 - 傅里叶频谱和相角

目录二维DFT和IDFT的一些性质傅里叶频谱和相角二维DFT和IDFT的一些性质 傅里叶频谱和相角 F(u,v)R(u,v)jI(u,v)∣F(u,v)∣ejϕ(u,v)(4.86)F(u, v) R(u, v) jI(u, v) |F(u, v)|e^{j\phi(u,v)} \tag{4.86}F(u,v)R(u,v)jI(u,v)∣F(u,v)∣ejϕ(u,v)(4.86) 幅度&#xff0c;称为…

第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理

目录二维DFT和IDFT的一些性质二维离散卷积定理二维离散傅里叶变换性质的小结二维DFT和IDFT的一些性质 二维离散卷积定理 二维循环卷积表达式&#xff1a; (f⋆h)(x,y)∑m0M−1∑n0N−1f(m,n)h(x−m,y−n)(4.94)(f \star h)(x, y) \sum_{m0}^{M-1} \sum_{n0}^{N-1} f(m,n)h(x…

jmeter中重定向多个正则表达式_2020年jmeter技术实战续集,最新技术全栈,值得收藏

在上一篇&#xff1a;主要介绍线程组、HTTP请求默认值、用户定义的变量、固定定时器的应用场景及实战。以下主要介绍正则表达式提取器、调式取样器(Debug Sampler)、响应断言、HTTP信息头管理器的应用场景及实战。一、正则表达式提取器1、使用场景从请求的响应结果中取到需要的…

[置顶] 均衡音效

[置顶] 均衡音效 1均衡的作用 均衡器是一种可以分别调节各种频率成分电信号放大量的电子设备&#xff0c;通过对各种不同频率的电信号的调节来补偿扬声器和声场的缺陷&#xff0c;补偿和修饰各种声源及其它特殊作用。具体来说&#xff0c;它的作用如下&#xff1a; &#xff08…