14.商品添加功能

article/2025/9/18 10:19:50

商品用例的bean层

添加商品的用例实现首先要有封装商品的bean,还要有封装商品种类的bean。

封装商品种类的bean

package cn.bingou.domain;/*** 商品种类的bean* @author 吹静静**/
public class ProdCategory {private int id;private String cname;public ProdCategory() {super();// TODO Auto-generated constructor stub
    }public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}@Overridepublic String toString() {return "ProdCategory [id=" + id + ", cname=" + cname + "]";}
}
ProdCategory

封装商品的的bean

package cn.bingou.domain;/*** 商品的bean* @author 吹静静**/
public class Prod {private int id;private String name;private double price;private int cid;private String cname;//商品名称private int pnum;private String imgurl;private String description;public Prod(){}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public int getCid() {return cid;}public void setCid(int cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public int getPnum() {return pnum;}public void setPnum(int pnum) {this.pnum = pnum;}public String getImgurl() {return imgurl;}public void setImgurl(String imgurl) {this.imgurl = imgurl;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}@Overridepublic String toString() {return "Prod [id=" + id + ", name=" + name + ", price=" + price+ ", cid=" + cid + ", cname=" + cname + ", pnum=" + pnum+ ", imgurl=" + imgurl + ", description=" + description + "]";}}
Prod

商品用例的web层

web层主要包括一些表单验证代码,文件上传的代码。

package cn.bingou.backend.web;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import cn.bingou.domain.Prod;
import cn.bingou.factory.BaseFactory;
import cn.bingou.service.ProdService;public class ManageAddProdServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 获取ServletContext对象ServletContext sc = this.getServletContext();String encode = sc.getInitParameter("encode");// 声明临时文件夹和上传文件夹的相对路径String tempPath="/WEB-INF/temp";String uploadPath="/WEB-INF/upload";// 声明一个用于保存普通表单项数据的map集合Map<String,String> pMap = new HashMap<String,String>();// 声明一个变量,保存商品的实际urlString imgurl = null;// 1.接收表单请求// 2.表单验证// 借助commons-fileupload.jarDiskFileItemFactory factory=new DiskFileItemFactory(1024*1024,new File(sc.getRealPath(tempPath)));ServletFileUpload fileUpload=new ServletFileUpload(factory);if(!fileUpload.isMultipartContent(req)){throw new RuntimeException("请使用正确的文件上传表单");}// 设置单个文件的大小fileUpload.setFileSizeMax(1024*1024); // 10KB// 设置一次上传的文件的总大小fileUpload.setFileSizeMax(1024*1024); // 1MB// 解决上传文件名乱码问题
        fileUpload.setHeaderEncoding(encode);try{// 解析请求@SuppressWarnings("unchecked")List<FileItem> list = fileUpload.parseRequest(req);if(list != null){for(FileItem fileItem:list){if(fileItem.isFormField()){// 普通表单String name = fileItem.getFieldName();String value = fileItem.getString(encode);// 将普通表单项数据添加到pMap集合中
                        pMap.put(name, value);}else{// 3.将上传图片保存到相应位置// 文件上传项String filename = fileItem.getName();// 解决IE浏览器的BUGif(filename.contains("\\")){filename = filename.substring(filename.lastIndexOf("\\")+1);}// 文件名重复问题filename = UUID.randomUUID().toString()+"_"+filename;// 文件路径问题String hexStr = Integer.toHexString(filename.hashCode());// 不足8位while(hexStr.length()<8){hexStr = "0" + hexStr;}// 拆分成路径String midPath = "/";for(int i=0; i<hexStr.length(); i++){midPath += hexStr.charAt(i)+"/";}// /WEB-INF/upload/a/b/c/d/1/2/3/4/1231231.jpgimgurl = uploadPath + midPath + filename;// 生成目录// d:/web/workspace/easymall/webroot/....uploadPath = sc.getRealPath(uploadPath + midPath);new File(uploadPath).mkdirs();// 将文件保存到目标目录InputStream is = fileItem.getInputStream();FileOutputStream fos = null;try{fos = new FileOutputStream(uploadPath + "/" + filename);byte[] array = new byte[1024];int len = is.read(array);while(len != -1){fos.write(array,0,len);len = is.read(array);}}catch (Exception e) {e.printStackTrace();throw new RuntimeException("商品图片上传失败");}finally{is.close();fos.close();// 删除临时文件
                            fileItem.delete();}}}}}catch (FileUploadException e) {e.printStackTrace();}// 4.调用Service执行逻辑ProdService service = BaseFactory.getFactory().getInstance(ProdService.class);// 创建一个JavaBean, 封装本次表单提交的商品信息Prod prod = new Prod();// 从pMap中获取普通表单项数据,添加到prod对象中prod.setName(pMap.get("name"));prod.setPrice(Double.parseDouble(pMap.get("price")));prod.setCname(pMap.get("cname"));prod.setPnum(Integer.parseInt(pMap.get("pnum")));// 保存商品图片的url,相对于当前应用的路径
        prod.setImgurl(imgurl);prod.setDescription(pMap.get("description"));System.out.println(prod);boolean flag = service.addProd(prod);// 5.根据执行的结果转发对应的视图if(flag){// 成功:提示成功信息,定时刷新到后台首页resp.getWriter().write("<h1 style='text-align:center;color:red'>商品添加成功,3秒后自动跳转首页</h1>");resp.setHeader("refresh", "3;url="+req.getContextPath()+"/backend/_right.jsp");}else{//2)失败:添加错误提示信息,转发添加商品页面req.setAttribute("errMsg", "商品添加失败");req.getRequestDispatcher("/backend/manageAddProd.jsp").forward(req, resp);}    }public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req, resp);}
}
ManageAddProdServlet

