实体类
跟数据库的数据最好保持一致显示在页面中
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;
}
菜品列表
| 菜品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);
}
}
}
页面效果

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

被折叠的 条评论
为什么被折叠?



