【JavaWeb项目】——外卖订餐系统之商家添加餐品、修改餐品、查询热卖餐品、查询出售车、进行发货操作
🎼个人主页:【Y小夜】
😎作者简介:一位双非学校的大二学生,编程爱好者,
专注于基础和实战分享,欢迎私信咨询!
🎆入门专栏:🎇【MySQL,Java基础,Rust】
🎈热门专栏:🎊【Python,Javaweb,Vue框架】
感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️
目录
🎯添加商品
😎前端页面addFood.jsp页面
🎈代码
🎈解析
🎈效果
😎后端处理AddFoodServlet部分
🎈代码
🎈解析
🎯修改餐品信息
😎前端页面updateFood1.jsp部分
🎈代码
🎈解释
🎈效果
😎后端处理UpdateFoodServlet部分
🎈代码
🎈解析
🎯查询热卖餐品
😎后端处理HotFoodServlet部分
🎈代码
🎈解析
🎈效果
🎯查询出售车
😎前端页面soleCar.jsp部分
🎈代码
🎈解析
🎈效果
😎后端处理部分
🎈代码
🎈解析
🎯进行发货操作
😎后端处理 SendCarServlet部分
🎈代码
🎈解析
🎈效果
🎯添加商品
😎前端页面addFood.jsp页面
🎈代码
<%--Created by IntelliJ IDEA.User: LenovoDate: 19/6/2024Time: 下午3:06To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>添加餐品</title><%-- 引入Bootstrap--%><link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"><link href="../css/addFood.css" rel="stylesheet" type="text/css">
</head>
<body><div class="main"><div class="first">优选外卖订餐系统</div>
<%-- 获取绝对路径,加上绝对路径--%><form action="${pageContext .request.contextPath}/addFoodServlet" role="form"><div class="form-group"><label>餐品名称:</label><input type="text" name="fname" class="form-control" placeholder="请输入餐品名称"></div><div class="form-group"><label>购买人数:</label><input type="text" name="fcount" class="form-control" placeholder="请输入购买人数"></div><div class="form-group"><label>价格:</label><input type="text" name="fprice" class="form-control" placeholder="请输入价格"></div ><div class="one"><button type="submit" class="btn btn-info btn-lg">提交</button><button type="reset" class="btn btn-default btn-lg">重置</button></div></form></div>
</body>
</html>
🎈解析
这段代码是一个JSP页面,用于创建一个添加餐品的表单。以下是对代码的详细解析:
-
JSP注释:
- 页面顶部的注释由IntelliJ IDEA自动生成,提供了创建者、日期和时间。
-
页面指令:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
: 设置页面的MIME类型为HTML,字符集为UTF-8,脚本语言为Java。<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
: 引入JSTL核心库,使用c
作为前缀。
-
HTML结构:
<html>
: 根元素。<head>
: 包含页面的元数据,如标题和样式链接。<title>
: 页面标题为“添加餐品”。
-
Bootstrap和自定义CSS:
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
: 引入Bootstrap的CSS文件,用于页面样式。<link href="../css/addFood.css" rel="stylesheet" type="text/css">
: 引入自定义的CSS样式文件。
-
表单:
<form action="${pageContext.request.contextPath}/addFoodServlet" role="form">
: 创建一个表单,用于提交添加餐品的信息。action
属性设置表单提交的URL,使用了JSP表达式${pageContext.request.contextPath}
来动态设置上下文路径。
-
表单控件:
<div class="form-group">
: 包含表单控件的布局。<label>
: 表示表单控件的说明文字。<input type="text" name="..." class="form-control" placeholder="...">
: 创建文本输入字段,用于输入餐品名称、购买人数和价格。
-
按钮:
<button type="submit" class="btn btn-info btn-lg">提交</button>
: 创建提交按钮,使用Bootstrap的按钮样式。<button type="reset" class="btn btn-default btn-lg">重置</button>
: 创建重置按钮,用于清空表单输入。
-
Bootstrap类:
- 页面使用了Bootstrap的类(如
form-group
,form-control
,btn
,btn-info
,btn-lg
,btn-default
)来增强表单的布局和样式。
- 页面使用了Bootstrap的类(如
-
表单提交和重置:
- 用户填写完表单后,可以点击“提交”按钮将表单数据发送到服务器的
addFoodServlet
进行处理,或者点击“重置”按钮清空表单。
- 用户填写完表单后,可以点击“提交”按钮将表单数据发送到服务器的
这个JSP页面提供了一个简洁的用户界面,允许用户输入餐品的相关信息并提交,或者重置表单。使用Bootstrap框架增强了用户界面的友好性和响应性。
🎈效果
😎后端处理AddFoodServlet部分
🎈代码
package com.dingcan.controller;import com.dingcan.service.FoodService;
import com.dingcan.service.Impl.FoodServiceImpl;
import com.dingcan.service.Impl.ShangServiceImpl;
import com.dingcan.service.ShangService;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 = "AddFoodServelt", value = "/addFoodServlet")
public class AddFoodServlet extends HttpServlet {FoodService foodService=new FoodServiceImpl();ShangService shangService=new ShangServiceImpl();@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//得到session中的里的sid1int sid1=(int)req.getSession().getAttribute("sid1");//获得请求参数String fname=req.getParameter("fname");int fcount=Integer.parseInt(req.getParameter("fcount"));int fprice=Integer.parseInt(req.getParameter("fprice"));int fdianid=shangService.FindSdianid(sid1);//添加到数据库中if(foodService.addFood(fname,fcount,fprice,fdianid)){//添加成功resp.sendRedirect("showFoodServlet");}else{//添加失败resp.sendRedirect("fail.jsp");}}
}
🎈解析
这段Java代码是一个Servlet控制器,用于处理添加餐品的请求:
-
包声明:
package com.dingcan.controller;
: 声明了这个类属于com.dingcan.controller
包。
-
导入服务类:
- 导入了
FoodService
接口及其实现类FoodServiceImpl
,以及ShangService
接口及其实现类ShangServiceImpl
。
- 导入了
-
@WebServlet注解:
@WebServlet(name = "AddFoodServelt", value = "/addFoodServlet")
: 注解用于注册Servlet,定义了它的名称和URL映射。存在一个拼写错误,应该是AddFoodServlet
而不是AddFoodServelt
。
-
类定义:
public class AddFoodServlet extends HttpServlet
: 定义了一个名为AddFoodServlet
的类,它继承自HttpServlet
。
-
成员变量:
FoodService foodService = new FoodServiceImpl();
: 创建了FoodService
接口的实现类FoodServiceImpl
的实例。ShangService shangService = new ShangServiceImpl();
: 创建了ShangService
接口的实现类ShangServiceImpl
的实例。
-
service方法:
@Override
: 表示重写了父类的方法。protected void service(HttpServletRequest req, HttpServletResponse resp)
: 这是Servlet的service
方法,用于处理客户端的请求。
-
获取会话属性:
int sid1 = (int) req.getSession().getAttribute("sid1");
: 从会话中获取sid1
属性,该属性可能表示商家的ID。
-
获取请求参数:
- 从请求中获取餐品名称(
fname
)、购买人数(fcount
)和价格(fprice
),并转换为适当的数据类型。
- 从请求中获取餐品名称(
-
获取商家ID:
int fdianid = shangService.FindSdianid(sid1);
: 使用ShangService
的FindSdianid
方法根据sid1
获取商家的ID。
-
添加餐品到数据库:
if (foodService.addFood(fname, fcount, fprice, fdianid))
: 调用FoodService
的addFood
方法尝试添加餐品到数据库。
-
重定向:
- 如果添加成功,使用
resp.sendRedirect("showFoodServlet")
重定向到showFoodServlet
。 - 如果添加失败,使用
resp.sendRedirect("fail.jsp")
重定向到错误页面。
- 如果添加成功,使用
-
异常处理:
- 方法声明中包含了
throws ServletException, IOException
,表示这个方法可能会抛出ServletException
和IOException
异常。
- 方法声明中包含了
AddFoodServlet
的作用是接收用户提交的餐品信息,使用服务层添加到数据库,并根据操作结果重定向到相应页面。这个过程中,它利用了会话管理来获取商家ID,并与用户提交的餐品信息一起存储到数据库中。
🎯修改餐品信息
😎前端页面updateFood1.jsp部分
🎈代码
<%--Created by IntelliJ IDEA.User: LenovoDate: 18/6/2024Time: 下午7:59To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>操作房源信息</title><!-- 引入 Bootstrap --><link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"><link href="${pageContext.request.contextPath}/css/updateFood.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="main"><form action="updateFoodServlet" class="form-horizontal" role="form"><div class="form-group"><label >餐品编号</label><input type="text" readonly value="${food.fid}" name="fid" class="form-control"></div><div class="form-group"><label >餐品名称</label><input type="text" class="form-control" value="${food.fname}" name="fname" placeholder="请输入房源名称"></div><div class="form-group"><label >购买人数</label><input type="text" class="form-control" value="${food.fcount}" name="fcount" placeholder="请输入浏览人数"></div><div class="form-group"><label >单价</label><input type="text" class="form-control" value="${food.fprice}" name="fprice" placeholder="请输入浏览人数"></div><div class="form-group"><label>店铺编号</label><input type="text" readonly class="form-control" value="${food.fdianid}" name="fdianid" ></div><div class="form-group"><label >状态</label><select name="fstate" class="form-control"><option value="1" ${food.fstate==1?'selected':''}>上架</option><option value="0" ${food.fstate==0?'selected':''}>下架</option></select></div><button type="submit" class="btn btn-success btn-lg">确定</button><button type="reset" class="btn btn-default btn-lg">重置</button></form>
</div>
</body>
</html>
🎈解释
这段代码是一个JSP页面,用于展示和更新餐品信息的表单:
-
JSP注释:
- 页面顶部的注释由IntelliJ IDEA自动生成,提供了创建者、日期和时间。
-
页面指令:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
: 设置页面的MIME类型为HTML,字符集为UTF-8,脚本语言为Java。<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
: 引入JSTL核心库,使用c
作为前缀。
-
HTML结构:
<html>
: 根元素。<head>
: 包含页面的元数据,如标题和样式链接。<title>
: 页面标题为“操作房源信息”。
-
Bootstrap和自定义CSS:
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
: 引入Bootstrap的CSS文件,用于页面样式。<link href="${pageContext.request.contextPath}/css/updateFood.css" rel="stylesheet" type="text/css">
: 动态引入自定义的CSS样式文件,路径通过JSP表达式构建。
-
表单:
<form action="updateFoodServlet" class="form-horizontal" role="form">
: 创建一个水平布局的表单,用于提交更新餐品信息。action
属性设置表单提交的URL为updateFoodServlet
。
-
表单控件:
<div class="form-group">
: 包含表单控件的布局。<label>
: 表示表单控件的说明文字。<input>
: 创建输入字段,用于展示和编辑餐品信息。readonly
属性用于创建只读字段,用户不能修改。
-
JSP表达式:
${food.fid}
,${food.fname}
,${food.fcount}
,${food.fprice}
, 和${food.fdianid}
: 这些JSP表达式用于从页面传递的food
对象中获取相应的属性值。
-
下拉选择框:
<select name="fstate" class="form-control">
: 创建一个下拉选择框,用于选择餐品的上架或下架状态。${food.fstate==1?'selected':''}
和${food.fstate==0?'selected':''}
: 使用JSP表达式来设置默认选中的选项。
-
按钮:
<button type="submit" class="btn btn-success btn-lg">确定</button>
: 创建提交按钮,使用Bootstrap的按钮样式。<button type="reset" class="btn btn-default btn-lg">重置</button>
: 创建重置按钮,用于清空表单输入。
-
Bootstrap类:
- 页面使用了Bootstrap的类(如
form-horizontal
,form-group
,form-control
,btn
,btn-success
,btn-lg
,btn-default
)来增强表单的布局和样式。
- 页面使用了Bootstrap的类(如
这个JSP页面提供了一个表单,允许用户更新餐品的编号、名称、购买人数、单价、店铺编号和状态。使用Bootstrap框架增强了用户界面的友好性和响应性。表单数据提交到updateFoodServlet
进行处理。
🎈效果
😎后端处理UpdateFoodServlet部分
🎈代码
package com.dingcan.controller;import com.dingcan.service.FoodService;
import com.dingcan.service.Impl.FoodServiceImpl;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 = "UpdateFoodServlet",value = "/updateFoodServlet")
public class UpdateFoodServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int fid= Integer.parseInt(req.getParameter("fid"));String fname=req.getParameter("fname");int fcount=Integer.parseInt(req.getParameter("fcount"));int fprice=Integer.parseInt(req.getParameter("fprice"));int fdianid=Integer.parseInt(req.getParameter("fdianid"));int fstate=Integer.parseInt(req.getParameter("fstate"));//更新数据库FoodService foodService=new FoodServiceImpl();boolean b = foodService.updateFood(fid, fname, fcount, fprice, fdianid, fstate);if(b){resp.sendRedirect("showFoodServlet");}else{resp.sendRedirect("fail.jsp");}}
}
🎈解析
这段Java代码定义了一个名为 UpdateFoodServlet
的Servlet类,用于处理餐品信息更新的请求:
-
包声明:
package com.dingcan.controller;
: 声明了这个类属于com.dingcan.controller
包。
-
导入服务类:
- 导入了
FoodService
接口及其实现类FoodServiceImpl
。
- 导入了
-
@WebServlet 注解:
@WebServlet (name = "UpdateFoodServlet", value = "/updateFoodServlet")
: 注解用于注册Servlet,定义了它的名称和URL映射。当访问/updateFoodServlet
路径时,这个Servlet会被调用。
-
类定义:
public class UpdateFoodServlet extends HttpServlet
: 定义了一个名为UpdateFoodServlet
的类,它继承自HttpServlet
。
-
service 方法:
@Override
: 表示重写了父类的方法。protected void service(HttpServletRequest req, HttpServletResponse resp)
: 这是Servlet的service
方法,用于处理客户端的请求。
-
获取请求参数:
- 从请求中获取餐品的字段,包括编号 (
fid
)、名称 (fname
)、购买人数 (fcount
)、价格 (fprice
)、店铺编号 (fdianid
) 和状态 (fstate
),并将字符串转换为相应的数据类型。
- 从请求中获取餐品的字段,包括编号 (
-
创建服务实例:
FoodService foodService = new FoodServiceImpl();
: 创建FoodService
接口的实现类FoodServiceImpl
的实例。
-
更新数据库:
boolean b = foodService.updateFood(fid, fname, fcount, fprice, fdianid, fstate);
: 调用foodService
的updateFood
方法尝试根据提供的参数更新餐品信息。
-
重定向:
- 如果更新成功 (
b
为true
),则使用resp.sendRedirect("showFoodServlet")
重定向到showFoodServlet
。 - 如果更新失败 (
b
为false
),则使用resp.sendRedirect("fail.jsp")
重定向到错误页面。
- 如果更新成功 (
-
异常处理:
- 方法声明中包含了
throws ServletException, IOException
,表示这个方法可能会抛出ServletException
和IOException
异常。
- 方法声明中包含了
UpdateFoodServlet
的主要作用是接收用户提交的餐品更新信息,调用服务层方法更新数据库中的记录,并根据操作结果重定向到相应页面。这个过程中,它利用了服务层提供的业务逻辑和数据访问对象来实现数据的持久化。
🎯查询热卖餐品
😎后端处理HotFoodServlet部分
🎈代码
package com.dingcan.controller;import cn.hutool.db.Entity;
import com.dingcan.service.FoodService;
import com.dingcan.service.Impl.FoodServiceImpl;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;
import java.util.List;@WebServlet(name = "HotFoodServlet", value = "/hotFoodServlet")
public class HotFoodServlet extends HttpServlet {FoodService foodService=new FoodServiceImpl();@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int sid1=(int)req.getSession().getAttribute("sid1");//查询所有属于商家自己的并且购买人数大于50的餐品String sql="select * from food,shangjia,dianpu where food.`fdianid`=dianpu.`did` and dianpu.`did`=shangjia.`sdianid` and fcount >50 and sid="+sid1;List<Entity> list=foodService.findFood(sql);//list放到req中req.setAttribute("list",list);req.getRequestDispatcher("/s1/showFood1.jsp").forward(req,resp);}
}
🎈解析
这段Java代码是一个Servlet控制器,用于检索并展示热门餐品信息:
-
包声明:
package com.dingcan.controller;
: 声明了这个类属于com.dingcan.controller
包。
-
导入相关类:
- 导入了
cn.hutool.db.Entity
用于数据库操作。 - 导入了
com.dingcan.service.FoodService
接口及其实现类com.dingcan.service.Impl.FoodServiceImpl
。
- 导入了
-
@WebServlet 注解:
@WebServlet(name = "HotFoodServlet", value = "/hotFoodServlet")
: 注解用于注册Servlet,定义了它的名称和URL映射。当访问/hotFoodServlet
路径时,这个Servlet会被调用。
-
类定义:
public class HotFoodServlet extends HttpServlet
: 定义了一个名为HotFoodServlet
的类,它继承自HttpServlet
。
-
成员变量:
FoodService foodService = new FoodServiceImpl();
: 创建了FoodService
接口的实现类FoodServiceImpl
的实例。
-
service 方法:
@Override
: 表示重写了父类的方法。protected void service(HttpServletRequest req, HttpServletResponse resp)
: 这是Servlet的service
方法,用于处理客户端的请求。
-
获取会话属性:
int sid1 = (int) req.getSession().getAttribute("sid1");
: 从会话中获取商家ID (sid1
)。
-
构建SQL查询:
- 构建了一个SQL查询字符串,用于检索所有属于特定商家 (
sid1
)、并且购买人数大于50的餐品。
- 构建了一个SQL查询字符串,用于检索所有属于特定商家 (
-
执行查询:
List<Entity> list = foodService.findFood(sql);
: 使用foodService
的findFood
方法执行SQL查询,并将结果存储在list
中。
-
设置请求属性:
req.setAttribute("list", list);
: 将查询结果list
设置为请求属性,这样就可以在JSP页面中通过${list}
访问这些数据。
-
请求转发:
req.getRequestDispatcher("/s1/showFood1.jsp").forward(req, resp);
: 将请求转发到/s1/showFood1.jsp
页面,携带请求属性。
-
异常处理:
- 方法声明中包含了
throws ServletException, IOException
,表示这个方法可能会抛出ServletException
和IOException
异常。
- 方法声明中包含了
HotFoodServlet
的主要作用是根据商家ID检索热门餐品(购买人数大于50),将这些餐品的信息转发到 showFood1.jsp
页面进行展示。使用 hutool
库的 Entity
类来处理数据库查询结果。这个Servlet通过转发请求到JSP页面,实现了MVC架构中的控制层功能。
🎈效果
🎯查询出售车
😎前端页面soleCar.jsp部分
🎈代码
<%--Created by IntelliJ IDEA.User: LenovoDate: 21/6/2024Time: 上午10:38To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>展示商家购物车的信息</title><!-- 引入 Bootstrap --><link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"><link href="css/sShow.css" rel="stylesheet">
</head>
<body>
<div class="first"><div class="one"><div class="two"><img src="image/four.jpg" alt="LOGO"><label>优质外卖订餐系统</label></div><div class="three"><a href="exitServlet" class="btn">注销</a></div></div><div class="btn-group-vertical"><a href="showFoodServlet" class="btn" role="button">餐品展示</a><a href="s1/addFood.jsp" class="btn" role="button">添加餐品</a><a href="hotFoodServlet" class="btn" role="button">热门餐品</a><a href="showCarServlet" class="btn" role="button">出售车</a></div><div class="four"><table class="table table-striped table-bordered table-condensed"><thead><tr class="danger"><td>餐名</td><td>价格</td><td>状态</td><td>用户编号</td><td>操作</td></tr></thead><tbody><c:forEach items="${list}" var="car"><tr class="success"><td>${car.cname}</td><td>${car.cprice}</td><td>${car.cstate == 1 ? "发货中" : "未发货"}</td><td>${car.cuid}</td><td><a href="sendCarServlet?cid=${car.cid}" class="btn btn-primary">发货</a></td></tr></c:forEach></tbody></table></div>
</div>
</body>
</html>
🎈解析
这段代码是一个JSP页面,用于展示商家购物车中的商品信息:
-
JSP注释:
- 页面顶部的注释由IntelliJ IDEA自动生成,提供了创建者、日期和时间。
-
页面指令:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
: 设置页面的MIME类型为HTML,字符集为UTF-8,脚本语言为Java。<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
: 引入JSTL核心库,使用c
作为前缀。
-
HTML结构:
<html>
: 根元素。<head>
: 包含页面的元数据,如标题和样式链接。<title>
: 页面标题为“展示商家购物车的信息”。
-
Bootstrap和自定义CSS:
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
: 引入Bootstrap的CSS文件,用于页面样式。<link href="css/sShow.css" rel="stylesheet">
: 引入自定义的CSS样式文件。
-
页面内容:
<div class="first">
: 包含整个页面的主要内容。<div class="one">
: 包含LOGO和系统名称。<div class="two">
: 包含LOGO图片和系统名称标签。<div class="three">
: 包含注销按钮,链接到exitServlet
。
-
导航菜单:
<div class="btn-group-vertical">
: 垂直排列的按钮组,包含不同功能的链接。
-
表格展示:
<table class="table table-striped table-bordered table-condensed">
: 使用Bootstrap样式的表格,展示购物车中的商品信息。<thead>
: 表格的头部,包含列标题。<tbody>
: 表格的主体,使用JSTL的<c:forEach>
标签循环遍历list
集合。
-
JSTL标签:
<c:forEach items="${list}" var="car">
: 用于遍历作为请求属性传递到页面的list
集合。
-
表格行:
<tr>
: 表格的一行,用于显示单个商品的信息。<td>
: 表格单元格,显示商品的名称(car.cname
)、价格(car.cprice
)、状态、用户编号(car.cuid
)。
-
操作链接:
<a href="sendCarServlet?cid=${car.cid}" class="btn btn-primary">发货</a>
: 在操作列中,创建一个链接到sendCarServlet
的按钮,用于处理商品的发货操作。
-
状态显示:
${car.cstate == 1 ? "发货中" : "未发货"}
: 使用JSP表达式来显示商品的当前状态。
-
Bootstrap类:
- 页面使用了Bootstrap的类(如
btn
,btn-primary
,table-striped
,table-bordered
,table-condensed
,danger
,success
)来增强表单的布局和样式。
- 页面使用了Bootstrap的类(如
这个JSP页面提供了一个商家购物车信息展示的用户界面,允许商家查看商品信息,并提供了发货操作的链接。使用Bootstrap框架增强了用户界面的友好性和响应性。
🎈效果
😎后端处理部分
🎈代码
package com.dingcan.controller;import cn.hutool.db.Entity;
import com.dingcan.service.CarService;
import com.dingcan.service.Impl.CarServiceImpl;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;
import java.util.List;@WebServlet(name = "ShowCarServlet", value = "/showCarServlet")
public class ShowCarServlet extends HttpServlet {CarService carService=new CarServiceImpl();@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int sid= (int) req.getSession().getAttribute("sid1");List<Entity> list=carService.sFindCar(sid);if (list!=null) {req.setAttribute("list", list);req.getRequestDispatcher("/s1/soleCar.jsp").forward(req, resp);}}
}
🎈解析
这段Java代码是一个Servlet控制器,用于展示商家购物车中的商品信息:
-
包声明:
package com.dingcan.controller;
: 声明了这个类属于com.dingcan.controller
包。
-
导入相关类:
- 导入了
cn.hutool.db.Entity
用于数据库操作。 - 导入了
com.dingcan.service.CarService
接口及其实现类com.dingcan.service.Impl.CarServiceImpl
。
- 导入了
-
@WebServlet 注解:
@WebServlet(name = "ShowCarServlet", value = "/showCarServlet")
: 注解用于注册Servlet,定义了它的名称和URL映射。当访问/showCarServlet
路径时,这个Servlet会被调用。
-
类定义:
public class ShowCarServlet extends HttpServlet
: 定义了一个名为ShowCarServlet
的类,它继承自HttpServlet
。
-
成员变量:
CarService carService = new CarServiceImpl();
: 创建了CarService
接口的实现类CarServiceImpl
的实例。
-
service 方法:
@Override
: 表示重写了父类的方法。protected void service(HttpServletRequest req, HttpServletResponse resp)
: 这是Servlet的service
方法,用于处理客户端的请求。
-
获取会话属性:
int sid = (int) req.getSession().getAttribute("sid1");
: 从会话中获取商家ID (sid1
)。
-
查询数据库:
List<Entity> list = carService.sFindCar(sid);
: 使用carService
的sFindCar
方法根据商家ID查询购物车中的商品信息。
-
检查查询结果:
if (list != null)
: 检查查询结果是否不为空。
-
设置请求属性:
req.setAttribute("list", list);
: 将查询结果list
设置为请求属性,这样就可以在JSP页面中通过${list}
访问这些数据。
-
请求转发:
req.getRequestDispatcher("/s1/soleCar.jsp").forward(req, resp);
: 将请求转发到/s1/soleCar.jsp
页面,携带请求属性。
-
异常处理:
- 方法声明中包含了
throws ServletException, IOException
,表示这个方法可能会抛出ServletException
和IOException
异常。
- 方法声明中包含了
ShowCarServlet
的主要作用是根据商家ID检索购物车中的商品信息,并将这些信息转发到 soleCar.jsp
页面进行展示。如果查询结果为空,则可能不会执行转发,这意味着在 soleCar.jsp
页面中需要对 list
可能为 null
的情况进行处理。使用 hutool
库的 Entity
类来处理数据库查询结果。这个Servlet通过转发请求到JSP页面,实现了MVC架构中的控制层功能。
🎯进行发货操作
😎后端处理 SendCarServlet部分
🎈代码
package com.dingcan.controller;import com.dingcan.service.CarService;
import com.dingcan.service.Impl.CarServiceImpl;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 = "SendCarServlet", value = "/sendCarServlet")
public class SendCarServlet extends HttpServlet {CarService carService=new CarServiceImpl();@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int cid=Integer.parseInt(req.getParameter("cid"));if(carService.updateCar(cid,1)){resp.sendRedirect("showCarServlet");}}
}
🎈解析
这段Java代码是一个Servlet控制器,用于处理将商品标记为已发货的请求:
-
包声明:
package com.dingcan.controller;
: 声明了这个类属于com.dingcan.controller
包。
-
导入服务类:
- 导入了
com.dingcan.service.CarService
接口及其实现类com.dingcan.service.Impl.CarServiceImpl
。
- 导入了
-
@WebServlet 注解:
@WebServlet(name = "SendCarServlet", value = "/sendCarServlet")
: 注解用于注册Servlet,定义了它的名称和URL映射。当访问/sendCarServlet
路径时,这个Servlet会被调用。
-
类定义:
public class SendCarServlet extends HttpServlet
: 定义了一个名为SendCarServlet
的类,它继承自HttpServlet
。
-
成员变量:
CarService carService = new CarServiceImpl();
: 创建了CarService
接口的实现类CarServiceImpl
的实例。
-
service 方法:
@Override
: 表示重写了父类的方法。protected void service(HttpServletRequest req, HttpServletResponse resp)
: 这是Servlet的service
方法,用于处理客户端的请求。
-
获取请求参数:
int cid = Integer.parseInt(req.getParameter("cid"));
: 从请求中获取cid
参数,即商品的唯一标识符,并转换为整数类型。
-
更新商品状态:
if (carService.updateCar(cid, 1))
: 使用carService
的updateCar
方法尝试将商品ID为cid
的商品状态更新为已发货(通常状态码1表示已发货)。
-
重定向:
- 如果更新成功,使用
resp.sendRedirect("showCarServlet")
重定向到showCarServlet
,这将展示更新后的商品列表。
- 如果更新成功,使用
-
异常处理:
- 方法声明中包含了
throws ServletException, IOException
,表示这个方法可能会抛出ServletException
和IOException
异常。
- 方法声明中包含了
SendCarServlet
的主要作用是接收商品ID,调用服务层方法更新商品的发货状态,并根据操作结果重定向到商品列表页面。这个过程中,它利用了服务层提供的业务逻辑和数据访问对象来实现数据的持久化。如果更新失败,代码中没有直接处理,可能需要添加额外的逻辑来处理这种情况(例如重定向到错误页面或显示错误消息)。
🎈效果
相关文章:

【JavaWeb项目】——外卖订餐系统之商家添加餐品、修改餐品、查询热卖餐品、查询出售车、进行发货操作
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
制作抖音私信卡片 - 一键调起并跳转微信二维码
抖音私信图文卡片,点击可以直接一键添加微信 可生成无风险链接,使用苹果手机转发创建出卡片 抖音内点击可以直接调起微信跳入小程序展示微信二维码...

赋能未来园区:TSINGSEE视频AI智能管理平台如何引领园区管理智慧化转型
一、建设背景 随着经济的不断发展,园区产业集聚发展已成为趋势,园区逐渐成为产业聚集的重要载体。目前,国内现有的大部分园区的管理方式比较粗放、单一,范围局限于安全、环境等方面且不成体系,并且没有覆盖到应急、消…...

Linux逻辑卷管理LVM
系列文章目录 提示:仅用于个人学习,进行查漏补缺使用。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 4.Linux 命令安装(rpm、install) 5.Linux账号管理 6.Linux文件/目录权限管理 7.Linux磁盘管理/文件系统 提示&a…...

团队诊断工具TDS
希典梁开广老师引进的团队诊断问卷TDS(Team Diagnostic Survey)是基于卓越团队6个条件模型开发的,是用于诊断团队有效性的测评工具,其建构过程严格遵循心理测量学原理。可以帮助企业觉察团队优劣势,找到提升与发展机会,明确和强化…...

DC-5靶机渗透测试
DC-5靶场 文章目录 DC-5靶场信息收集漏洞发现漏洞利用 --- 日志文件包含漏洞利用 --- 文件包含过滤器链的RCEshell反弹权限提升 信息收集 使用--scriptvuln扫描发现了一个thankyou.php界面 感觉会有问题,前往访问网站信息 漏洞发现 来到thankyou.php界面ÿ…...

16、电科院FTU检测标准学习笔记-基本性能2
作者简介: 本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验 在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验 ———————————————————…...
MySQL——使用Python操作MySQL
文章目录 安装PyMySQL使用PyMySQL操作MySQL 在Python中操作MySQL数据库时,我们使用较多的库是 PyMySQL,如果你选择使用 PyMySQL库,那么首先需要通过pip安装它。pip install pymysql命令就是用来安装PyMySQL的。 安装PyMySQL 1.打开你的命令行工具&…...
Flink的DataStream状态管理
目录 键控数据流(Keyed DataStream) 键控状态(Keyed State) 值状态(ValueState) 列表状态(ListState) 归约状态(ReducingState) 聚合状态(AggregatingState) 映射状态(MapState) 状态生存时间(TTL) 算子状态(Operator State) 广播状态(Broadcast S…...

Daiqile SQL注入绕过
上源码。 <?php header("Content-type: text/html; charsetutf-8"); require db.inc.php;function dhtmlspecialchars($string) {if (is_array($string)) {foreach ($string as $key > $val) {$string[$key] dhtmlspecialchars($val);}}else {$string str_…...

用Python轻松移除PDF中的注释
PDF文档因其跨平台的兼容性和格式稳定性而备受青睐。然而,随着文档在不同用户间的流转,累积的注释可能会变得杂乱无章,甚至包含敏感或过时的信息,这不仅影响了文档的清晰度和专业性,还可能引发隐私风险。因此ÿ…...

51单片机—串口
一、 串口基本认知 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方 式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简 单&a…...
vue 通过 this.$refs 创建方法i向子组件传参让子组件更新
在Vue中,this.$refs主要用于访问子组件的实例或者DOM元素。通过this.$refs,你可以调用子组件的方法或者访问其数据属性,从而实现子组件的更新。以下是一些使用this.$refs向子组件传参并触发更新的常见方法: 1. 直接调用子组件的方…...
Java设计模式以及代理模式
一、设计模式 1.JAVA六大设计原则 JAVA设计模式提供六个基本原则,分别是: 开闭原则(OCP) - The Open-Closed Principle单一职责原则(SRP) - Single Responsibility Principle里氏替换原则(LSP) - Liskov Substitution Principle依赖倒置原则(DIP) - D…...
Elasticsearch 索引库管理:查询、修改与删除
Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎,它允许用户通过 RESTful API 进行数据的索引、搜索、更新和管理。在 Elasticsearch 中,索引库(Index)是存储数据的基本单元。本文将介绍如何查询、修改和删除 Elasticsea…...

视频大怎么压缩小?分享3种视频压缩方法
视频大怎么压缩小?视频文件过大时,压缩视频不仅能帮助我们节省宝贵的存储空间,使其更容易在有限容量的设备中保存,还能显著提升传输效率,特别是在网络条件有限或需要快速分享视频内容的场合。通过专业的压缩工具&#…...

springboot项目搭建集成 redis/跨域/远程请求
目录 一,创建maven项目 1,左上角file > new > maven project 2,next 到 创建 Group id 和 Artifact id编辑编辑 二,配置springboot 1,配置pom文件, 2,创建启动类 3ÿ…...

lvs详解及实例配置
目录 1.什么是负载均衡 1.1为什么用负载均衡 1.2.负载均衡类型 1.2.1.四层负载均衡 1.2.2.七层负载均衡 1.3 四层和七层的区别 2.LVS介绍 2.1LVS 的优势与不足 2.2LVS 核心组件和专业术语 3.ipvsadm命令 4.LVS集群中的增删改 4.1.管理集群服务中的增删改 4.2.管理集…...
DAY41-动态规划-买卖股票
LeetCode121. 买卖股票的最佳时机 public int maxProfit(int[] prices) {//dp数组含义:0为持有该股票,1为不持有该股票int[][] dp new int[prices.length][2];dp[0][0]-prices[0];dp[0][1]0;for(int i1;i<prices.length;i) {dp[i][0]Math.max(dp[i-…...
【C#】StringComparer
什么是“文化” 在 .NET 中,“文化”(Culture)指的是与语言、地区、和区域设置相关的特定信息集合。这些信息包括了日期和时间的格式、数字的表示方式、货币符号、字符串比较规则等等。文化的概念在软件开发中特别重要,因为应用程…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...