需求:

themeleaf ajax 列表 分页 ajax实现分页_数据


1、数据从数据库读取;

2、点击上/下一页翻页,每页显示3条数据;

3、已经是第一页再点击“上一页”提示“已经是第一页”,已经是最后一页再点击“下一页”提示“已经是最后一页”;

4、第一个文本框接收value进行与name字段的模糊查询,第二个文本框接收value进行与address字段的模糊查询,可同时进行name与address的联合模糊查询。

思路:

1、浏览器直接请求index.jsp页面,该页面执行page()方法,此时pageNo的值为1——>向DataServlet发送请求并将pageNo传到该Servlet——>Servlet收到请求,根据pageNo的值返回第一页数据和一共有多少页,并将这些数据通过request转发的方式转发到data.jsp页面——>data.jsp页面将第一页数据遍历出来并将总页数存到input中——>Web服务器响应结果——>浏览器执行index.jsp中$("#data").append(data);代码将结果显示index.jsp中在div内并给该jsp内pageTotal赋值,至此本次请求结束;
2、点击“上一页”按钮——>执行up()方法——>先判断当前是否为第一页,如果是则终止执行,否则pageNo减1——调用page()方法,执行过程回到第一步;
3、点击“下一页”按钮——>执行down()方法——>先判断当前是否为最后一页,如果是则终止执行,否则pageNo加1——调用page()方法,执行过程回到第一步;
4、定义两个文本框,用于接收用户输入的数据,将其按照相应的规则进行sql语句where条件的拼接

步骤:
1、数据准备:

themeleaf ajax 列表 分页 ajax实现分页_JSP_02

2、拷贝DBUtil、jar包、配置文件
3、新建“index.jsp”文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>分页</title>
		<script type="text/javascript" src="./js/jquery-1.8.3.min.js"></script>
		<script type="text/javascript">
			//初始化pageNo页码为1
			var pageNo=1;
			//初始化pageTotal总页数为0
			var pageTotal = 0;
			//定义“上一页”方法绑定给“上一页”按钮
			function up(){
				if(pageNo==1){
					alert("已经是第一页!");
					return;
				}
				//将页码减1
				pageNo --;
				//调用page()方法时页码已经减1
				page();
			}
			//定义“下一页”方法绑定给“下一页”按钮
			function down(){
				if(pageNo==pageTotal){
					alert("已经是最后一页!");
					return;
				}
				//将页码加1供page()使用
				pageNo ++;
				page();
			}
			//该方法实现刷新页面的效果,实现页码变动后,将对应页码的数据显示在页面中
			function page(){
				//将页码传递给DataServlet用来处理与该页码相关的jdbc操作
				var path = "./DataServlet?pageNo="+pageNo;
				//接收name与address文本框的值用于模糊查询
				var name = $("[name='name']").val();
				var address = $("[name='address']").val();
				//如果两个文本框中传值了,就将他们的值与path进行拼接,传递给DataServlet
				if(name!="" && name != undefined){
					path = path + "&name=" + name;
				}
				if(address!="" && address != undefined){
					path = path + "&address=" + address;
				}
				//定义一个异步
				var object={
					url:path,
					type:"get",
					//此时的data数据是data.jsp文件中的所有标签对象
					success:function(data){
						$("#data").html(data);
						//将收到的pageTotal隐藏框的值赋值给pageTotal
						pageTotal = $("#pageTotal").val();
					}
				}
				//触发异步
				$.ajax(object);
			}
			//在第一次加载页面时就执行page()显示第一页数据
			page();
			//为了避免点击下一页后搜索功能失效的bug,所以每次搜索时将页码重置为1
			function search(){
				pageNo=1;
				page();
			}
		</script>
	</head>
	<body>
		<style>
			table{
				border:black 1px solid; 
				border-collapse:collapse;
			}
			th,td{
				border:black 1px solid; 
			}
		</style>
		<input type="text" name="name"><input type="text" name="address"><input type="button" value="搜索" onclick="search()">
		<!--声明一个空的div标签用于填充data.jsp文件传过来的标签-->
		<div id="data">
		</div>
		<input type="button" value="上一页" onclick="up()">
		<input type="button" value="下一页" onclick="down()">
	</body>