文件上传的解决方案

上传地址:/WEB-INF/upload......

上传文件夹过大问题:16进制问文件夹

        // 2.表单验证// 借助commons-fileupload.jarDiskFileItemFactory factory=new DiskFileItemFactory(1024*1024,new File(sc.getRealPath(tempPath)));ServletFileUpload fileUpload=new ServletFileUpload(factory);if(!fileUpload.isMultipartContent(req)){throw new RuntimeException("请使用正确的文件上传表单");}

fileUpload.isMultipartContent(req)用于判断是普通表单,还是带文件上传的表单。
  在 fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象;

FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求(即被包装之后的 HttpServletRequest 对象)出来,

即分离出具体的文本表单和上传文件;而 ServletFileUpload 对象的创建需要依赖于 FileItemFactory 工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。

商品用例的service层

package cn.bingou.service;import cn.bingou.domain.Prod;public interface ProdService {/*** 添加商品的方法* @param prod 封装了商品信息的Bean* @return true-添加成功 false-添加失败*/boolean addProd(Prod prod);
}
ProdService
package cn.bingou.service;import cn.bingou.dao.ProdDao;
import cn.bingou.domain.Prod;
import cn.bingou.domain.ProdCategory;
import cn.bingou.exception.MsgException;
import cn.bingou.factory.BaseFactory;public class ProdServiceImpl implements ProdService {private ProdDao dao = BaseFactory.getFactory().getInstance(ProdDao.class);@Overridepublic boolean addProd(Prod prod) {// 查询数据库,确认是否已经存在该商品种类int cid = -1;try {cid = dao.getCidByCname(prod.getCname());} catch (MsgException e) {e.printStackTrace();return false;}// 如果没有这个商品种类if(cid == -1){// 创建ProdCategory对象,封装要添加的数据ProdCategory pc = new ProdCategory();pc.setCname(prod.getCname());// 1)先添加这个商品种类boolean flag = dao.insertPC(pc);if(flag == false){ // 添加商品失败return false;}// 2)再次查询cid,获取数据库中最新生成的cidtry {cid = dao.getCidByCname(prod.getCname());} catch (MsgException e) {e.printStackTrace();return false;}}// 将查询到的cid添加到prod对象中
        prod.setCid(cid);// 添加商品boolean flag = dao.insertProd(prod);return flag;}
}
ProdServiceImpl

 

商品用例的dao层

package cn.bingou.dao;import cn.bingou.domain.Prod;
import cn.bingou.domain.ProdCategory;
import cn.bingou.exception.MsgException;public interface ProdDao {/*** 根据商品种类名称查询商品种类id的方法* @param cname 商品种类名称* @return 商品种类的id 或 -1* @throws 封装了自定义消息的异常对象*/int getCidByCname(String cname) throws MsgException;/*** 添加商品种类的方法* @param pc 封装了商品种类信息的JavaBean* @return true-添加成功 false-添加失败*/boolean insertPC(ProdCategory pc);/*** 添加商品信息的方法* @param prod 封装了商品信息的JavaBean* @return true-添加成功 false-添加失败*/boolean insertProd(Prod prod);
}
ProdDao
package cn.bingou.dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;import cn.bingou.domain.Prod;
import cn.bingou.domain.ProdCategory;
import cn.bingou.exception.MsgException;
import cn.bingou.util.JDBCUtils;public class ProdDaoImpl implements ProdDao {@Overridepublic int getCidByCname(String cname) throws MsgException {String sql="select id from prod_category where cname=?";Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;try {conn=JDBCUtils.getConnection();ps=conn.prepareStatement(sql);ps.setString(1, cname);rs=ps.executeQuery();if(rs.next()){// 说明存在该条商品种类记录return rs.getInt("id");}} catch (Exception e) {e.printStackTrace();throw new MsgException("查询商品种类时出现异常");}finally{JDBCUtils.close(conn, ps, rs);}return -1;}@Overridepublic boolean insertPC(ProdCategory pc) {String sql="insert into prod_category values(null,?)";Connection conn=null;PreparedStatement ps=null;try {conn=JDBCUtils.getConnection();ps=conn.prepareStatement(sql);ps.setString(1, pc.getCname());int i=ps.executeUpdate();if(i>0){return true;}} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.close(conn, ps, null);}return false;}@Overridepublic boolean insertProd(Prod prod) {String sql="insert into prod values(null,?,?,?,?,?,?)";Connection conn=null;PreparedStatement ps=null;try {conn=JDBCUtils.getConnection();ps=conn.prepareStatement(sql);ps.setString(1, prod.getName());ps.setDouble(2, prod.getPrice());ps.setInt(3, prod.getCid());ps.setInt(4, prod.getPnum());ps.setString(5, prod.getImgurl());ps.setString(6, prod.getDescription());int i=ps.executeUpdate();if(i>0){return true;}} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.close(conn, ps, null);}return false;}
}
ProdDaoImpl

 

需要导入的jar包

config.properties配置文件

UserDao=cn.bingou.dao.UserDaoImpl
UserService=cn.bingou.service.UserServiceImpl
ProdService=cn.bingou.service.ProdServiceImpl
ProdDao=cn.bingou.dao.ProdDaoImpl

遇到的BUG

1.properties配置文件和代码里面的调用不一致

2.该了web层代码包名后要修改web.xml配置文件的配置

 

转载于:https://www.cnblogs.com/chuijingjing/p/9873942.html


http://chatgpt.dhexx.cn/article/cRUSRkoB.shtml

相关文章

二十三、商城 - 商品录入-新增商品(11)

目录 &#x1f33b;&#x1f33b; 一、商品录入【选择商品分类】1.1 需求分析1.2 准备工作1.3 代码实现1.3.1 一级分类下拉选择框1.3.2 二级分类下拉选择框1.3.3 三级分类下拉选择框1.3.4 读取模板ID 二、商品录入【品牌选择】2.1 需求分析2.2 代码实现 三、商品录入【扩展属性…

java添加功能_商品添加功能的实现

返回的结果&#xff1a; package com.taotao.common.utils; import java.util.List; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; /** * 淘淘商城自定义响应结构 */ public class TaotaoResult { // 定义jackson对象…

把商品添加到购物车的方法

因为抢华为荣耀的缘故&#xff0c;研究了下京东添加商品到购物车的方法&#xff0c;具体步骤如下 一&#xff1a;打开商品页面&#xff0c;找到商品的id 例如这个商品的id就是1056970 二&#xff1a;把链接里面的http://gate.jd.com/InitCart.aspx?pid###&pcount1&pt…

php 商品模块添加商品属性,添加新商品

进入添加商品页后&#xff0c;如图1&#xff0c;2 添加新商品 图1 图2 促销价格前台表现 图3 图4 图5 附加价格前台表现 图6 添加新商品 图7 配件和关联商品前台表现形式 图8 图9 通用信息商品分类&#xff1a;商品分类是必填项&#xff0c;用于帮助客户找到需要的商品。如果您…

添加商品

添加商品 步骤分析: 1.在index.jsp添加一个超链接 跳转到add.jsp 2.add.jsp放入一个表单 3.表单提交到 AddProductServlet 封装数据 调用service完成保存操作 跳转到FindAllServlet (请求转发和重定向) 有表单使用的时候若使用请求转发会出现重复提交 方案1:重定向 …

十七、商品添加

&#xff08;1&#xff09;通过编程式导航跳转到商品添加页面 1. 在List.vue页面。点击添加商品&#xff0c;实现页面跳转 2. 创建商品添加组件Add.vue 3. 为Add组件添加路由 &#xff08;2&#xff09; 渲染添加页面的基本UI结构 使用到Alter警告和Steps 步骤条组件 1. 引入…

(三十)商品管理-添加商品(上传图片)

&#xff08;三十&#xff09;商品管理-添加商品(上传图片) 添加商品(上传图片)1.修改页面上添加连接/store/adminProduct?methodaddUI2.在addUI请求转发到 添加页面3.在表单页面上修改action : /store/addProductServlet提交方式: method"post"添加enctype属性: e…

【VUE项目实战】56、商品添加功能(六)-提交添加的商品

接上篇《55、商品添加功能&#xff08;五&#xff09;-商品内容模块》 上一篇我们完成了商品内容编辑模块的开发&#xff0c;也即是完成了商品所有的信息编辑&#xff0c;本篇我们就来开发提交商品所有信息到后台的功能。 一、要实现的效果 我们要实现点击“添加商品”的按钮…

淘淘商城第30讲——实现商品添加功能

经过上文的学习&#xff0c;我相信大家都应该知道了富文本编辑器的使用方法&#xff0c;我们能走到这步&#xff0c;实属不易&#xff0c;本文终于可以来实现商品添加这个功能了。 在item-add.jsp页面当中&#xff0c;当点击提交按钮后&#xff0c;会触发submitForm方法&#…

密码登录

利用idea实现密码的输入 首先我们要先新建一个页面用于输入账号密码 req.setCharacterEncoding("UTF-8");String LoginNamereq.getParameter("LoginName");String LoginPwdreq.getParameter("LoginPwd");String msg"请输入密码";priva…

SQL Server安全:登录和用户

SQL Server安全&#xff1a;登录和用户 前言 建议配合sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系一起看。 授予 Principal &#xff08;安全主体&#xff09;操作 Securable&#xff08;安全对象&#xff09; 的 Permission&#xff08;权限&…

springboot-security安全登录

一个简单的security安全登录示例 配置环境 添加pom依赖坐标 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version></parent><depe…

如何设计一个安全的登录接口?

Java技术栈 www.javastack.cn 关注阅读更多优质文章 作者&#xff1a;哒哒哒哒打代码链接&#xff1a;juejin.im/post/6859214952704999438 前言 大家学写程序时&#xff0c;第一行代码都是hello world。 但是当你开始学习WEB后台技术时&#xff0c;很多人的第一个功能就是写的…

[OS-Linux] CentOS 7.x 安全登录策略设置

简介 之前用用户名和密码登陆服务器 这样不安全 &#xff0c;用SSH公钥(public key)验证 这个办法能很好的解决 登陆服务器 和安全登陆服务器的特点&#xff1a; 方法 / 步骤 &#x1f510; 一: 证书生成 命令行页面生成 (推荐) 查看执行结果&#xff0c;这时候连续回车即可…

开启QQ登录保护仍被盗号——QQ安全机制全面分析

1、前言 周围总是有些同学QQ被盗号&#xff0c;攻击者盗取账号后会继续去欺骗列表里的好友&#xff0c;形成链式反应。危害比较大。 腾讯QQ安全中心提供了登录保护机制&#xff0c;如图&#xff1a; 这是腾讯为QQ添加第二层保护&#xff0c;在开启登录保护后&#xff0c;盗号者…

使用 PHP 和 MySQL 的安全登录系统

Secure Login System with PHP and MySQL 在本教程中&#xff0c;我将教您如何创建自己的安全 PHP 登录系统。登录表单是您网站的访问者可以用来登录您的网站以访问受限内容&#xff08;例如个人资料页面&#xff09;的表单。我们将利用 MySQL 从数据库中检索帐户数据。 高级…

使用腾讯企业邮箱为什么强烈建议启用安全登录?怎么启用?

腾讯企业邮箱开启安全登录&#xff0c;简单来说就是把企业邮箱账号和微信绑定。启用安全登录和关闭安全登录&#xff0c;主要是登录方式发生了变化。 登录方式&#xff1a; 登录启用前启用后网页端邮箱帐号密码登录/微信扫码登录仅支持微信扫码登录客户端邮箱帐号密码登录仅…

登录安全----双重MD5加密实现安全登录

个人简介&#xff1a; &#x1f4e6;个人主页&#xff1a;肇事司机赵四 &#x1f3c6;学习方向&#xff1a;JAVA后端开发 &#x1f4e3;种一棵树最好的时间是十年前&#xff0c;其次是现在&#xff01; &#x1f9e1;喜欢的话麻烦点点关注喔&#xff0c;你们的支持是我的最大动…

http登录模块加密登录安全登录方法

http请求很容易被截获&#xff0c;在写登录模块时&#xff0c;直接使用明文密码请求&#xff0c;很容易明文密码泄露&#xff1b;若在js页面对密码进行一次加密后在传输&#xff0c;虽不是明文密码&#xff0c;但也完全可以截获加密后的暗文&#xff0c;伪造http请求进行登录。…

安全登录认证

用户登录是任何一个应用系统的基本功能&#xff0c;特别是对于网上银行系统来说&#xff0c;用户登录的安全性尤为重要。如何设计一个网站的安全登录认证程序&#xff0c;是本文主要讨论的问题。 静态密码存在着比较多的安全隐患&#xff0c;攻击者有很多手段获得静态密码&…