ajax 分页 步骤和代码

1.pageUtil工具类

2.DAO两个方法,获得总记录数getPageCounts(),获得分页LIST,findByPage(PageUtil util)

3.Servlet 调用这两个方法得到分页的list,把list整体转换成json格式的数据 传递给前台

4.前台jsp页面,设置page分页区域

5.jquery页面加载中初始化分页js方法。

      $(function(){

        function   pageInit(pageIndex){

           $.ajax({ .....

              success:callback   

               })

            function  callback(data){ 以json等格式包装的(data)以json格式包装的data,遍历信息,

              清空上次信息

              遍历data

              拼接本次信息(这个list(拼接到需要ajax异步的地方。)

             }

          }

          页面js点击$("#one/back/next/").click(function(){ }

      })

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

代码=====================================daoImpl

package cn.bdqn.dao;

import java.sql.SQLException;
import java.util.List;

import cn.bdqn.bean.News_Detail;
import cn.bdqn.util.BaseDao;
import cn.bdqn.util.PageUtil;
import cn.bdqn.util.ResultSetUtil;

public class NewsDaoImpl extends BaseDao implements NewsDao {

@Override
public int getPageCounts() {
String sql = "select count(1) from news_detail";
rs = executeQuery(sql);
int rowNum = 0;
try {
if (rs.next()) {
rowNum = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection();
}
return rowNum;
}

@Override
public List<News_Detail> findNewsByPage(PageUtil util) {
String sql = "select * from news_detail limit ?,? ";
Object[] params = { (util.getPageIndex() - 1) * util.getPageSize(),
util.getPageSize() };
rs = executeQuery(sql, params);
return ResultSetUtil.eachResultSet(rs, News_Detail.class);
}
}

============================================servlet

package cn.bdqn;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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 cn.bdqn.bean.News_Detail;
import cn.bdqn.dao.NewsDao;
import cn.bdqn.dao.NewsDaoImpl;
import cn.bdqn.util.PageUtil;

import com.google.gson.Gson;

@WebServlet("/ListServlet")
public class ListServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
// 调用service层的代码 我们没写 直接调用dao
NewsDao dao = new NewsDaoImpl();

PageUtil util = new PageUtil();
// 获取数据库的总记录数
util.setTotalCount(dao.getPageCounts());
// 获取前台传递的参数
String num = req.getParameter("pageIndex");
if (num != null && num != "") {
util.setPageIndex(Integer.parseInt(num));
} else {
util.setPageIndex(1);
}

System.out.println("==================>" + num);

// 调用后台代码 获取 list集合
List<News_Detail> list = dao.findNewsByPage(util);
if (list != null) {
list.get(0).setPageUtil(util); // 给分页的属性赋值
// 需要把list整体转换成json格式的数据 传递给前台
Gson gson = new Gson();
String json = gson.toJson(list);
System.out.println(json);
resp.setHeader("content-type", "text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print(json);
writer.close();
}

}
}

====================================================jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>

<body>


<table>
<thead>
<tr>
<th>新闻标题</th>
<th>新闻作者</th>
<th>新闻摘要</th>
</tr>
</thead>
<tbody id="tbody">
</tbody>
</table>

<input type="hidden" name="pageIndex">

<a href="" id="one">首页</a>
<a href="" id="back">上一页</a>
<a href="" id="next">下一页</a>
<a href="" id="last">尾页</a>


<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(function(){
//分页的四要素
var pageIndex=""; //当前页
var pageSize="";//页大小
var totalPageCount=""; //总页数
var totalCountSize=""; //总记录数

//用户第一次打开这个inde.jsp页面什么数据都没有! 但是必须得有!!!访问后代数据库
pageInit(pageIndex); // 初始化数据

function pageInit(pageIndex){
$("#one").show();
$("#back").show();
$("#next").show();
$("#last").show(); //第一次显示 所有的 超链接

//使用ajax访问servlet
$.ajax({
url:"ListServlet",
type:"POST",
data:{"pageIndex":pageIndex}, //把用户传递的当前页 发送给后台servlet
dataType:"json",
contentType:"application/x-www-form-urlencoded;charset=utf-8",
success:callback //调用回调函数
});


//data 就是 后台传递过来的数据
//每次都需要清空上次的内容
$("#tbody").html("");

$(data).each(function(){ // each start回调函数
if (this.pageUtil!=null) { //给分页四要素赋值
pageIndex=this.pageUtil.pageIndex;
pageSize=this.pageUtil.pageSize;
totalPageCount=this.pageUtil.pageCount;
totalCountSize=this.pageUtil.totalCount;
}
/*开始给tbody拼接
使用快捷键 shift+alt +a 给每一行增加 " +
ctrl+f 替换所有的{ }
*/
$("#tbody").append(
" <tr><td>"+this.title+"</td> "
+" <td>"+this.author+"</td> "
+" <td>"+this.summary+"</td> </tr> ");
});
} // each end
})// callback end



$("#one").click(function(){ //首页
pageInit(1);
});
$("#last").click(function(){ //尾页
pageInit(totalPageCount);
});
$("#back").click(function(){ //上一页
if((pageIndex-1)>0){
pageInit(pageIndex-1);
}else{
$("#one").hide();
$("#back").hide();
}

});
$("#next").click(function(){ //下一页
if((pageIndex+1)<=totalPageCount){
pageInit(pageIndex+1);
}else{
$("#last").hide();
$("#next").hide();
}
});


</script>



</body>
</html>

===========================================pageUtil

package cn.bdqn.util;

/**
* 分页的工具类
*/
public class PageUtil {
private int totalCount;// 总记录数 通过sql从数据库中获取
private int pageSize = 3;// 页大小 每页显示的条数
private int pageCount;// 总页数
private int pageIndex;// 当前页

public int getTotalCount() {
return totalCount;
}

/**
* 我们在获取总记录数之后,肯定可以得出 总页数
* 001.总记录数通过sql从数据库中获取
* 002.三元表达式 进行判断 并赋值总页数pageCount
*
* 总页数=(总记录数%页大小==0)?(总记录数/页大小):(总记录数/页大小+1);
*
* @param totalCount
* 总记录数
*/
public void setTotalCount(int totalCount) {
if (totalCount > 0) {
this.totalCount = totalCount;
this.pageCount = (totalCount % pageSize == 0) ? (totalCount / pageSize)
: (totalCount / pageSize + 1);// 总页数
}
}

public int getPageSize() {
return pageSize;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public int getPageCount() {
return pageCount;
}

public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}

public int getPageIndex() {
return pageIndex;
}

public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
}

public PageUtil(int totalCount, int pageSize, int pageCount, int pageIndex) {
super();
this.totalCount = totalCount;
this.pageSize = pageSize;
this.pageCount = pageCount;
this.pageIndex = pageIndex;
}

public PageUtil() {
super();
}

@Override
public String toString() {
return "PageUtil [totalCount=" + totalCount + ", pageSize=" + pageSize
+ ", pageCount=" + pageCount + ", pageIndex=" + pageIndex + "]";
}

}

===============================================================rs的set,get方法

package cn.bdqn.util;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
* 01.从数据库获取ResultSet
* 问题? 运行期间 我们知道ResultSet中是什么类型吗?
* 02.从ResultSet结果集中 获取T类型
* 03.根据T类型,向每个属性 赋值
* 04.放进list集合 返回即可
*/
public class ResultSetUtil {

/**
*
* @param rs
* 从数据库获取的数据结果集
* @param clazz
* T类型
* @return T类型的集合
*/
public static <T> List<T> eachResultSet(ResultSet rs, Class<T> clazz) {
List<T> list = new ArrayList<>();
// 循环ResultSet 01.先获取对象 02.循环属性赋值 03.放进集合
try {
T object = null;
while (rs.next()) {
object = clazz.newInstance(); // 实例化对象
Field[] field = clazz.getDeclaredFields(); // 获取实体类的所有属性,返回Field数组
for (Field f : field) {
f.setAccessible(true); // 可以访问私有属性 并赋值
if (f.getName().equals("pageUtil")) {
continue;
}
f.set(object, rs.getObject(f.getName()));
}
list.add(object); // 放进集合
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return list;
}

/**
*
* @param rs
* 从数据库获取的数据结果集
* @param clazz
* T类型
* @return T类型
*/
public static <T> T findT(ResultSet rs, Class<T> clazz) {
T object = null;
try {
if (rs.next()) {
object = clazz.newInstance(); // 实例化对象
Field[] field = clazz.getDeclaredFields(); // 获取实体类的所有属性,返回Field数组
for (Field f : field) {
f.setAccessible(true); // 可以访问私有属性 并赋值
f.set(object, rs.getObject(f.getName()));
}
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return object;
}

}

posted @ 2017-09-03 21:54  盛夏光年2017  阅读(1456)  评论(0编辑  收藏  举报