</html>
4、新建一个UserInfo类用于将查询到的每条数据存储在一个UserInfo对象中:
package com.jpc.vo;

public class UserInfo {
	private int id;
	private String name;
	private String mobile;
	private String address;
	
	public UserInfo(int id, String name, String mobile, String address) {
		this.id = id;
		this.name = name;
		this.mobile = mobile;
		this.address = address;
	}
	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 getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "id=" + id + ", name=" + name + ", mobile=" + mobile + ", address=" + address;
	}
	
}
5、新建一个“DataServlet.java”文件用于接收请求和处理请求(JDBC查询操作):
package com.jpc.fenye;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jpc.dbutil.DBUtil;
import com.jpc.dbutil.IRowMapper;
import com.jpc.vo.UserInfo;

public class DataServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//声明变量接收页码、name、address
		int pageNo = Integer.parseInt(request.getParameter("pageNo"));
		String name = request.getParameter("name");
		String address = request.getParameter("address");
		//声明字符串where用于进行sql语句where条件的拼接
		String where = " where 1=1 ";
		//每页显示3条数据
		int pageSize = 3;
		//定义一个实现了IRowMapper接口RowMapper内部类用于接口回调
		class RowMapper implements IRowMapper {
			List<UserInfo> list = new ArrayList<UserInfo>();

			public void rowMapper(ResultSet resultSet) {
				try {
					while (resultSet.next()) {
						list.add(new UserInfo(resultSet.getInt("id"), resultSet.getString("name"),
								resultSet.getString("mobile"), resultSet.getString("address")));
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		//拼接sql语句的where条件以进行模糊查询
		if(name!=null) {
			where = where + " and name like '%"+ name +"%'";
		}
		if(address!=null) {
			where = where + " and address like '%"+ address +"%'";
		}
		//生成最终的sql查询语句
		String sql = "select * from user_info " + where + " limit " + (pageNo - 1) * pageSize + "," + pageSize;
		//创建内部类对象,用于存储接口回调时生成的存储了UserInfo对象的list集合
		RowMapper rowMapper = new RowMapper();
		//调用DBUtil中的select方法
		DBUtil.select(sql, rowMapper);
		//将rowMapper.list添加给request对象
		request.setAttribute("userInfos", rowMapper.list);
		//再次定义一个内部类用于接收数据条数count
		class CountRowMapper implements IRowMapper {
			int count;

			public void rowMapper(ResultSet resultSet) {
				try {
					if (resultSet.next()) {
						count = resultSet.getInt("count");
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		CountRowMapper countRowMapper = new CountRowMapper();
		sql = "select count(id) count from user_info" + where;
		DBUtil.select(sql, countRowMapper);
		int count = countRowMapper.count;
		int pageTotal = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
		request.setAttribute("pageTotal", pageTotal);
		request.getRequestDispatcher("data.jsp").forward(request, response);
	}

}
6、定义一个“data.jsp”用于数据的html填充:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="zzu" %>

<table>
	<tr>
		<th>id</th>
		<th>name</th>
		<th>mobile</th>
		<th>address</th>
		<th>编辑</th>
	</tr>
	<zzu:forEach var="userinfo" items="${userInfos }">
		<tr>
			<td>${userinfo.getId() }</td>
			<td>${userinfo.getName() }</td>
			<td>${userinfo.getMobile() }</td>
			<td>${userinfo.getAddress() }</td>
			<td><a>查看</a><a>编辑</a><a>删除</a></td>
		</tr>
	</zzu:forEach>
</table>
<input id="pageTotal" type="hidden" value="${pageTotal }">
附:最终的项目目录结构如下图

themeleaf ajax 列表 分页 ajax实现分页_JSP_03