家居网购项目实现04

以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git

10.功能09-后台管理 删除家居

10.1需求分析/图解

需求如下:

  1. 管理员进入到家居管理页面
  2. 点击删除家居连接,弹出确认窗口,确认删除,取消放弃

10.2思路分析

10.3代码实现

10.3.1dao层

FurnDAO接口

/**
* 通过传入的id,删除furn表中对应的记录
*
* @param id id
* @return 返回受影响的行数
*/
public int deleteFurnById(int id);

FurnDAOImpl

@Override
public int deleteFurnById(int id) {
String sql = "DELETE FROM `furn` WHERE `id`=?;";
return update(sql, id);
}

10.3.2service层

FurnService接口

/**
* 根据id删除对应的家居信息
*
* @param id id
* @return 返回修改表的行数
*/
public int deleteFurnById(int id);

FurnServiceImpl

@Override
public int deleteFurnById(int id) {
return furnDAO.deleteFurnById(id);
}

测试类

@Test
public void deleteFurnById() {
if (furnService.deleteFurnById(24) != 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
}

10.3.3web层

FurnServlet

/**
* 处理删除家居的请求
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求删除的家居id
String id = req.getParameter("id"); //防止接收的id不是一个数字型的字符串
furnService.deleteFurnById(DataUtils.parseInt(id, 0)); //重定向到家居列表页-该地址由浏览器解析
resp.sendRedirect(req.getContextPath() + "/manage/furnServlet?action=list"); }

10.3.4前端页面校验

furn_manage.jsp添加校验

<%--引入jquery--%>
<script type="text/javascript" src="script/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function () {
//获取删除id,绑定事件
$("a.deleteFurn").click(function () {
//获取要删除的家居的名字
var furnName = $(this).parent().parent().find("td:eq(1)").text();
//confirm弹出的窗口,点击确定返回true,点击取消返回false
return confirm("确认要删除"+furnName+"吗?");
})
})
</script>

10.4完成测试

点击删除

删除成功

11.功能10-后台管理 修改家居

11.1需求分析/图解


  1. 管理员进入到家居管理页面furn_manage.jsp,点击修改按钮,跳转到furn_update.jsp
  2. 在furn_update.jsp先回显该家居信息
  3. 在框中填写新的信息,点击修改家居按钮
  4. 修改成功后,回到展示页面,重新刷新显示家居列表

11.2思路分析

11.3代码实现

11.3.1dao层

FurnDAO接口

/**
* 通过传入的id,返回furn表中对应的furn对象
* @param id id
* @return 返回furn表中对应的furn对象
*/
public Furn queryFurnById(int id); /**
* 通过传入的furn对象,修改furn表对应的记录的字段值
* @param furn 传入的furn对象
* @return 返回受影响的行数
*/
public int updateFurn(Furn furn);

FurnDAOImpl

@Override
public Furn queryFurnById(int id) {
String sql = "SELECT `id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path` AS imgPath " +
"FROM `furn` WHERE id=?";
return querySingle(sql, Furn.class, id);
} @Override
public 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.getStock(), furn.getImgPath(), furn.getId());
}

FurnDAOImplTest

@Test
public void queryFurnById() {
Furn furn = furnDAO.queryFurnById(1);
System.out.println(furn);
} @Test
public void updateFurn() {
Furn furn = new Furn(39,"king","皇家家居",new BigDecimal(999),
88,99,"assets/images/product-image/default.jpg");
int i = furnDAO.updateFurn(furn);
System.out.println("i=" + i);
}

11.3.2service层

FurnService

/**
* 根据id返回家居信息
*
* @param id id
* @return 返回furn表中对应的furn对象
*/
public Furn queryFurnById(int id); /**
* 将传入的furn对象,根据id更新到furn表对应的字段
*
* @param furn 传入的furn对象
* @return 返回受影响的行数
*/
public int updateFurn(Furn furn);

FurnServiceImpl

