java ajax分页_分页加多条件查询,使用javaajaxjs

本文介绍了一个Java Web应用中如何实现多条件动态查询,包括实体类`Menu`的定义,数据库连接工具类`dbcputil`的设计,以及查询接口和实现类的代码实现。查询时根据用户输入的条件动态拼接SQL语句,实现了分页和过滤功能,最后在Servlet中处理查询结果并以JSON格式返回给前端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实体类

跟数据库的数据最好保持一致显示在页面中

packageentity;public classMenu {private intmid;privateString mname;private doublemprice;privateString micon;private intmstatus ;private int msale;//销量

private String mdesc;//描述

private String mtimeout;//gengxinshijian

private String tname;//菜品类型

public intgetMid() {returnmid;

}public void setMid(intmid) {this.mid =mid;

}publicString getMname() {returnmname;

}public voidsetMname(String mname) {this.mname =mname;

}public doublegetMprice() {returnmprice;

}public void setMprice(doublemprice) {this.mprice =mprice;

}publicString getMicon() {returnmicon;

}public voidsetMicon(String micon) {this.micon =micon;

}public intgetMstatus() {returnmstatus;

}public void setMstatus(intmstatus) {this.mstatus =mstatus;

}public intgetMsale() {returnmsale;

}public void setMsale(intmsale) {this.msale =msale;

}publicString getMdesc() {returnmdesc;

}public voidsetMdesc(String mdesc) {this.mdesc =mdesc;

}publicString getMtimeout() {returnmtimeout;

}public voidsetMtimeout(String mtimeout) {this.mtimeout =mtimeout;

}publicString getTname() {returntname;

}public voidsetTname(String tname) {this.tname =tname;

}private voidMneu() {

}

}

接口

需要查询总条数和把数据查出来

public List

public int selectAllcount1(Menu stu);//查詢搜索總行數

连接数据库的工具类

与数据库完成链接,才能从数据库中查询值

packageutil;importjava.io.IOException;importjava.io.InputStream;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.Properties;importorg.apache.commons.dbcp2.BasicDataSource;importorg.apache.commons.dbcp2.BasicDataSourceFactory;public classdbcputil {private static Properties p=new Properties();//创建一个空的属性列表

private static BasicDataSource dbSource=null;static{

ClassLoader loader=Thread.currentThread().getContextClassLoader();//加载配置文件 将配置文件转换成一个属性对象

InputStream input=loader.getResourceAsStream("dbcp.properties");//通过加载器获取一个输入流

try {//将输入流中的数据转换成一个属性对象//将输入流的数据加载到 p中

p.load(input);//获取数据源

dbSource=BasicDataSourceFactory.createDataSource(p);

}catch(IOException e) {

e.printStackTrace();

}catch(ClassNotFoundException e) {

e.printStackTrace();

}catch(Exception e) {

e.printStackTrace();

}

}public staticBasicDataSource getdb(){returndbSource;

}//获取数据库连接对象//通过数据源来获取连接对象

public staticConnection getContention(){try{//从数据源获取数据库连接对象

returndbSource.getConnection();

}catch(SQLException e) {

e.printStackTrace();

}return null;

}//关闭数据库连接 将连接对象换给数据源进行管理

public static voidcloseDB(Connection con,Statement st,ResultSet rs){try{if(rs!=null)rs.close();if(st!=null)st.close();if(con!=null)con.close();

}catch(SQLException e) {

e.printStackTrace();

}

}

}

实现类

主要还是多条件查询是否为空,因为多条件查询的时候可以只查一个条件,或者查询所有的条件,如果不为空才会把sql语句加上去

@Overridepublic List

List

Listpramaters=new ArrayList();

String sql="select * from menu where 1=1";if(stu.getTname()!=null){

sql+=" and tname=?";

pramaters.add(stu.getTname());

}if(stu.getMname()!=null){

sql+=" and mname like concat('%',?,'%')";

pramaters.add(stu.getMname());

}if(stu.getMdesc()!=null){

sql+=" and mdesc like concat('%',?,'%')";

pramaters.add(stu.getMdesc());

}if(stu.getMprice()!=0){

sql+=" and mprice <=?";

pramaters.add(stu.getMprice());

}int index=(page-1)*10;

sql+=" limit ?,10";

