当前位置: 首页 > news >正文

基于SSM框架的《超市订单管理系统》Web项目开发(第五天)供应商管理,增删改查

基于SSM框架的《超市订单管理系统》Web项目开发(第五天)供应商管理,增删改查

上一次我们实现了多表关联查询,还有分页显示数据的功能。还完善了用户管理这一模块。

因此今天我们需要完成的是供应商管理模块,这一模块与用户管理模块都是需要我们进行分页查询和

删除提示。(基本是跟用户管理这一模块相差不大,所以今天的进度会快速一点,不过会着重讲解一下,如何获取在前端获取后端传送的信息,并且前端如何传递信息到后端去,这一部分的话就是用户体验模块

(PS:近期有事所以没有更新,会找时间再更新的)


在这里插入图片描述

今天要完成的功能有:

  1. 实现供应商的添加功能
  2. 实现供应商的修改功能
  3. 实现供应商的查看功能,包括搜索功能
  4. 实现供应商的删除功能

可以好好回想一下,前后端数据传递的知识(view怎么通过表单把数据传给controller端,controller端怎么通过model把数据传给view端


一、实现供应商界面provider.jsp(归属于查询的一方面)

在这里插入图片描述

首先看这张需求图,那么我们就要判断出,页面中我们需要获取的参数有哪些?

可以看到,我们需要在前端往后端传的参数有:

1.供应商名(查询用的),这个我们是需要把以这个参数进行查询,希望获取到结果的集合

2.页面索引(分页使用,应该在前端页面中设置一个隐藏起来的参数,其作用是用于记录当前页码)

在这里插入图片描述

​ **代码解释一下:**因为这里我们是进行一个供应商列表查询,我们需要对结果进行分页显示。pageIndex是一个用于记录当前页码的变量,它的值会随着用户翻页操作而不断变化。因此需要从前端传回到后端,以获取对应的供应商数据。

为了将当前页码的值传递到后台,需要将pageIndex的值存储到表单中,并将表单提交到后台。而为了避免用户看到或修改页码,可以将pageIndex设置为一个隐藏的参数,这样它就不会在页面上显示出来。而后台就可以根据该参数值,正确地展示对应的供应商数据了


那么我们先放一下,就按照我们之前说的后端流程来进行开发

熟悉pojo->dao->service->controller->view的过程

①链接数据库自动创建provider数据表的pojo类

在这里插入图片描述

详细过程不展示了,可以翻看查阅我的往期文章➡使用idea链接数据库自动生成数据表的pojo类

PS:生成完一定要记得自己去检查一下pojo类!(如下图)

  • 是否导包正确,路径是否正确
  • 字段映射的变量属性是否正确?

在这里插入图片描述


②编写dao层中的ProviderMapper.xml,查询供应商列表的sql语句

1.我们需要一个根据条件查询供应商总数的sql语句:getProviderCount

2.还需要一个对供应商表分页的查询的sql语句:getProviderListByPage

<!--查询供应商总数的统计-->
<select id="getProviderCount" resultType="int">select  count(1) as count from provider<where><if test="proName!=null and proName!=''">proName like CONCAT ('%',#{proName},'%')</if></where>
</select><!--创建一个对供应商表分页的查询-->
<select id="getProviderListByPage" resultType="Provider">select  * from provider<where><if test="proName!=null and proName!=''">proName like CONCAT ('%',#{proName},'%')</if></where>order by id limit #{currentPageNo},#{pageSize}
</select>

这里我们使用了动态sql

  • 若是proName不为空,则根据proName进行模糊查询出所有相关的供应商.
  • 若是proName为空,那么直接就默认查询全部的供应商列表。

若是对动态SQL不熟悉的话,可以参考我往期的文章学习下关于动态SQL的知识

什么是动态SQL,如何应用?


③编写ProviderMapper接口,往里面加入对应sql语句,记得方法名要与Provider.xml中的sql的id一致
//获取供应商记录总数
public int getProviderCount(@Param("proName")String proName);//根据条件查询供应商列表
public List<Provider> getProviderListByPage(@Param("proName")String proName,@Param("currentPageNo")Integer currentPageNo,@Param("pageSize")Integer pageSize);

PS:方法的参数和返回类型要与SQl语句中设置的一致,不然会出现参数报错,什么类型不符等报错

在这里插入图片描述


④编写ProviderService接口,往里面加入getProviderCount、getProviderListByPage方法

在这里插入图片描述

⑤编写ProviderServiceImpl实现类,实现getProviderCount、getProviderListByPage方法的具体细节。

在这里插入图片描述

PS:代码就不解释了,这和前面的用户模块代码相似,面向接口编程。这俩个是为了初始化供应商页面的时候能够获取到所有供应商信息和进行信息分页展示。


⑥编写Controller层,新建一个ProviderController类。一般来说,对不同的类进行操作,我们会编写不同的controller类。

前面User表的增删改查,所有的信息主体都是User表,因此我们创建UserController类进行控制。

那么现在我们对Provider表进行增删改查,因此我们也可以新建一个ProviderController类进行控制,这样分开来编写,后续新功能的拓展或者修改,都不会影响到其他的功能运行。

(这也是有点分布式的意思在里面,提前了解,可以帮助我们以后更快掌握分布式)

在这里插入图片描述

这里就不讲解了,和UserController类似。俩个参数,一个是页面当前页索引,二是需要查询的供应商名。

//获取供应商列表
@RequestMapping(value="/providerlist")
public String getProviderList(Model model,HttpSession session,@RequestParam(value="queryname",required=false) String queryProviderName,@RequestParam(value="pageIndex",required=false) String pageIndex) {logger.info("用户进入providerlist,供应商列表界面");if(session.getAttribute("user") == null){ //如果用户没有登录就直接来到provider就回到syserrorreturn "redirect:/syserror";}List<Provider> providerList = null;//设置页面容量int pageSize = 5;//当前页码int currentPageNo = 1;if(queryProviderName == null){queryProviderName = "";}if(pageIndex != null){try{currentPageNo = Integer.valueOf(pageIndex);}catch(NumberFormatException e){return "redirect:/syserror";}}//总数量(表)int totalCount = providerService.getProviderCount(queryProviderName);//总页数PageSupport pages=new PageSupport();pages.setCurrentPageNo(currentPageNo);pages.setPageSize(pageSize);pages.setTotalCount(totalCount);int totalPageCount = pages.getTotalPageCount();//控制首页和尾页//设置分页的每一页的显示从哪里开始int start = ((currentPageNo-1) * pageSize);if(currentPageNo < 1){currentPageNo = 1;}else if(currentPageNo > totalPageCount){currentPageNo = totalPageCount;}//若是想要展示出其他的信息,就需要在这部分,把对应的数据或者变量添加到model中,然后去前端设置接受参数即可。providerList = providerService.getProviderListByPage(queryProviderName,start,pageSize);model.addAttribute("providerList", providerList);model.addAttribute("queryProviderName", queryProviderName);model.addAttribute("totalPageCount", totalPageCount);model.addAttribute("totalCount", totalCount);model.addAttribute("currentPageNo", currentPageNo);return "provider";
}

写入了一个名为providerlist的映射,所以当访问providerlist的网址时,我们会跳转到provider的视图view中,因此得去创建一下provider.jsp。


⑦编写provider.jsp,记得在自己项目设定的路径下创建嗷
<%--Created by IntelliJ IDEA.User: StevedashDate: 2023/9/18Time: 18:52To 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"%>
<%@include file="/WEB-INF/pages/common/head.jsp"%>
<div class="right"><div class="location"><strong>你现在所在的位置是:</strong><span>供应商管理页面</span></div><div class="search"><form method="post" action="${pageContext.request.contextPath }/providerlist"><input name="method" value="query" class="input-text" type="hidden"><span>供应商名:</span><input name="queryname" class="input-text" type="text" value="${queryProviderName }"><input type="hidden" name="pageIndex" value="1"/><input value="查 询" type="submit" id="searchbutton"><a href="${pageContext.request.contextPath}/provideradd" >添加供应商</a></form></div><!--用户--><table class="providerTable" cellpadding="0" cellspacing="0"><tr class="firstTr"><th width="10%">供应商编码</th><th width="20%">供应商名称</th><th width="10%">联系人</th><th width="10%">电话</th><th width="20%">供应商地址</th><th width="30%">操作</th></tr><c:forEach var="provider" items="${providerList }" varStatus="status"><tr><td>${provider.proCode}</td><td>${provider.proName}</td><td>${provider.proContact}</td><td>${provider.proPhone}</td><td>${provider.proAddress}</td><td><span><a class="viewProvider" href="javascript:;" providerid=${provider.id} proCode=${provider.proCode } ><img src="${pageContext.request.contextPath }/statics/images/read.png" alt="查看" title="查看"/></a></span><span><a class="modifyProvider" href="javascript:;" providerid=${provider.id } proCode=${provider.proCode }><img src="${pageContext.request.contextPath }/statics/images/xiugai.png" alt="修改" title="修改"/></a></span><span><a class="deleteProvider" href="javascript:;" providerid=${provider.id } proCode=${provider.proCode }><img src="${pageContext.request.contextPath }/statics/images/schu.png" alt="删除" title="删除"/></a></span></td></tr></c:forEach></table><input type="hidden" id="totalPageCount" value="${totalPageCount}"/><c:import url="rollpage.jsp"><c:param name="totalCount" value="${totalCount}"/><c:param name="currentPageNo" value="${currentPageNo}"/><c:param name="totalPageCount" value="${totalPageCount}"/></c:import>
</div>
</section><!--点击删除按钮后弹出的页面-->
<div class="zhezhao"></div>
<div class="remove" id="removeProv"><div class="removerChid"><h2>提示</h2><div class="removeMain"><p>你确定要删除该供应商吗?</p><a href="#" id="yes">确定</a><a href="#" id="no">取消</a></div></div>
</div><%@include file="/WEB-INF/pages/common/foot.jsp" %>
<script type="text/javascript" src="${pageContext.request.contextPath }/statics/js/providerlist.js"></script>

基本页面的展示和用户管理页面相差不大,唯一需要讲解的就是

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

这是在JSP页面中导入JSTL(JavaServer Pages Standard Tag Library)的核心功能库。JSTL是一个非常流行的标准标签库,它为JSP页面提供了一系列的标准动作,比如迭代、条件判断、国际化支持、SQL等

因此我们遍历集合中的数据就更为简单轻松!!!


⑧运行项目进行测试,出现如下报错

在这里插入图片描述

PS:这种是编码错误,因为我们的代码中有中文注释嘛,不过呢没有影响的,我们前面也设定好了项目文件的编码,这里会提示报错,是因为编译器中的预编译设置,我们对项目文件有了修改,他检查到与项目编码不同,所以弹出的报错

​ 实际上我们只需要再点击一次项目运行即可正常部署!!!

在这里插入图片描述

在这里插入图片描述

正常部署啦,打开网页输入我们设置好的映射网址进行尝试把

在这里插入图片描述

正确显示啦,若是弹出404等,就说明还没有修改页面的指针,得去common下找到头部文件head.jsp,里面修改一下我们侧边栏指引的跳转路径,修改成我们前面设置好的providerlist映射即可。

在这里插入图片描述

下面的三个功能也是基本上一致的,需要同学们自己完成┗|`O′|┛ 嗷~~,要考虑的就是需要什么参数,是否需要返回值,也就是考虑方法设计的同时,需要想到的点。

想要跟着学习的可以去我的资源里面找对应的文件下载,我的md文件也会发上去,项目文件会上传可以自己跟着学习一下。

作者:Stevedash

发表于:2023年12月4日 23点39分

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

相关文章:

  • 【漏洞复现】速达软件存在任意文件上传
  • 《内蒙古自治区“十四五”能源发展规划》明确提出,重点打造()、 阿拉善盟和内蒙古东部的通辽市等地区千万千瓦级风电基地。
  • 虹科案例 | OPC UA SDK快速扩展VIMANA智能制造软件连接性
  • 代码随想录刷题题Day5
  • ultralytics yolo图像分类训练案例;pytorch自有数据集图像分类案例
  • SpringBoot整合MongoDB
  • 使用com组件编辑word
  • 【每日易题】Leetcode上Hard难度的动态规划题目——地下城游戏的实现
  • Android wifi 框架以及Enable流程
  • 第八节HarmonyOS @Component自定义组件的生命周期
  • ubuntu虚拟机设置跳不出来
  • 【Rust】所有权的认识
  • 华为 ArkTS 边框怎么设置,当边边框怎么设置(鸿蒙开发)
  • 模拟电路学习笔记(一)之芯片篇(持续更新)
  • postgreSQL 查询所有模式的语句
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【技术性】Search知识
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Angular4 模板式表单用法以及验证
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript的使用你知道几种?(上)
  • Laravel 菜鸟晋级之路
  • Laravel 实践之路: 数据库迁移与数据填充
  • text-decoration与color属性
  • 给初学者:JavaScript 中数组操作注意点
  • 诡异!React stopPropagation失灵
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 码农张的Bug人生 - 见面之礼
  • 算法-图和图算法
  • 提醒我喝水chrome插件开发指南
  • 与 ConTeXt MkIV 官方文档的接驳
  • elasticsearch-head插件安装
  • 阿里云服务器如何修改远程端口?
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #、%和$符号在OGNL表达式中经常出现
  • #162 (Div. 2)
  • (1)bark-ml
  • (10)ATF MMU转换表
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (剑指Offer)面试题34:丑数
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (理论篇)httpmoudle和httphandler一览
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)SpringBoot3---尚硅谷总结
  • (转)scrum常见工具列表
  • (转载)Linux网络编程入门
  • .describe() python_Python-Win32com-Excel
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET Standard 支持的 .NET Framework 和 .NET Core