@Override
public Furn queryFurnById(int id) {
return furnDAO.queryFurnById(id);
} @Override
public int updateFurn(Furn furn) {
return furnDAO.updateFurn(furn);
}

FurnServiceImplTest

@Test
public void queryFurnById() {
Furn furn = furnService.queryFurnById(1);
System.out.println(furn);
} @Test
public void updateFurn() {
int i = furnService.updateFurn(new Furn(38, "queen", "皇家家居", new BigDecimal(888),
99, 21, "assets/images/product-image/default.jpg"));
System.out.println("i=" + i);
}

11.3.3web层

FurnServlet

/**
* 处理显示单个家居信息的请求
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void showFurn(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求显示的家居id
String id = req.getParameter("id");
//在数据库中查询,得到furn对象
Furn furn = furnService.queryFurnById(DataUtils.parseInt(id, 0));
//将furn放入到request域中
req.setAttribute("furn", furn);
//请求转发到furn_update.jsp中,在该页中显示furn信息
//这里使用请求转发是因为如果使用重定向,当刷新页面之后就没有了request域中的信息
req.getRequestDispatcher("/views/manage/furn_update.jsp")
.forward(req, resp);
} /**
* 处理修改家居的请求
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//自动填充Javabean
Furn furn = DataUtils.copyParamToBean(req.getParameterMap(), new Furn());
//调用updateFurn,更改数据
furnService.updateFurn(furn);
//修改成功后重定向,显示列表家居
resp.sendRedirect(req.getContextPath() + "/manage/furnServlet?action=list");
}

相应的前端接口也需要修改,这里忽略

utils包工具类DataUtils:

package com.li.furns.utils;

import org.apache.commons.beanutils.BeanUtils;

import java.util.Map;

/**
* @author 李
* @version 1.0
*/
public class DataUtils {
public static <T> T copyParamToBean(Map value, T bean) {
try {
//将req.getParameterMap()的数据自动封装到furn对象中
//底层使用反射将数据封装,前提是,表单提交的数据字段名称必须和Javabean的属性名一致
BeanUtils.populate(bean, value);
} catch (Exception e) {
e.printStackTrace();
}
return bean;
} //将字符串转成数字,否则返回默认值
public static int parseInt(String str, int defaultVal) {
try {
return Integer.parseInt(str);
} catch (NumberFormatException e) {
System.out.println(str + " 格式不正确");
}
return defaultVal;
}
}

11.4完成测试

点击修改按钮

跳转到修改页面,显示数据成功

插入新数据,点击修改按钮

页面跳转显示成功

