分页 :
实现一个分页的步骤 :
服务器需要知道的有 :
每一页有多少数据 : pageSize // 可以自己设置每页显示多少数据
一共有多少数据 : totalRecord // 通过查询数据库获取 selece count(*) from xxx
当前页码 : pageNum // 通过浏览器传入
查询条件 : condition // 通过浏览器传入
浏览器需要知道的有 :
每一页的数据 : List<T> list // 通过查询数据库获取
总页数 : totalPage // 总页数/每页数据量
显示多少分页 : howManyPages // 可以自己设置
当前页码 : pageNum // 通过自己传给后台,然后后天传回
开始页码 : start //
结束页码 : end //
数据库需要知道的有 :
每次查询多少数据 pageSize // 自己设置
从多少条数据开始查询 selectStart // (pageNum-1)*pageSize
查询条件 : condition // 通过浏览器传入
实现一个json的多条件组合查询
servlet :
1. 获取请求参数 : request.getParameter(“请求参数”);
2. 获取当前页码 : request.getParameter(“当前页码”);
3. 拼接查询条件 :
String[] a1 = {“条件1”,”条件2”,”条件3”,”条件4”};
String[] a2 = {“值1”,”值2”,”值3”,”值4”};
StringBuffer condition = new StringBuffer(“”);
if(值1 != null && !值1.equals(“”) || ……){
// 说明有查询条件 拼接一个where
condition.append(” where “);
// 设置一个boolean值,用来在第二个条件中拼接and
boolean addAnd = false;
for(int i=0;i<a2.length;i++){
if(a2[i]!=null && !a2[i].equals(“”)){
// 说明这个参数是查询条件
if(addAnd){
// 第一次时,addAnd 是false,进不来,之后可以进来,保证在第二个条件开始才有and
condition.append(” and “);
}
// 将 条件=值传入
condition.append(a1[i]+”=”+”\’”+a2[i]+”\’”); // 这里需要写成 条件 = ‘值’
}
}
}
4. 将当前页信息与sql语句传给service
5. 获得service返回的PageBean值
6. 将PageBean转换为json数据,传给前端
代码如下 :
package web;
import domain.Book;
import domain.PageBean;
import net.sf.json.JSONObject;
import service.BookService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "BookService",urlPatterns = "/book")
public class BookServlet extends HttpServlet {
private static BookService bookService = new BookService();
private String bname;
private String author;
private String price;
private String category;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
bname = request.getParameter("bname");
author = request.getParameter("author");
price = request.getParameter("price");
category = request.getParameter("category");
String pc = request.getParameter("pc");
String [] strings = {"bname","author","price","category"};
String [] strings1 = {bname, author, price, category};
StringBuffer sb = new StringBuffer("");
if (isTrue()){
sb.append(" where ");
boolean showAnd = false;
for (int i=0;i < strings1.length;i++) {
if (strings1[i] != null && !strings1[i].equals("")) {
if (showAnd) {
sb.append(" and ");
}
sb.append(strings[i] + "=" +"\'"+ strings1[i]+"\'" + " ");
showAnd=true;
}
}
}
PageBean<Book> pageBean = bookService.select(pc, sb.toString());
// System.out.println(pageBean);
JSONObject jsonObject = JSONObject.fromObject(pageBean);
response.getWriter().write(jsonObject.toString());
// response.sendRedirect("/index.html");
}
private boolean isTrue(){
if (bname!=null && !bname.equals(""))
return true;
if (author!=null && !author.equals(""))
return true;
if (price!=null && !price.equals(""))
return true;
if (category!=null && !category.equals(""))
return true;
return false;
}
}
service :
1. 获得servlet传入的pageNum和sql
2. 拼接查询语句 , 查询总数据量
String selectCount = “select count(*) from xxx”;
selectCount += sql;
3. 查询数据库,获取返回的数据条数 totalRecord
4. 创建PageBean对象,给初始值 totalRecord(总数据),pageNum(当前页),pageSize(每页显示的数据),howManyPages(多少页)
PageBean pageBean = new PageBean(totalRecord,pageNum,10,10);
在PageBean的构造方法中,计算出 start,end ….
5. 拼接查询语句 , 查询分页数据
String selectData = “select * from xxx”;
selectData += sql;
selectData += ” limit(“+pageBean.selectStart + “,”+pageBean.pageSize+”)”;
6. 通过sql语句,查询数据库,返回一个该对象的集合
7. 将该集合设置给pageBean
8. 将pageBean返回给servlet
代码如下 :
package service;
import dao.BookDao;
import domain.Book;
import domain.PageBean;
import java.util.List;
public class BookService {
private static BookDao bookDao = new BookDao();
public PageBean<Book> select(String pc,String sql) {
int p = setPc(pc);
String countSql = "select count(*) from book";
countSql +=sql;
Long aLong = bookDao.selectCount(countSql);
Number number = aLong;
int i = number.intValue();
PageBean<Book> pageBean = new PageBean<>(p,10,i);
sql+=" limit "+pageBean.getStartIndex()+","+pageBean.getPageSize();
String bookSql = "select * from book";
bookSql +=sql;
List<Book> books = bookDao.selectBySql(bookSql);
pageBean.setList(books);
return pageBean;
}
private int setPc(String pc){
if (pc == null){
pc = "1";
}else if (pc.equals("")){
pc = 1+pc;
}
int p = Integer.parseInt(pc);
return p;
}
}
package service;
import dao.BookDao;
import domain.Book;
import domain.PageBean;
import java.util.List;
public class BookService {
private static BookDao bookDao = new BookDao();
public PageBean<Book> select(String pc,String sql) {
int p = setPc(pc);
String countSql = "select count(*) from book";
countSql +=sql;
Long aLong = bookDao.selectCount(countSql);
Number number = aLong;
int i = number.intValue();
PageBean<Book> pageBean = new PageBean<>(p,10,i);
sql+=" limit "+pageBean.getStartIndex()+","+pageBean.getPageSize();
String bookSql = "select * from book";
bookSql +=sql;
List<Book> books = bookDao.selectBySql(bookSql);
pageBean.setList(books);
return pageBean;
}
private int setPc(String pc){
if (pc == null){
pc = "1";
}else if (pc.equals("")){
pc = 1+pc;
}
int p = Integer.parseInt(pc);
return p;
}
}
pageBean :
// 这些是外部传入的属性
private int pageNum; // 当前页
private int totalRecord; // 总数据条数
private int pageSize; // 每页显示的数据量
private int howManyPages; // 超链接有多少页
// 这些是计算得到的数据
private int totalPage; // 总页数
private int start; // 第一个分页应该是多少页
private int end; // 最后一个分页应该是多少页
private int selectStart; // 查询数据库应该从多少条查起
// 这个是查询数据库后设置的数据
private List<T> list; // 保存查询到的数据
// 在构造方法中,初始化参数,设置计算数据
public PageBean(int totalRecord,int pageNum, int pageSize, int howManyPages){
// 初始化传入的参数
this.totalRecord = totalRecord;
this.pageNum = pageNum;
this.pageSize = pageSize;
this.howManyPages = howManyPages;
// 计算出总页数
if(totalRecord \% pageSize == 0){
// 说明整除
this.totalPage = totalRecord/pageSize;
}else{
// 否则,多余的数据,再开一页
this.totalPage = totalRecord/pageSize + 1;
}
/**
/* 计算start 和 end;
/* 一般,当前页在分页的中间
/* 所以 start = pageNum - middle; end = pageNum + middle(奇数);end = pageNum+middle-1(偶数)
*/
int middle = howManyPages/2;
start = pageNum - middle;
if(howManyPages\%2 == 0){
end = pageNum + middle - 1;
}else{
end = pageNum + middle;
}
if(start < 1){
// 如果start < 1 , 说明无法到,最中间
start = 1;
end = start+howManyPages-start;
}
if(end > totalPage){
// 说明要到最后页了
end = totalPage;
start = end - howManyPages + 1;
}
// 还有一种特殊情况,当数据量不够分页的条目时
if(totalPage < howManyPages){
start = 1;
end = totalPage;
}
// 数据库应该从多少条数据开始查询
// 查询10条 第一页 0-9 第二页 10-19 第三页20-29; 可知 start = 当前页-1 * 每次查询多少
selectStart = (pageNum - 1)*pageSize;
}
// get/set方法
代码如下 :
public class PageBean<T>{
// 这些是外部传入的属性
private int pageNum; // 当前页
private int totalRecord; // 总数据条数
private int pageSize; // 每页显示的数据量
private int howManyPages; // 超链接有多少页
// 这些是计算得到的数据
private int totalPage; // 总页数
private int start; // 第一个分页应该是多少页
private int end; // 最后一个分页应该是多少页
private int selectStart; // 查询数据库应该从多少条查起
// 这个是查询数据库后设置的数据
private List<T> list; // 保存查询到的数据
// 在构造方法中,初始化参数,设置计算数据
public PageBean(int totalRecord,int pageNum, int pageSize, int howManyPages){
// 初始化传入的参数
this.totalRecord = totalRecord;
this.pageNum = pageNum;
this.pageSize = pageSize;
this.howManyPages = howManyPages;
// 计算出总页数
if(totalRecord % pageSize == 0){
// 说明整除
this.totalPage = totalRecord/pageSize;
}else{
// 否则,多余的数据,再开一页
this.totalPage = totalRecord/pageSize + 1;
}
/**
/* 计算start 和 end;
/* 一般,当前页在分页的中间
/* 所以 start = pageNum - middle; end = pageNum + middle(奇数);end = pageNum+middle-1(偶数)
*/
int middle = howManyPages/2;
start = pageNum - middle;
if(howManyPages%2 == 0){
end = pageNum + middle - 1;
}else{
end = pageNum + middle;
}
if(start < 1){
// 如果start < 1 , 说明无法到,最中间
start = 1;
end = start+howManyPages-start;
}
if(end > totalPage){
// 说明要到最后页了
end = totalPage;
start = end - howManyPages + 1;
}
// 还有一种特殊情况,当数据量不够分页的条目时
if(totalPage < howManyPages){
start = 1;
end = totalPage;
}
// 数据库应该从多少条数据开始查询
// 查询10条 第一页 0-9 第二页 10-19 第三页20-29; 可知 start = 当前页-1 * 每次查询多少
selectStart = (pageNum - 1)*pageSize;
}
}
js :
1. 获取请求参数
var url = location.search;
2. 访问servlet,获取json数据
function page(pageNum){
$.get(“”,function(data,status)){ }
}
3. 获取List中的数据,遍历使用表格显示
var xxlist = data[list];
$.each(xxlist,function(index,data)){ // 遍历显示}
4. 创建分页栏
// 使用for循环,从start到end
for(var i =data[“start”];i<=data[“end”];i++){
// 显示
// 这里使用div,添加点击事件
click(function(){page($(this).text())})
}
5. 当前页特殊标记
// 到for循环里面
if(i = data[pageNum]){//特殊样式}
6. 上一页
// for循环前面
if(data[pageNum]>1){// 上一页 page(data[pageNum] -1)}
7. 下一页
// for循环后面
if(data[pageNum]<data[totalPage]){// 下一页 page(data[pageNum] +1)}
8. 跳页
// 下一页后面,使用js创建一个input和一个button
button点击事件
click(function(){page($(‘input’.val()))})
代码下面 :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>书店详情</title>
<script src="/JS/jquery-3.2.1.min.js"></script>
<style type="text/css">
a{text-decoration-line: none;font-size: 16px;margin: 2px}
div{display: inline-block; height: 20px;width: 20px;border: 1px solid skyblue;
margin: 2px;text-align: center}
.div1{font-weight: bold;border: 0}
.div2{width: 60px}
.input{width: 30px}
</style>
</head>
<body>
<table border="1"></table>
</body>
<script type="text/javascript">
var url = location.search;
console.log(url);
xxx("");
function xxx(pc) {
$('tr').remove();
$('div').remove();
$('input').remove();
$.get("/book"+url+pc,function (data, status) {
console.log(data);
console.log(status);
if(status == "success"){
var jsonData = $.parseJSON(data);
var jsonDatum = jsonData["list"];
console.log(jsonDatum);
if (jsonDatum.length != 0){
$('table').append(
$('<tr>').append($('<th>').text("bname"))
.append($('<th>').text("author"))
.append($('<th>').text("price"))
.append($('<th>').text("category"))
);
$.each(jsonDatum,function (index, data) {
$('table').append(
$('<tr>').append(
$('<td>').text(data["bname"])
).append(
$('<td>').text(data["author"])
).append(
$('<td>').text(data["price"])
).append(
$('<td>').text(data["category"])
)
)
})
}
else{
$('body').html("<a href='index.html'>没有数据,点击返回</a>")
}
if (jsonData["pageNum"] > 1){
$('body').append(
$('<div>').attr({"class":"div2"}).text("上一页").click(function () {
xxx(jsonData["pageNum"]-1)
})
)
}
for(var i=jsonData["start"];i<=jsonData["end"];i++){
if (jsonData["pageNum"] == i){
$('body').append(
$('<div>').attr({"class":"div1"}).text(i).click(function () {
xxx($(this).text());
})
)
}else{
$('body').append(
$('<div>').text(i).click(function () {
xxx($(this).text());
})
)
}
}
if (jsonData["pageNum"] < jsonData["totalPage"]){
$('body').append(
$('<div>').attr({"class":"div2"}).text("下一页").click(function () {
xxx(jsonData["pageNum"]+1)
})
)
}
if (jsonDatum.length != 0) {
$('body').append(
$('<input>').attr({"type": "text", "class": "input"})
).append(
$('<div>').text("跳转").css({"width": "40px"}).click(function () {
console.log($('.input').val());
xxx($('.input').val())
})
)
}
}
})
}
</script>
</html>
首页的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
<script src="JS/jquery-3.2.1.min.js"></script>
</head>
<body>
<form action="book.html" method="get" id="tf">
书名:<input type="text" name="bname"><br>
作者:<input type="text" name="author"><br>
价格:<input type="text" name="price"><br>
分类:<input type="text" name="category"><br>
<input type="hidden" name="pc" value="">
<input type="submit" value="提交">
</form>
</body>
</html>