一、为什么使用Ajax
1、无刷新:
不刷新整个页面,只刷新局部
2、无刷新的好处:
只更新部分页面,有效利用带宽,提高用户体验
代码如下:
实体类:
package com.zking.entity;
import java.io.Serializable;
/**
* 实体类:商品类
* @author zjjt
*
* @date 2022年4月13日 下午8:58:56
*/
public class Goods implements Serializable{
/**
*
*/
private static final long serialVersionUID = 170842568495657866L;
private int gid;
private String gname;
private int gprice;
private String ginfo;
private String gpath;
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public int getGprice() {
return gprice;
}
public void setGprice(int gprice) {
this.gprice = gprice;
}
public String getGinfo() {
return ginfo;
}
public void setGinfo(String ginfo) {
this.ginfo = ginfo;
}
public String getGpath() {
return gpath;
}
public void setGpath(String gpath) {
this.gpath = gpath;
}
public Goods() {
// TODO Auto-generated constructor stub
}
public Goods(int gid, String gname, int gprice, String ginfo, String gpath) {
super();
this.gid = gid;
this.gname = gname;
this.gprice = gprice;
this.ginfo = ginfo;
this.gpath = gpath;
}
public Goods( String gname, int gprice, String ginfo, String gpath) {
this.gname = gname;
this.gprice = gprice;
this.ginfo = ginfo;
this.gpath = gpath;
}
}
dao包:
package com.zking.dao;
import java.util.List;
import com.zking.entity.Goods;
import sun.net.NetworkServer;
public interface IGoodsDao {
/**
* 模糊查询
* @return 集合
*/
public List<Goods> getAll(int pageIndex,int pageSize,String sname);
/**
* 获取总行数
* @param str 表名等
* @return 行数
*/
public int getRows(String str);
/**
* 单个查询
* @return 实体类
*/
public Goods getALLDg(int gid);
/**
* 删除
* @param gid 编号
* @return 影响行数
*/
public int deleteDg(int gid);
/**
* 查询全部
* @return 集合
*/
public List<Goods> getAll(int pageIndex,int pageSize);
}
package com.zking.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.zking.entity.Goods;
import com.zking.util.DBHelper;
public abstract class GoodsDao implements IGoodsDao{
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
@Override
public List<Goods> getAll(int pageIndex,int pageSize,String sname) {
List<Goods> ls=new ArrayList<Goods>();
//公式 找规律
int a=(pageIndex-1)*pageSize+1;
int b=pageIndex*pageSize;
try {
con=DBHelper.getCon();
String sql="select * from( \r\n" +
"select a.*,rownum as rid from ( \r\n" +
"select * from goods where gname like '%"+sname+"%' \r\n" +
") a \r\n" +
") b where b.rid between ? and ?";
ps=con.prepareStatement(sql);
//给占位符赋值
ps.setInt(1, a);
ps.setInt(2, b);
rs=ps.executeQuery();
while(rs.next()) {
Goods g=new Goods();
g.setGid(rs.getInt(1));
g.setGname(rs.getString(2));
g.setGprice(rs.getInt(3));
g.setGinfo(rs.getString(4));
g.setGpath(rs.getString(5));
ls.add(g);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return ls;
}
@Override
public int getRows(String str) {
int n=0;
try {
con=DBHelper.getCon();
String sql="select count(*) from "+str;
ps=con.prepareStatement(sql);
rs=ps.executeQuery();
if(rs.next()) {
n=rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return n;
}
@Override
public Goods getALLDg(int gid) {
Goods g=null;
try {
con=DBHelper.getCon();
String sql="select * from goods where gid="+gid;
ps=con.prepareStatement(sql);
rs=ps.executeQuery();
if(rs.next()) {
g=new Goods();
g.setGid(rs.getInt(1));
g.setGname(rs.getString(2));
g.setGprice(rs.getInt(3));
g.setGinfo(rs.getString(4));
g.setGpath(rs.getString(5));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return g;
}
@Override
public int deleteDg(int gid) {
int n=0;
try {
con=DBHelper.getCon();
String sql="delete from goods where gid="+gid;
ps=con.prepareStatement(sql);
n=ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return n;
}
public List<Goods> getAll(int pageIndex,int pageSize) {
List<Goods> ls=new ArrayList<Goods>();
//公式 找规律
int a=(pageIndex-1)*pageSize+1;
int b=pageIndex*pageSize;
try {
con=DBHelper.getCon();
String sql="select * from( \r\n" +
"select a.*,rownum as rid from ( \r\n" +
"select * from goods \r\n" +
") a \r\n" +
") b where b.rid between ? and ?";
ps=con.prepareStatement(sql);
//给占位符赋值
ps.setInt(1, a);
ps.setInt(2, b);
rs=ps.executeQuery();
while(rs.next()) {
Goods g=new Goods();
g.setGid(rs.getInt(1));
g.setGname(rs.getString(2));
g.setGprice(rs.getInt(3));
g.setGinfo(rs.getString(4));
g.setGpath(rs.getString(5));
ls.add(g);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return ls;
}
}
biz包:
package com.zking.Biz;
import java.util.List;
import com.zking.entity.Goods;
public interface IGoodsBiz {
public int getMax(String str, int pageSize);
/**
* 模糊查询
* @return 集合
*/
public List<Goods> getAll(int pageIndex,int pageSize,String sname);
/**
* 获取总行数
* @param str 表名等
* @return 行数
*/
public int getRows(String str);
/**
* 单个查询
* @return 实体类
*/
public Goods getALLDg(int gid);
/**
* 删除
* @param gid 编号
* @return 影响行数
*/
public int deleteDg(int gid);
/**
* "假分页"
* @param pageIndex 第几页
* @param pageSize 每页多少条数据
* @return 商品集合
*/
//public List<Goods> getAllByPage(int pageIndex,int pageSize);
/**
* 查询全部
* @return 集合
*/
public List<Goods> getAll(int pageIndex,int pageSize);
}
package com.zking.Biz;
import java.util.ArrayList;
import java.util.List;
import com.zking.dao.GoodsDao;
import com.zking.dao.IGoodsDao;
import com.zking.entity.Goods;
/**
* 业务逻辑层
* @author zjjt
*
* @date 2022年4月13日 下午9:00:48
*/
public class GoodsBiz implements IGoodsBiz{
/**
* "假"分页: 先一次性全部拿到内存 每次都从内存拿值
* "真"分页:每次都去数据库拿值 between ? and ?
*
* 真:
* 1-5
* 6-10
* 公式:(pageIndex-1)*pageSize+1-------pageIndex*pageSize
*
* 假:
* 0-4
* 5-9
* 公式:(pageIndex-1)*pageSize-----pageIndex*pageSize
*
*
*/
//调用数据库访问层
IGoodsDao igd=new GoodsDao() {
};
/*public List<Goods> getAllByPage(int pageIndex,int pageSize){
List<Goods> newls=new ArrayList<Goods>();
int a=(pageIndex-1)*pageSize;
int b=pageIndex*pageSize;
//先一次性拿到所有的数据
List<Goods> ls= getAll(pageIndex, pageSize);
//循环遍历
for(int i=a;i<=b;i++) {
if(i>=ls.size()) {
break;
}
//通过下标取商品对象
Goods g= ls.get(i);
//加到新集合中
newls.add(g);
}
return newls;
}
*/
@Override
public List<Goods> getAll(int pageIndex,int pageSize,String sname) {
// TODO Auto-generated method stub
return igd.getAll( pageIndex, pageSize,sname);
}
@Override
public int getRows(String str) {
// TODO Auto-generated method stub
return igd.getRows(str);
}
@Override
public Goods getALLDg(int gid) {
// TODO Auto-generated method stub
return igd.getALLDg(gid);
}
@Override
public int deleteDg(int gid) {
// TODO Auto-generated method stub
return igd.deleteDg(gid);
}
@Override
public List<Goods> getAll(int pageIndex,int pageSize) {
// TODO Auto-generated method stub
return igd.getAll( pageIndex, pageSize);
}
@Override
public int getMax(String str, int pageSize) {
int rows= igd.getRows(str);//获取总行数
int max=rows/pageSize;//计算最大值
if(rows%pageSize!=0) {//判断如果除不尽
max++;//多加一页
}
return max;
}
}
servlet包:
package com.zking.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 com.alibaba.fastjson.JSON;
import com.zking.Biz.GoodsBiz;
import com.zking.Biz.IGoodsBiz;
import com.zking.entity.Goods;
@WebServlet("/page.do")
public class PageServlet 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");
//获取out
PrintWriter out = resp.getWriter();
int pageIndex=1;
int pageSize=5;
//servlet调用biz层
IGoodsBiz igb=new GoodsBiz();
//接收模糊查询关键字
String gname = req.getParameter("gname");
if(gname==null) {
gname="";//相当于查询全部
}
//获取最大页码
int max = igb.getMax("goods where gname like '%"+gname+"%'", pageSize);
//接收pid
String pid = req.getParameter("pid");
if(pid!=null) {
pageIndex=Integer.parseInt(pid);//改变页码
}
List<Goods> ls = igb.getAll(pageIndex, pageSize, gname);
//定义一个map集合
Map<String, Object> mym=new HashMap<String, Object>();
//存元素(一对)
mym.put("pageMax", max);
mym.put("goodsList", ls);
//利用工具将map集合 -->json格式的对象字符串
String str = JSON.toJSONString(mym);
//把响应输送到客户端=页面
out.write(str);
out.flush();
out.close();
}
}
界面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- 引入jQuery的类库 -->
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<!-- 另起一个script块 -->
<script type="text/javascript">
//页面载入函数
$(function(){
//默认显示第一页
myf('a');
})
//专门控制分页
var pageIndex;
var max;
function myf(type){
//拿到文本框的值
var name=$("#gname").val();
if(type=='a'){
//首页
pageIndex=1;
}else if(type=='b'){
//上一页
if(pageIndex>1){
pageIndex--;
}else{
alert("已经是第一页了");
}
}else if(type=='c'){
//下一页
if(pageIndex<max){
pageIndex++;
}else{
alert("已经是最后一页了");
}
}else{
//末页
pageIndex=max;
}
$.post("page.do",{pid:pageIndex,gname:name},function(data){
//根据属性拿到属性值,根据键拿到值
//alert(data.pageMax);max
//alert(data.goodsList); 集合
//把json格式的字符串解析成js的对象/对象数组
//var ss=$.parseJSON(data);
//alert($.type(ss));//array
max=data.pageMax;
var sb="<table border='1px' width='50%'>";
sb+="<tr align='center'>";
sb+="<td>商品序号</td>";
sb+="<td>商品名称</td>";
sb+="<td>商品图片</td>";
sb+="</tr>";
$.each(data.goodsList,function(i,g){//下标,元素
sb+="<tr>";
sb+="<td>"+g.gid+"</td>";
sb+="<td>"+g.gname+"</td>";
sb+="<td><img src='"+g.gpath+"' /></td>";
sb+="</tr>";
})
sb+="</table>";
//给div赋值
$("#aa").html(sb);
//赋值当前页码&最大页码
$("#xx").html(pageIndex);
$("#yy").html(max);
},"json");
}
</script>
</head>
<body>
<center>
<div>
商品名:<input type="text" id="gname" />
<input type="button" value="查询" onclick="myf('a')" />
</div>
<div id="aa"></div>
<div>
<a href="javascript:myf('a')">首页</a>
<a href="javascript:myf('b')">上一页</a>
<a href="javascript:myf('c')">下一页</a>
<a href="javascript:myf('d')">末页</a>
【<span id="xx"></span>/<span id="yy"></span>】
</div>
</center>
</body>
</html>