家居网购项目(三)

文章目录

    • 1.后台管理—添加家居
        • 1.需求分析
        • 2.程序框架图
        • 3.修改FurnDao
          • 添加方法add
        • 4.修改FurnDaoImpl
          • 添加方法add
        • 5.单元测试
          • FurnDaoTest.java
        • 6.修改FurnService
          • 添加方法add
        • 7.修改FurnServiceImpl
          • 添加方法add
        • 8.单元测试
          • FurnServiceTest.java
        • 9.修改furn_add.jsp
        • 10.修改FurnServlet
          • 添加add方法
        • 11.单元测试
          • 1.中文乱码问题
            • 修改BasicServlet
          • 2.表单重复提交问题
            • 使用重定向解决,修改FurnServlet
          • 3.用户输入格式错误
            • 1.前端添加js验证
            • 2.后端异常处理
    • 2.BeanUtils自动封装javabean
        • 1.基本介绍
        • 2.代码实例
          • 修改FurnServlet.java
        • 3.单元测试
          • 数据不能为null的异常
            • 在javabean中设置默认值,并进行判断
        • 4.使用DataUtils封装并处理异常
          • 1.DataUtils.java
          • 2.修改FurnServlet
    • 3.后台管理—删除家居
        • 1.需求分析
        • 2.程序框架图
        • 3.编写dao层
          • 1.修改FurnDao
            • 添加方法deleteFurnById
          • 2.修改FurnDaoImpl
            • 添加方法deleteFurnById
          • 3.单元测试
            • FurnDaoTest.java
        • 4.编写service层
          • 1.修改FurnService
            • 添加方法deleteFurnById
          • 2.修改FurnServiceImpl
            • 添加方法deleteFurnById
          • 3.单元测试
            • FurnServiceTest
        • 5.修改furn_manage.jsp
          • 1.前端删除提示
          • 2.超链接设置
        • 6.修改FurnServlet
          • 添加方法del
        • 7.结果展示
          • 1.点击删除
          • 2.删除之后重定向
    • 4.后台管理—修改家居
        • 1.需求分析
        • 2.程序框架图
        • 3.编写dao层
          • 1.修改FurnDao
            • 添加方法queryFurnById和updateFurn
          • 2.修改FurnDaoImpl
            • 添加方法queryFurnById和updateFurn
          • 3.单元测试
            • FurnDaoTest
        • 4.编写service层
          • 1.修改FurnService
            • 添加方法queryFurnById和updateFurn
          • 2.修改FurnServiceImpl
            • 添加方法queryFurnById和updateFurn
          • 3.单元测试
            • FurnServiceTest
        • 5.编写web层—使数据回显
          • 1.修改furn_update.jsp
          • 2.修改furn_manage.jsp
          • 3.修改FurnServlet
            • 添加方法showFurn
          • 4.结果展示
            • 1.点击铅笔修改
            • 2.数据回显
        • 6.编写web层—修改家居信息
          • 1.修改furn_update.jsp
          • 2.修改FurnServlet
            • 增加方法updateFurn
          • 3.结果展示
            • 1.初始修改界面
            • 2.准备修改
            • 3.修改成功

1.后台管理—添加家居

1.需求分析

image-20240206102802801

2.程序框架图

image-20240206103259071

image-20240206103341918

3.修改FurnDao
添加方法add
    //向数据库中添加家居public int add(Furn furn);
