当前位置:首页 > 技术 > 正文内容

商品管理模块的分类关联与文件上传实现

访客 技术 2026年8月10日 1

商品管理功能涉及核心数据模型与多层业务逻辑处理,以下为关键实现细节。 数据模型定义 商品类别实体类采用标准JavaBean规范:

package com.example.domain;

public class ProductCategory {
    private int categoryId;
    private String categoryName;
    
    public int getCategoryId() { return categoryId; }
    public void setCategoryId(int id) { this.categoryId = id; }
    public String getCategoryName() { return categoryName; }
    public void setCategoryName(String name) { this.categoryName = name; }
    
    @Override
    public String toString() {
        return "Category [id=" + categoryId + ", name=" + categoryName + "]";
    }
}

商品主实体类包含完整业务属性:

package com.example.domain;

public class Product {
    private int productId;
    private String productName;
    private double unitPrice;
    private int categoryCode;
    private String categoryName;
    private int stockQuantity;
    private String imageUrl;
    private String description;
    
    // 省略getter/setter及toString方法
}

文件上传处理逻辑 Web层实现文件上传与表单验证,采用Apache Commons FileUpload组件:

package com.example.controller;

import org.apache.commons.fileupload.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class ProductUploadHandler extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 配置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 1024, new File(getServletContext().getRealPath("/temp")));
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setFileSizeMax(1024 * 1024); // 单文件1MB
        upload.setHeaderEncoding("UTF-8");
        
        // 解析表单
        Map<String, String> formData = new HashMap<>();
        String fileSavePath = null;
        
        try {
            List<FileItem> items = upload.parseRequest(req);
            for (FileItem item : items) {
                if (item.isFormField()) {
                    formData.put(item.getFieldName(), item.getString("UTF-8"));
                } else {
                    // 生成安全文件名
                    String originalName = item.getName();
                    String safeName = UUID.randomUUID().toString() + "_" + 
                                     originalName.substring(originalName.lastIndexOf('.') + 1);
                    
                    // 创建存储路径
                    String storagePath = getServletContext().getRealPath("/uploads") + 
                                        File.separator + safeName;
                    new File(storagePath).getParentFile().mkdirs();
                    
                    // 保存文件
                    item.write(new File(storagePath));
                    fileSavePath = "/uploads/" + safeName;
                }
            }
        } catch (FileUploadException e) {
            throw new ServletException("文件上传失败", e);
        }
        
        // 业务处理
        Product product = new Product();
        product.setProductName(formData.get("productName"));
        product.setUnitPrice(Double.parseDouble(formData.get("price")));
        product.setCategoryName(formData.get("categoryName"));
        product.setImageUrl(fileSavePath);
        // ...其他属性设置
        
        ProductService service = ServiceFactory.getInstance(ProductService.class);
        boolean success = service.addProduct(product);
        resp.getWriter().write(success ? "添加成功" : "添加失败");
    }
}

业务逻辑处理 服务层实现商品与类别的关联管理:

package com.example.service;

public class ProductService {
    private ProductDao productDao;
    
    public boolean addProduct(Product product) {
        int categoryId = productDao.getCategoryId(product.getCategoryName());
        if (categoryId == -1) {
            categoryId = productDao.createCategory(product.getCategoryName());
        }
        product.setCategoryCode(categoryId);
        return productDao.saveProduct(product);
    }
}

数据访问层实现 DAO层使用JDBC执行数据库操作:

package com.example.dao;

public class ProductDaoImpl implements ProductDao {
    @Override
    public int getCategoryId(String name) {
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT id FROM categories WHERE name = ?")) {
            ps.setString(1, name);
            try (ResultSet rs = ps.executeQuery()) {
                return rs.next() ? rs.getInt(1) : -1;
            }
        } catch (SQLException e) {
            throw new DataAccessException("查询类别失败", e);
        }
    }
    
    @Override
    public boolean saveProduct(Product product) {
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement ps = conn.prepareStatement(
                 "INSERT INTO products (name, price, category_id, stock, image_url, desc) VALUES (?, ?, ?, ?, ?, ?)")) {
            ps.setString(1, product.getProductName());
            ps.setDouble(2, product.getUnitPrice());
            ps.setInt(3, product.getCategoryCode());
            ps.setInt(4, product.getStockQuantity());
            ps.setString(5, product.getImageUrl());
            ps.setString(6, product.getDescription());
            return ps.executeUpdate() > 0;
        } catch (SQLException e) {
            throw new DataAccessException("保存商品失败", e);
        }
    }
}

配置文件示例:

ProductService=com.example.service.ProductServiceImpl
ProductDao=com.example.dao.ProductDaoImpl
标签: Java

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。