day05-功能实现04的更多相关文章

  1. VirtualBox中安装Ubuntu12.04/Ubuntu14.04虚拟机

    NOTE: 一开始安装的Ubuntu12.04,后来又重新安装了14.04.截图基本使用了安装12.04时的截图,后来安装14.04时又补充了几张.该安装过程对Ubuntu12.04和14.04都是适 ...

  2. X240 Ubuntu18.04安装流水帐

    U盘安装 使用Startup Disk Creator和下载好的iso文件创建启动U盘 (在win7下官网建议的刻录软件是Rufus, https://rufus.akeo.ie/) Nautilus ...

  3. ubuntu18.04系统安装+基本环境配置【原创】

    平台信息:PC:ubuntu18.04.i5.七彩虹GTX1060显卡.固态硬盘.机械硬盘 作者:庄泽彬(欢迎转载,请注明作者) 说明:在原本的电脑买一个独立显卡,装上去之后,出了各种问题,虽然后面勉 ...

  4. S2---深入.NET平台和C#编程的完美总结

    1.NET简单解说 l 面向对象提升 OOP(Object Oriented  Programming)面向对象编程 AOP:(Aspache  Oriented Programming):面向切面编 ...

  5. Easy Sysprep更新日志-skyfree大神

    Easy Sysprep更新日志: Skyfree 发表于 2016-1-22 13:55:55 https://www.itsk.com/forum.php?mod=viewthread&t ...

  6. IO流04--毕向东JAVA基础教程视频学习笔记

    Day20 01 File概述02 File对象功能-创建和删除03 File对象功能-判断04 File对象功能-获取05 File对象功能-文件列表106 File对象功能-文件列表207 列出目 ...

  7. jexus

    Jexus web server V5.1 安装配置要点 一.Jexus简介:Jexus web server for linux 是一款基于.NET兼容环境,运行于Linux/unix操作系统之上, ...

  8. ThinkPHP项目CMS内容管理系统开发视频教程【20课】(3.02GB)

    ThinkPHP背景介绍:     ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业级应用开发而诞生的. ...

  9. Vbox中Ubuntu的安装和共享文件夹设置

    1. 选择版本 1.1 Ubuntu桌面版与服务器版的区别 桌面版与服务器版,只要发布版本号一致,这两者从核心来说也就是相同的,唯一的差别在于它们的预期用途.桌面版面向个人电脑使用者,可以进行文字处理 ...

  10. JavaSE_ API常用对象 总目录(11~14)

    JavaSE学习总结第11天_开发工具 & API常用对象111.01 常见开发工具介绍11.02 Eclipse和MyEclipse的概述11.03 Eclipse的下载安装及卸载11.04 ...

随机推荐

  1. 关闭You have new mail in /var/spool/mail/root提醒

    echo "unset MAILCHECK">> /etc/profile #以root权限执行 或者用sudo source /etc/profile cat /de ...

  2. python及第三方库交叉编译

    一.前言: 网上关于python的交叉编译的文章很多,但是关于python第三库的交叉编译的文章就比较少了,而且很多标题是第三方库的交叉编译,但是实际上用到的都是不需要交叉编译就能用的库,可参考性不强 ...

  3. [题解] BZOJ 3456 洛谷 P4841 [集训队作业2013]城市规划 多项式,分治FFT

    题目 令\(f_i\)表示n个点的答案.考虑容斥,用所有连边方案减去有多个连通块的方案.枚举1号点所在的连通块大小: \(f_i=2^{i(i-1)/2}-\sum_{j>0}^{i-1}f_j ...

  4. 从SVN导出项目出现的乱码问题

    解决的方法很简单,只需要将Eclipse的编码标准设置为UTF-8即可 1.Window->Preferences->General->Workspace   面板Text file ...

  5. [C#]SourceGenerator实战: 对任意对象使用await吧!!!

    [C#]SourceGenerator实战: 对任意对象使用await吧!!! 前言 本文记录一次简单的 SourceGenerator 实战,最终实现可以在代码中 await 任意类型对象,仅供娱乐 ...

  6. eDP接口简介

    1. eDP背景介绍   随着显示分辨率的越来越高,传统的VGA.DVI等接口逐渐不能满足人们的视觉需求. 随后就产生了以HDMI.DisplayPort为代表的新型数字接口,外部接口方面HDMI占据 ...

  7. 完全背包问题 —— 贪心优化 DP 范围

    题意: 现在有 \(2n+1\) 个物品(\(n\le 300\)),体积分别为 \(-n,-n+1,\dots,-1,0,1,\dots,n\),第 \(i\) 个物品有 \(a_i\) 个,求选出 ...

  8. k8s集群正常kubectl用不了

    今天有个客户反馈k8s集群服务正常,业务也正常.kubectl get no敲入这个命令就有夯住了 仔细去检查配置发现少了一个config 最后在master-2上的config文件cp拷一份过来问题 ...

  9. FlinkSql之TableAPI详解

    一.FlinkSql的概念 核心概念 Flink 的 Table API 和 SQL 是流批统一的 API. 这意味着 Table API & SQL 在无论有限的批式输入还是无限的流式输入下 ...

  10. G1 垃圾收集器深入剖析(图文超详解)

    G1(Garbage First)垃圾收集器是目前垃圾回收技术最前沿的成果之一. G1 同 CMS 垃圾回收器一样,关注最小时延的垃圾回收器,适合大尺寸堆内存的垃圾收集.但是,G1 最大的特点是引入分 ...