pramaters.add(index);

System.out.println(sql);//2.获取数据库 连接对象

Connection con=dbcputil.getContention();//3.获取预编译对象

PreparedStatement st=null;//预编译语句对象

ResultSet rs=null;//结果集

try{

st=con.prepareStatement(sql);//4.给预编译对象占位符进行赋值

for (int i = 0; i

st.setObject(i+1,pramaters.get(i));

}//5.执行预编译语句

rs=st.executeQuery();//遍历结果集

while(rs.next()){//初始化一个mode对象

Menu mode=newMenu();

mode.setMid(rs.getInt("mid"));

mode.setMname(rs.getString("mname"));

mode.setMdesc(rs.getString("mdesc"));

mode.setMicon(rs.getString("micon"));

mode.setMprice(rs.getDouble("mprice"));

mode.setMstatus(rs.getInt("mstatus"));

mode.setMtimeout(rs.getString("mtimeout"));

mode.setMsale(rs.getInt("msale"));

mode.setTname(rs.getString("tname"));

list.add(mode);

}

}catch(SQLException e) {//TODO Auto-generated catch block

e.printStackTrace();

}finally{//关闭数据库

dbcputil.closeDB(con, st, rs);

}returnlist;

}

@Overridepublic intselectAllcount1(Menu stu) {

String sql="select count(*) as c from menu where 1=1";

Listpramaters=new ArrayList();if(stu.getTname()!=null){

sql+=" and tname=?";//每次加等的时候都需要加一个空格

pramaters.add(stu.getTname());

}if(stu.getMname()!=null){

sql+=" and mname like concat('%',?,'%')";

pramaters.add(stu.getMname());

}if(stu.getMdesc()!=null){

sql+=" and mdesc like concat('%',?,'%')";//

pramaters.add(stu.getMdesc());

}if(stu.getMprice()!=0){

sql+=" and mprice <=?";

pramaters.add(stu.getMprice());

}//2.获取数据库连接对象

Connection con=dbcputil.getContention();//3.获取预编译对象

PreparedStatement st=null;

ResultSet rs=null;int count=0;try{//4.给预编译对象占位符进行赋值

st=con.prepareStatement(sql);for (int i = 0; i

st.setObject(i+1,pramaters.get(i));

}

rs=st.executeQuery();while(rs.next()){//1.通过列下表获取元素

count=rs.getInt("c");

System.out.println(count);

}

}catch(SQLException e) {//TODO Auto-generated catch block

e.printStackTrace();

}finally{

dbcputil.closeDB(con, st, rs);

}returncount;

}

}

servlet

我们不仅需要把总条数传过去,而且需要把返回的查询数据传过去,所以可以吧他们当成键值对的形式存放到map中

packagemenuconntroller;importjava.io.IOException;importjava.util.HashMap;importjava.util.List;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.alibaba.fastjson.JSON;importentity.Menu;importimpl.menuimpl;

@WebServlet("/search.do")public class searchmenu extendsHttpServlet {private static final long serialVersionUID = 1L;

@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//1.获取前端发送过来的数据

Menu stu=newMenu();int page=Integer.parseInt(req.getParameter("page")); //分页

String type=req.getParameter("type");//获取相应的字段

String price=req.getParameter("price");

String name=req.getParameter("mname");

String desc=req.getParameter("desc");//设置属性的值

if(type.length()==0)stu.setTname(null);elsestu.setTname(type);if(name.length()==0)stu.setMname(null);elsestu.setMname(name);if(desc.length()==0)stu.setMdesc(null);elsestu.setMdesc(desc);if(price.length()==0)stu.setMprice(0);elsestu.setMprice(Double.parseDouble(price));//2.处理数据

menuimpl dao=newmenuimpl();

List

int count=dao.selectAllcount1(stu);int countPage= count%10==0?count/10:count/10+1;//总页数

System.out.println(countPage);/*{

countPage:20;

data:[]

}*/HashMapmap=new HashMap();

map.put("countpage", countPage);

map.put("data",list);

System.out.println(list);//3.响应数据//响应头的相关设置

resp.setContentType("text/html;charset=utf-8");//将数据转换成json字符串

resp.getWriter().println(JSON.toJSONString(map));

}

}

前端

注意接下来展示的数据放在tbody中

