商品管理模块的分类关联与文件上传实现
商品管理功能涉及核心数据模型与多层业务逻辑处理,以下为关键实现细节。 数据模型定义 商品类别实体类采用标准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