基于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分

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BFD多跳检测配置

定义 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种全网统一的检测机制&#xff0c;用于快速检测、监控网络中链路或者IP路由的转发连通状况。 目的 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网络设备需要…

指针进阶知识超详细讲解(C语言)(中)

前言 苦苦等待&#xff0c;终于迎来了我们的指针讲解第二期&#xff0c;如果有还没有看过上一期的小伙伴&#xff0c;那赶紧点击这个链接学习后再来看这篇博客吧。指针基础知识超详细讲解&#xff08;C 语言&#xff09;&#xff08;上&#xff09; 如果对学习C语言有兴趣那千万…

如何在Linux环境搭建本地SVN服务器并结合cpolar实现公网访问

目录 前言 1. Ubuntu安装SVN服务 2. 修改配置文件 2.1 修改svnserve.conf文件 2.2 修改passwd文件 2.3 修改authz文件 3. 启动svn服务 4. 内网穿透 4.1 安装cpolar内网穿透 4.2 创建隧道映射本地端口 5. 测试公网访问 6. 配置固定公网TCP端口地址 6.1 保留一个固定…

GEE:Sobel算子卷积

作者&#xff1a;CSDN _养乐多_ 本文将深入探讨边缘检测中的一个经典算法&#xff0c;即Sobel算子卷积。我们将介绍该算法的基本原理&#xff0c;并演示如何在Google Earth Engine中应用Sobel算子进行图像卷积操作。并以试验区NDVI为例子&#xff0c;研究区真彩色影像、NDVI图…

【GIT】.gitignore 在忽略目录中放开某目录

示例&#xff1a;忽略build下面的所有目录&#xff0c;只放开build/ast2500-default/workspace/recipes-phosphor/ 目录 .gitignore 实现文件代码 # 忽略 build 目录下的所有目录 # 并放开build/ast2500-default/workspace/recipes-phosphor/ build/* !build/ast2500-defaul…

轮询分区的设置

终于可以写MPI了&#xff0c;没想到&#xff0c;刚开始就当头一棒&#xff0c;我按照之前的配置MPI环境&#xff0c;配置完成就报错 好家伙&#xff0c;仔细检查了每一个步骤都没找到问题&#xff0c;上网搜索了一些解决方案&#xff0c;也没有解决。所幸&#xff0c;在配置MPI…

关于前端学习的思考-vertical-align的用法

先摆结论&#xff1a;vertical-align这里的top线&#xff0c;bottom线&#xff0c;middle线&#xff0c;baseline线是由最大宽度和最大高度的行内元素或行内块元素决定的。 按照惯例&#xff0c;先摆三个行内元素。 1、改变第一个盒子&#xff0c;vertical-align&#xff1a;to…

主机装ubuntu双系统,无线网络问题

微星主板开机按del进入bios&#xff0c;setting里设置启动优先级 启动盘制作 350G 三个分区&#xff1a; 1.EFI系统分区&#xff0c;2G&#xff0c;逻辑分区&#xff0c;空间起始位置 2.Ext4&#xff0c;/&#xff0c;根目录&#xff0c;120G&#xff0c;主分区&#xff0c…

Java异常详解大全(2023版)

Java异常详解 异常分类1.Throwable2. Error(错误)3. Exception(异常)3.1 运行时异常 RuntimeException3.2 编译时异常(受检查异常)ClassNotFoundException + IOException4.常见的运行时异常5.异常如何处理Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、…

Uber Go 语言编码规范

uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司&#xff0c;也是 Go 语言的早期 adopter。其开源了很多 golang 项目&#xff0c;诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…

人工智能学习6(贝叶斯实现简单的评论情感分析)

编译工具PyCharm 文章目录 编译工具PyCharm 文本分析与表示实现方式&#xff1a;文本表示方法文本相似度计算LDA主题模型 朴素贝叶斯算法应用&#xff1a;评论情感分析&#xff0c;工具评论分析是好评还是差评获取数据加载停用词内容标准化&#xff08;将每一句话划分成一个个的…

四通道轨-轨运算芯片 D8054,外围应用简便,低功耗2.3mA (典型值)运放供电电流

D8054是一款四通道轨-轨运算放大器&#xff0c;外围应用简便&#xff0c;价格低廉。封装形式为SOP14&#xff0c;TSSOP14&#xff0c; SOP16&#xff0c; TSSOP16。 主要特点&#xff1a; ● 轨-轨输出&#xff0c;输出失调2mV (典型值) ● 高速250MHz&#xff0c;-3dB带…

HNU-电路与电子学-2018期末A卷(含标准解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 这门课程主要由所谓的“数电”与“模电”组成。而且先学的“模电”后学的“”数电&#xff0c;故期中考试主要以“模电”为主&#xff0c;期末考试主要以“数…

“上云”还是“下云”?探云计算的下一站未来!

引言 10 月 27 日&#xff0c;X&#xff08;原Twitter&#xff09;工程技术发布帖子称&#xff0c;在过去的一年里&#xff0c;技术团队优化了 X 的云服务使用方式&#xff0c;着手将更多工作负载迁往本地基础设施。这一转变使 X 每月的云成本降低了 60%。所有媒体、Blob 存储均…

[全志]更新bootlogo分区数据从而更新bootlogo

一、需求 在不进行镜像烧录的情况下&#xff0c;通过启动项或脚本将已存在于主板的bootlogo文件更新到bootlogo分区中&#xff0c;从而实现bootlogo的更新 二、操作 1、在主板上查找bootlogo文件路径 find -name bootlogo* 实机效果&#xff1a; 2、进入文件夹路径 cd ./d…

视频剪辑方法:AI智剪高效稳定,视频批量处理有技巧

随着社交媒体的兴起和视频制作工具的普及&#xff0c;视频剪辑已经成为一项重要的工作。然而对于许多非专业创作者来说&#xff0c;视频剪辑可能是一项困难的任务。所幸AI智剪提供了一种高效稳定的视频剪辑方法&#xff0c;使得视频批量处理变得更加简单。使用AI智剪可以大大节…

派对的最大快乐值

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 派对的最大快乐值 &#x1f48e;总结 派对的最大快乐值 题目 员工信息的定义如下&#xff1a; 公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、没有环的多叉树。树的头节点是公…

蓝桥杯物联网竞赛_STM32L071_10_温度传感器扩展模块

原理图&#xff1a; 温度传感器原理图&#xff1a; 其中芯片可以通过SCL和SDA引脚通过I2C通信向温度传感器指定地址获取温度的模拟量 再利用公式将模拟量转换成相应温度即可 实验板接口原理图&#xff1a; 模拟量转相应温度公式&#xff1a; CubMx配置&#xff1a; Keil配置&…

Ribbon 负载均衡

1、负载均衡整体流程 2、负载均衡流程逐级跟踪运行 (1) LoadBlanced 注解可以使LoadBalancerInterceptor拦截到&#xff1b; (2)LoadBalancerInterceptor 实现了ClientHttpRequestInterceptor接口&#xff1b; (3)ClientHttpRequestInterceptor接口释义如下&#xff1b; (4)int…

金和OA saveAsOtherFormatServlet接口任意文件上传漏洞复现 [附POC]

文章目录 金和OA saveAsOtherFormatServlet接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 金和OA saveAsOtherFormatServlet接口任意文件上传漏洞复现 [附POC] 0x01 前言 免责…