4.修改FurnDaoImpl
添加方法add
    /*** 添加家居* @return 成功返回1,失败返回-1*/@Overridepublic int add(Furn furn) {String sql = "insert into furn values(null, ?, ?, ?, ?, ?, ?)";//添加家居int update = update(sql, furn.getName(), furn.getMaker(),furn.getPrice(), furn.getSales(), furn.getStock(), furn.getImgPath());return update;}
5.单元测试
FurnDaoTest.java
    @Testpublic void add() {Furn furn = new Furn(null, "温馨风格盆景架", "蚂蚁家居", new BigDecimal(122), 12, 12, "assets/images/product-image/16.jpg");if (furnDao.add(furn) == 1) {System.out.println("添加成功");} else {System.out.println("添加失败");}}

image-20240206105445500

6.修改FurnService
添加方法add
    //2.添加家居public boolean add(Furn furn);
7.修改FurnServiceImpl
添加方法add
    /*** 添加家居* @param furn* @return 成功返回true,失败返回false*/@Overridepublic boolean add(Furn furn) {return furnDao.add(furn) == 1 ? true : false;}
8.单元测试
FurnServiceTest.java
    @Testpublic void add() {Furn furn = new Furn(null, "温馨风格盆景架", "蚂蚁家居", new BigDecimal(122), 12, 12, "assets/images/product-image/16.jpg");if (furnService.add(furn)) {System.out.println("添加成功");} else {System.out.println("添加失败");}}

image-20240206110120214

9.修改furn_add.jsp

image-20240206110837402

image-20240206110850688

10.修改FurnServlet
添加add方法
    /*** 添加家居并重新获取家居信息,请求转发到furn_manage.jsp* @param req* @param resp*/public void add(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {//获取表单信息String name = req.getParameter("name");String maker = req.getParameter("maker");String price = req.getParameter("price");String sales = req.getParameter("sales");String stock = req.getParameter("stock");//封装到bean中Furn furn = new Furn(null, name, maker, new BigDecimal(price), Integer.parseInt(sales), Integer.parseInt(stock), "");//插入到数据库if (furnService.add(furn)) {//插入成功则重新获取家居信息并请求转发list(req, resp);} else {System.out.println("插入失败");}}
11.单元测试
1.中文乱码问题

image-20240206134719344

修改BasicServlet

image-20240206134940882

image-20240206135151080

2.表单重复提交问题

image-20240206141127028

使用重定向解决,修改FurnServlet

image-20240206141111373

3.用户输入格式错误

image-20240206141716172

1.前端添加js验证
<%--  引入jquery  --%><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><script>//验证表单输入信息$(function () {//给提交按钮绑定事件$("input[value='添加家居']").click(function () {//获取价格数据var price = $("input[name='price']").val();//正则验证var pricePattern = /^(0(\.\d+)?|[1-9]\d*(\.\d+)?)$/;if (!pricePattern.test(price)){alert("价格格式不正确!")return false; //取消提交表单}//获取销量数据var sales = $("input[name='sales']").val();//正则验证var salesPattern = /^(0|[1-9]\d*)$/;if (!salesPattern.test(sales)) {alert("销量格式不正确!")return false;}//获取库存数据var stock = $("input[name='stock']").val();//正则验证var stockPattern = /^(0|[1-9]\d*)$/;if (!stockPattern.test(stock)) {alert("库存格式不正确!")return false;}return true;})})</script>

结果展示

image-20240206150018600

image-20240206150044798

image-20240206150114835

2.后端异常处理

1.修改FurnServlet

image-20240206151600144

2.修改furn_add.jsp

image-20240206151653872

3.结果展示

image-20240206151620331

2.BeanUtils自动封装javabean

1.基本介绍

image-20240206152454648

2.代码实例
修改FurnServlet.java
    /*** 添加家居并重新获取家居信息,请求转发到furn_manage.jsp* @param req* @param resp*/public void add(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException, InvocationTargetException, IllegalAccessException//使用BeanUtils工具类封装信息Furn furn = new Furn();//使用工具类获取表单的输入信息,并使用反射将其封装到bean中,注意,name必须与bean的属性对应BeanUtils.populate(furn, req.getParameterMap());System.out.println(furn);//插入到数据库if (furnService.add(furn)) {//插入成功则重定向到家居显示的servletresp.sendRedirect(super.getServletContext().getContextPath() + "/manage/furnServlet?action=list");} else {System.out.println("插入失败");}}

image-20240206154453022

image-20240206154900771

3.单元测试
数据不能为null的异常

image-20240206155420626

image-20240206155613602

在javabean中设置默认值,并进行判断

image-20240206160935910

4.使用DataUtils封装并处理异常
1.DataUtils.java
package com.sxs.furns.utils;import org.apache.commons.beanutils.BeanUtils;import java.lang.reflect.InvocationTargetException;
import java.util.Map;/*** @author 孙显圣* @version 1.0*/
public class DataUtils {//封装bean的异常处理public static <T> T copyParamToBean(Map value, T bean){ //bean的类型不确定,所以使用泛型try {BeanUtils.populate(bean, value);//进行异常处理} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}//没有异常再返回beanreturn bean; //由于返回的是bean,所以返回值也应该是bean类型T}
}
2.修改FurnServlet
    /*** 添加家居并重新获取家居信息,请求转发到furn_manage.jsp* @param req* @param resp*/public void add(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException, InvocationTargetException, IllegalAccessException {//使用工具类封装并处理异常Furn furn = DataUtils.copyParamToBean(req.getParameterMap(), new Furn());//插入到数据库if (furnService.add(furn)) {//插入成功则重定向到家居显示的servletresp.sendRedirect(super.getServletContext().getContextPath() + "/manage/furnServlet?action=list");} else {System.out.println("插入失败");}}

3.后台管理—删除家居

1.需求分析

image-20240206163026967

2.程序框架图

image-20240206163849099

image-20240206164721524

3.编写dao层
1.修改FurnDao
添加方法deleteFurnById
    //根据id删除家居public int deleteFurnById(Integer id);
2.修改FurnDaoImpl
添加方法deleteFurnById
    /*** 删除家居* @param id* @return 成功返回1,失败返回-1*/@Overridepublic int deleteFurnById(Integer id) {String sql = "delete from furn where id = ?";//删除家居return update(sql, id);}
3.单元测试
FurnDaoTest.java
    @Testpublic void deleteFurnById() {if (furnDao.deleteFurnById(13) == 1) {System.out.println("删除成功");} else {System.out.println("删除失败");}}

image-20240206165939714

4.编写service层
1.修改FurnService
添加方法deleteFurnById
    //3.根据id删除家居public boolean deleteFurnById(Integer id);
2.修改FurnServiceImpl
添加方法deleteFurnById
    /*** 根据id删除家居* @param id* @return 成功返回true,失败返回false*/@Overridepublic boolean deleteFurnById(Integer id) {return furnDao.deleteFurnById(id) == 1 ? true : false;}
3.单元测试
FurnServiceTest
    @Testpublic void deleteFurnById(){if (furnService.deleteFurnById(16)) {System.out.println("删除成功");} else {System.out.println("删除失败");}}

image-20240206171008317

5.修改furn_manage.jsp
1.前端删除提示
    <%--引入jquery--%><script type="text/javascript" src="script/jquery-3.6.0.min.js"></script><script type="text/javascript">$(function () { //页面加载完毕后执行function(){}//绑定点击事件$("a.deleteCss").click(function () {//获取到要删除的家居的名字var furnName = $(this).parent().parent().find("td:eq(1)").text();//1. confirm方法会弹出一个确认窗口//2. 点击确定,返回true//3. 点击取消,返回falsereturn confirm("你确定要删除【" + furnName + "】?");})})</script>

image-20240206180730406

2.超链接设置

image-20240206180832821

6.修改FurnServlet
添加方法del
    /*** 根据获取的id删除家居,获取家居信息并重定向到furn_manage.jsp* @param req* @param resp*/public void del(HttpServletRequest req, HttpServletResponse resp) throws IOException {//获取idString id = req.getParameter("id");//根据id删除if (furnService.deleteFurnById(Integer.parseInt(id))) {resp.sendRedirect(super.getServletContext().getContextPath() + "/manage/furnServlet?action=list");} else {System.out.println("删除失败");}}
7.结果展示
1.点击删除

image-20240206181013236

2.删除之后重定向

image-20240206181040807

4.后台管理—修改家居

1.需求分析

image-20240206181315700

image-20240206181327074

2.程序框架图

image-20240206184812744

image-20240206184835035

3.编写dao层
1.修改FurnDao
添加方法queryFurnById和updateFurn
    //根据id查询家居public Furn queryFurnById(Integer id);//根据Furn对象修改家居public int updateFurn(Furn furn);
2.修改FurnDaoImpl
添加方法queryFurnById和updateFurn
    /*** 根据id查询** @param id* @return 成功返回Furn对象,失败返回null*/@Overridepublic Furn queryFurnById(Integer id) {String sql = "select * from furn where id = ?";return querySingle(sql, Furn.class, id);}/*** 根据furn的id来更新所有记录** @param furn* @return 成功返回1,失败返回-1*/@Overridepublic int updateFurn(Furn furn) {String sql = "update furn set name = ?, maker = ?, price = ?, sales = ?, stock = ?, " +"img_path = ? WHERE id = ?";return update(sql, furn.getName(), furn.getMaker(), furn.getPrice(),furn.getSales(), furn.getSales(), furn.getImgPath(), furn.getId());}
3.单元测试
FurnDaoTest
    @Testpublic void queryFurnById() {Furn furn = furnDao.queryFurnById(1);if (furn != null) {System.out.println(furn);} else {System.out.println("查询失败");}}@Testpublic void updateFurn() {Furn furn = new Furn(20, "温馨风格盆景架", "蚂蚁家居", new BigDecimal(122), 12, 12, "assets/images/product-image/16.jpg");if (furnDao.updateFurn(furn) == 1) {System.out.println("修改成功");} else {System.out.println("修改失败");}}

image-20240206185202634

image-20240206185222237

4.编写service层
1.修改FurnService
添加方法queryFurnById和updateFurn
    //4.根据id查询家居public Furn queryFurnById(Integer id);//5.根据Furn对象修改家居public boolean updateFurn(Furn furn);
2.修改FurnServiceImpl
添加方法queryFurnById和updateFurn
    /*** 根据id查询家居* @param id* @return 成功返回Furn对象,失败返回null*/@Overridepublic Furn queryFurnById(Integer id) {return furnDao.queryFurnById(id);}/*** 根据furn对象的id来更新信息* @param furn* @return 成功返回true,失败返回false*/@Overridepublic boolean updateFurn(Furn furn) {return furnDao.updateFurn(furn) == 1 ? true : false;}
3.单元测试
FurnServiceTest
    @Testpublic void queryFurnById() {Furn furn = furnService.queryFurnById(1);if (furn != null) {System.out.println(furn);} else {System.out.println("查询失败");}}@Testpublic void updateFurn() {Furn furn = new Furn(20, "11111", "蚂蚁家居", new BigDecimal(122), 12, 12, "assets/images/product-image/16.jpg");if (furnService.updateFurn(furn)) {System.out.println("更新成功");} else {System.out.println("更新失败");}}

image-20240206190043287

image-20240206190141578

5.编写web层—使数据回显
1.修改furn_update.jsp

image-20240206191944461

image-20240206192028903

2.修改furn_manage.jsp

image-20240206192509805

3.修改FurnServlet
添加方法showFurn
    /*** 根据id查询家居信息,将信息请求转发到前端** @param req* @param resp*/public void showFurn(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取idString id = req.getParameter("id");//根据id查询信息Furn furn = furnService.queryFurnById(Integer.parseInt(id));if (furn != null) {//将信息放到request中并请求转发到furn_update.jspreq.setAttribute("furn", furn);req.getRequestDispatcher("/views/manage/furn_update.jsp").forward(req, resp);} else {System.out.println("查询失败");}}
4.结果展示
1.点击铅笔修改

image-20240206192620571

2.数据回显

image-20240206192656271

6.编写web层—修改家居信息
1.修改furn_update.jsp

image-20240206195440079

2.修改FurnServlet
增加方法updateFurn
    /*** 读取表单信息,进行修改* @param req* @param resp*/public void updateFurn(HttpServletRequest req, HttpServletResponse resp) throws IOException {//使用工具类将表单信息封装到bean中Furn furn = DataUtils.copyParamToBean(req.getParameterMap(), new Furn());//执行更新操作if (furnService.updateFurn(furn)) {//更新成功则重定向到展示页面resp.sendRedirect(super.getServletContext().getContextPath() + "/manage/furnServlet?action=list");}}
3.结果展示
1.初始修改界面

image-20240206195711627

2.准备修改

image-20240206195819973

3.修改成功

image-20240206195838867

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

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

相关文章

【面试经典 150 | 数学】阶乘后的零

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;数学优化计算 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结…

人工智能——机器学习概述

1. 人工智能 1.1. 概念 人工智能(Artificial Intelligence&#xff0c;AI)&#xff0c;是新一轮科技革命和产业变革的重要驱动力量&#xff0c; [26]是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组…

【Ansible自动化运维】Ansible入门基础信息【安装配置、常用命令与模块】

介绍安装配置注意事项yum安装验证安装配置host配置主机清单配置主控端被控端 常用模块命令组成command模块shell模块copy模块script模块 日志信息最后 介绍 Ansible 是一个开源 IT 自动化引擎&#xff0c;可自动执行供应、配置管理、应用程序部署、编排和许多其他 IT 流程。它可…

YesPMP平台 | 活动有礼,现金奖励点击领取!

YesPMP众包平台在线发福利啦&#xff0c;活动火热开启&#xff0c;现金奖励等你来领&#xff0c;最高可领千元&#xff0c;赶快参与将奖励收入囊中&#xff0c;一起来了解活动细节吧&#xff01; 一、活动内容&#xff1a; 活动一&#xff1a;【项目征集令】活动&#xff0c;…

前端大文件上传 -- 上传文件到S3或本地服务器

特别提醒 大文件上传的文件切片逻辑, 包括如何将分片文件上传到本地服务器, 请查看之前的文章: 前端大文件上传 - 总结&#xff08;Vue3 hook Web Worker实现&#xff0c;通过多个Worker线程大大提高Hash计算的速度&#xff09;, 本篇仅实现如何将大文件分块上传到S3. 后面写…

关于Wordpress的操作问题1:如何点击菜单跳转新窗口

1.如果打开&#xff0c;外观-菜单-菜单结构内&#xff0c;没有打开新窗口属性&#xff0c;如图&#xff1a; 2.在页面的最上部&#xff0c;点开【显示选项】&#xff0c;没有这一步&#xff0c;不会出现新跳转窗口属性 3.回到菜单结构部分&#xff0c;就出现了

2024年工程师职称水平能力测试考试难吗?

大家现在都知道&#xff0c;现在湖北中级和高级职称评审&#xff0c;都必须要先报名一个水平能力测试考试&#xff0c;水测考过了之后才能参加评审&#xff0c;那么很多人都不知道水测到底难不难&#xff1f;能不能考过&#xff1f;水测主要是考什么呢&#xff1f; 职称水平能力…

Rust 语言 GUI 用户界面框架汇总(持续更新)

拜登&#xff1a;“一切非 Rust 项目均为非法”&#x1f60e; 什么是 GUI 图形用户界面&#xff08;Graphical User Interface&#xff0c;简称 GUI&#xff0c;又称图形用户接口&#xff09;是指采用图形方式显示的计算机操作用户界面。 现在的应用开发&#xff0c;是既要功…

【python】flask操作数据库工具SQLAlchemy,详细用法和应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【Linux系统编程】第三弹---基本指令(一)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、touch指令 2、mkdir指令 3、ls 指令 4、pwd命令 3、cd 指令 6、rmdir指令 && rm 指令 7、man指令 7、cp指令 …

在 PyCharm 中使用系统安装的 Python 和 Anaconda 的 Python什么区别

virtualenv environment &#xff1a; virtualenv 是一个用于创建独立 Python 环境的工具。它可以在同一个系统上创建多个相互独立的 Python 环境&#xff0c;每个环境都有自己的 Python 解释器和包库&#xff0c;从而可以实现不同项目之间的依赖隔离和版本控制。coda environm…

[已解决]问题:root.users.hdfs is not a leaf queue

问题&#xff1a;root.users.hdfs is not a leaf queue CDH集群报错&#xff1a; Exception in thread “main” org.apache.hadoop.yarn.exceptions.YarnException: Failed to submit application_1713149630679_0005 to YARN : root.users.hdfs is not a leaf queue 思路 …

海外媒体如何发布软文通稿

大舍传媒-带您了解海外发布新潮流 随着全球化的不断深入&#xff0c;越来越多的中国企业开始关注海外市场。为了在国际舞台上树立品牌形象&#xff0c;企业纷纷寻求与海外媒体合作&#xff0c;通过发布软文通稿的方式&#xff0c;传递正面信息&#xff0c;提升品牌知名度。作为…

【攻防世界】ics-07

<?php session_start();if (!isset($_GET[page])) {show_source(__FILE__);die(); }if (isset($_GET[page]) && $_GET[page] ! index.php) {include(flag.php); }else {header(Location: ?pageflag.php); } <?phpif ($_SESSION[admin]) {$con $_POST[con];$…

Redis: 集群

文章目录 一、单点Redis的问题二、主从架构1、概述2、集群结构3、主从数据同步原理&#xff08;1&#xff09;全量同步&#xff08;2&#xff09;增量同步 4、总结&#xff08;1&#xff09;全量同步和增量同步的区别&#xff08;2&#xff09;什么时候执行全量同步&#xff08…

绝地求生更新反作弊系统“ZAKYNTHOS”杀疯了

绝地求生的反作弊系统“ZAKYNTHOS”近期取得了显著的成绩。从2024年1月1日至3月3日&#xff0c;共有117,3588个违规账号被封禁&#xff0c;其中107,3317个账号因使用外挂而被永久封禁。 根据官方每周封禁数据公告&#xff0c;1月至3月每周的永久封禁违规账号平均数高达13万&am…

javafx实现音频播放功能

上链接&#xff1a; https://download.csdn.net/download/jasonhongcn/89146520

腾讯云幻兽帕鲁一键开服教程

腾讯云作为领先的云计算服务提供商&#xff0c;为广大用户提供了便捷、高效的游戏服务器搭建解决方案。其中&#xff0c;幻兽帕鲁一键开服功能&#xff0c;更是让游戏开服变得简单易懂。本文将为大家详细介绍腾讯云幻兽帕鲁一键开服的步骤&#xff0c;帮助大家轻松搭建自己的游…

单链表使用里面为什么是二级指针

这里很多人就会疑问&#xff0c;为什么顺序表里面是一级指针&#xff0c;单链表里面是二级指针。 这里我们专门列出来进行讲解。 因为传递的不是二级指针的话&#xff0c;会导致传参之后&#xff0c;形参改变&#xff0c;实参不改变 你希望形参改变实参也改变就必须传递地址 简…

学习javaEE的日子 Day36 字符流

Day36 1.字符流 应用场景&#xff1a;操作纯文本数据 注意&#xff1a;字符流 字节流编译器 编译器&#xff1a;可以识别中文字符和非中文字符&#xff0c;非中文字符获取1个字节&#xff08;一个字节一个字符&#xff09;&#xff0c;编译器会根据编码格式获取中文字符对应的…