菜单展示

width:1200px;

border:1px solid;

border-collapse:collapse;

}

tr,th,td{

border:1px solid;

}

td{

text-align: center;

}

菜品列表

添加菜品

请选择菜品分类

${type.tname }

请选择价格

二十块钱以下

四十块钱以下

六十块钱以下

八十块钱以下

一百块钱以下

搜索

菜品ID菜品图片菜品名称菜品价格菜品分类菜品状态菜品描述菜品销量更新时间销售总价操作

上一页

下一页

ajax交互

注意在进行一次新的查询的时候,清除原来查询的内容

functionprevious(){if(page!=1){ //上一页

page--;

sendData();

}

}function next(){ //下一页

page++;

sendData();

}//给table添加数据

functionaddcontent(jsonObj){var obj=jsonObj.data;for( i=0;i

var td1=document.createElement("td");var td2=document.createElement("td")var td3=document.createElement("td");var td4=document.createElement("td");var td5=document.createElement("td");var td6=document.createElement("td");var td7=document.createElement("td");var td8=document.createElement("td");var td9=document.createElement("td");var td10=document.createElement("td");var td11=document.createElement("td");

td1.innerText=obj[i].mid;var src=obj[i].micon ;var img=document.createElement("img");

img.setAttribute("src", src);

img.setAttribute("width", "60px");

img.setAttribute("height", "50px");

td2.appendChild(img);

td3.innerHTML=obj[i].mname;

td4.innerHTML=obj[i].mprice;

td5.innerHTML=obj[i].tname;if(obj[i].mstatus==0){

td6.innerHTML="上架";

}else{

td6.innerHTML="下架";

}

td7.innerHTML=obj[i].mdesc;

td8.innerHTML=obj[i].msale;

td9.innerHTML=obj[i].mtimeoutvar a=document.createElement("a");var a1=document.createElement("a");var node = document.createTextNode("修改");//给a标签设置value值

a.appendChild(node);//吧value值添加到a标签

a.setAttribute("href","option2.do?id="+obj[i].mid);//给a标签设置herf属性//修改的时候吧id传过去

if(obj[i].mstatus==0){var node1 = document.createTextNode("上架");

}else{var node1 = document.createTextNode("下架");

}

a1.appendChild(node1);

a1.setAttribute("href", "deletemenu.do?id="+obj[i].mid+"&statues="+obj[i].mstatus);

td11.appendChild(a);

td11.appendChild(a1);

tab.append(tr);//把tr添加到table 吧td添加到tr

tr.append(td1);

tr.append(td2);

tr.append(td3);

tr.append(td4);

tr.append(td5);

tr.append(td6);

tr.append(td7);

tr.append(td8);

tr.append(td9);

tr.append(td10);

tr.append(td11);

}

}//删除table的数据

functionremoveElement(){//1.找到table

var tab=document.getElementById("content");//2.移除所有的元素

var length=tab.rows.length;for(var index=0;index

tab.deleteRow(0);

}

}functiononSearch(){//page 等于1

page=1;//调用搜索方法

search();

}var type=document.getElementById("types");var price=document.getElementById("price");var mname=document.getElementById("mname");

console.log(name.value);var desc=document.getElementById("desc");

console.log(desc);functionsearch(){//1.初始化一个XmlHttpRequset对象

var req=newXMLHttpRequest();//2.构建请求的参数URl

var url="search.do?page="+page+"&type="+type.value+"&price="+price.value+"&mname="+mname.value+"&desc="+desc.value;

console.log(url);

req.open("get",url,true);//3.发送请求

req.send();//4.监听请求的数据

req.onreadystatechange=function(){//监听状态

if(req.readyState==4&&req.status==200){//把响应的数据转换成json对象

var jsonObj=JSON.parse(req.responseText);

console.log(jsonObj.data);if(jsonObj.data.length==0){

alert("已经到尾部了 没有更多数据了");

page--;//page 自减1

return;

}//设置总页数 和当前页数

var lab=document.getElementById("page");

lab.innerText=page+"页/"+jsonObj.countpage+"页";//删除表上原有的数据

removeElement();//将数据刷新到当前页面的table中

addcontent(jsonObj);

}

}

}

页面效果

b4fc5462e3059e1af7f9f2b0e6c037a0.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值