分页探究--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就好。
分页探究--Filter+JSTL的更多相关文章
- 分页管理的JSTL实现
userMgr.jsp <%@ page language="java" import="java.util.*" pageEncoding=" ...
- 数据库分页和使用jstl标签替换分页的jsp代码
参考链接: http://www.mossle.com/docs/jsp/html/jsp-ch-15.html
- Hbase 学习(二)各种filter
各种filter 今天的主题是Filter,hbase客户端查询的时候,自定义查询filter. 直接上例子吧,不多说别的了,第一个例子是RowFilter的. Scan scan = new Sca ...
- php分页实例及其原理
Part1:实例 /** * 取得上次的过滤条件 * @param string $param_str 参数字符串,由list函数的参数组成 * @return 如果有,返回array('filter ...
- easyui datagrid client搜索、分页、排序
easyui datagrid的排序默认是server端排序.能够用sorter实现client排序[2].client分页可用filter实现[3].client搜索相同能够用filter实现. 不 ...
- eclipse 新建 maven 项目 添加 spring hibernate 的配置文件 详情
主要配置文件 pom.xml 项目的maven 配置文件 管理项目所需 jar 依赖支持 web.xml 项目的总 配置文件 :添加 spring和hibernate 支持 applicationC ...
- springmvc 孔浩 hibernate code
model--User package model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; ...
- ecshop 后台分页功能
Ecshop分页规则,分以下几个步骤 1.点击类别,获取第一页获取默认分类列表数据 2.点击“下一页”,采用ajax调取分页内容 实例分析(比如订单列表分页admin/order.php) 1.先写一 ...
- ecshop后台分页浅析
既然是分页,道理都是一样的,不过ecshop前台分页的函数和后台分页的函数不同,后台分页函数为page_and_size(),在admin/includes/lib_main.php里.都是用aj ...
随机推荐
- C# 面试的“区别”
1.静态变量与非静态变量的区别 静态变量--static.直接类名+变量名.静态函数里不能用非静态变量. 访问同一类中所有实例同一静态变量都是同一值.非静态变量则不是. 2.const与readonl ...
- 十天冲刺---Day6
站立式会议 站立式会议内容总结: 燃尽图 照片 一个队友回家有事,一个队友参加校运会比赛,只剩下两个人. 失去了UI是噩梦
- 使用iframe标签结合springMvc做文件上传
1.iframe.jsp <body> <h1>测试iframe文件上传</h1> <!-- 1.要求表单的target属性名称与iframe的name名字一 ...
- 关于insert /*+ append*/ 各种insert插入速度比较
来源于:http://www.cnblogs.com/rootq/archive/2009/02/11/1388043.html SQL> select count(*) from t;COUN ...
- 对象关系映射ORM
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效 ...
- iOS开发小技巧--定时器的使用技巧
一.定时器的使用技巧 -- 定义好了定时器后,添加两个方法,一个是添加定时器的方法,另一个是移除定时器的方法. 使用的时候也要注意,一定先移除之前的timer,然后再添加timer
- java设计模式(六) 命令模式
[命令模式]将"请求"封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作. 1,定义命令接口 package com.pattern.comm ...
- IntelliJ_设置
1.修改背景色.修改字体大小 http://blog.csdn.net/hpf911/article/details/16888797 2.显示行号 搜索Line Number 3.代码结构图 Vie ...
- eclipse-搭建maven的war项目集合spring注解方式
工具:eclipse 4.4.2 版本号:20150219-0600 jdk:1.7 1.下图创建maven工程,然后next 下图选择工程保存位置(这里选择默认),next 下图选择webapp项目 ...
- c#如何使输入数据类型限制,C#如何添加限制
验证n位的数字:^\d{n}$ ,例如要输6位数字,不能多也不能少: ^\d{6}$ 验证数字的正则表达式集 验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$ ...