训练ai做题
000.软件工程课前测试试卷+(1).doc
DOC 36.5KB
先阅读此文档,并分析
文档分析:
该文档是2023级《软件工程》课程的课前测试试卷,要求学生在180分钟内完成一个仓储管理系统的原型设计。试卷分为两部分:数据库设计和功能需求,总分为40分,占课程过程考核的20%。
- 需求描述:
系统需要支持多个仓库的设立,并统一管理物资台账。
物资台账包含物资编码、物资名称、规格、材质、供应商、品牌、物资分类等信息,用户可以自定义物资分类。
不同的物资名称、规格、材质的物资不能有相同的物资编码。
仓库人员可以进行入库和出库操作,入库单和出库单的编码由系统自动生成(采用年月日+流水号的方式)。
系统需要支持按物资编码查询库存信息、按物资分类汇总库存信息、查询入库单和出库单信息。
- 数据库设计(5分):
仓库表:每个仓库具有唯一编码。
物资台账明细表:包含台账编号(唯一标识,格式为四位年两位月两位日+顺序号)、操作类别(入库或出库)、数量、计量单位、存放地点(仓库号)等。
物资类别表:确保不同的物资名称、规格、材质的物资不能有相同的物资编码。
- 功能需求:
页面要求:
采用统一风格的WEB管理系统模板(5分)。
管理员和仓库管理人员通过统一登录界面登录后,显示不同的菜单项(5分)。
管理员功能(12分):
新增、删除、修改仓库信息。
新增、删除、修改物资类别信息。
仓库管理人员功能(13分):
入库操作:生成台账明细记录,确保相同物资存放在同一仓库。
出库操作:选择物资类别,显示库存余额,出库数量不能大于库存余额。
统计查询:按物资编码查询库存信息,查看详细入库单和出库单信息。
- 评分标准:
页面设计:采用统一模板得5分,否则0分。
用户登录界面:实现不同用户登录界面得5分。
总分:满分为40分。
分析总结:
数据库设计:
需要设计三个表:仓库表、物资台账明细表、物资类别表。
物资台账明细表的设计较为复杂,需要包含操作类别、数量、计量单位、存放地点等信息,且台账编号需要自动生成。
功能需求:
管理员功能:主要涉及仓库和物资类别的增删改操作,需要注意验证条件(如仓库是否有物资存储、物资类别是否唯一等)。
仓库管理人员功能:涉及入库、出库和查询操作,入库和出库时需要生成台账明细记录,且出库时需验证库存余额。
页面设计:
需要采用统一的WEB模板,且管理员和仓库管理人员登录后显示不同的菜单项。
评分标准:
页面设计和用户登录界面的实现是关键得分点,分别占5分。
功能实现部分占比较大,管理员功能和仓库管理人员功能分别占12分和13分。
建议:
数据库设计:
确保物资台账明细表的台账编号自动生成逻辑正确(年月日+流水号)。
物资类别表的设计要确保物资编码的唯一性,避免重复。
功能实现:
管理员功能中,删除和修改操作需要增加验证逻辑,确保仓库或物资类别没有被使用。
仓库管理人员功能中,入库和出库操作需要生成台账明细记录,且出库时需验证库存余额。
页面设计:
采用统一的WEB模板,确保界面风格一致。
实现不同用户登录后显示不同的菜单项,确保权限控制。
时间管理:
180分钟内完成设计,建议先完成数据库设计和核心功能实现,页面设计可以在最后进行优化。
先解决仓库管理人员功能,给出一个数据库,包括管理员和员工
数据库设计(包含管理员和仓库管理人员功能)
为了支持管理员和仓库管理人员的功能需求,数据库需要设计以下几个表:
用户表(User):用于存储管理员和仓库管理人员的信息。
仓库表(Warehouse):用于存储仓库的基本信息。
物资类别表(MaterialCategory):用于存储物资类别的信息。
物资台账明细表(MaterialLedger):用于存储物资的入库和出库记录。
物资库存表(MaterialStock):用于存储每个仓库中物资的库存信息。
- 用户表(User)
用于存储管理员和仓库管理人员的信息,区分用户角色。
字段名 数据类型 说明
user_id INT 用户ID,主键,自增
username VARCHAR(50) 用户名,唯一
password VARCHAR(255) 用户密码(加密存储)
role ENUM('admin', 'staff') 用户角色(管理员或仓库管理人员)
created_at DATETIME 用户创建时间
2. 仓库表(Warehouse)
用于存储仓库的基本信息。
字段名 数据类型 说明
warehouse_id INT 仓库ID,主键,自增
warehouse_code VARCHAR(20) 仓库编码,唯一
warehouse_name VARCHAR(100) 仓库名称
location VARCHAR(255) 仓库地址
created_at DATETIME 仓库创建时间
updated_at DATETIME 仓库信息更新时间
3. 物资类别表(MaterialCategory)
用于存储物资类别的信息,确保物资编码唯一。
字段名 数据类型 说明
category_id INT 物资类别ID,主键,自增
category_code VARCHAR(50) 物资类别编码,唯一
category_name VARCHAR(100) 物资类别名称
material_name VARCHAR(100) 物资名称
specification VARCHAR(100) 规格
material_type VARCHAR(100) 材质
supplier VARCHAR(100) 供应商
brand VARCHAR(100) 品牌
created_at DATETIME 物资类别创建时间
updated_at DATETIME 物资类别更新时间
4. 物资台账明细表(MaterialLedger)
用于存储物资的入库和出库记录。
字段名 数据类型 说明
ledger_id INT 台账ID,主键,自增
ledger_code VARCHAR(20) 台账编号(年月日+流水号)
category_id INT 物资类别ID,外键
warehouse_id INT 仓库ID,外键
operation_type ENUM('in', 'out') 操作类型(入库或出库)
quantity INT 数量
unit VARCHAR(50) 计量单位
operation_time DATETIME 操作时间
created_at DATETIME 记录创建时间
5. 物资库存表(MaterialStock)
用于存储每个仓库中物资的库存信息。
字段名 数据类型 说明
stock_id INT 库存ID,主键,自增
category_id INT 物资类别ID,外键
warehouse_id INT 仓库ID,外键
quantity INT 库存数量
updated_at DATETIME 库存更新时间
数据库关系图:
用户表(User):
用户分为管理员(admin)和仓库管理人员(staff),通过role字段区分。
仓库表(Warehouse):
每个仓库有唯一的warehouse_code,管理员可以新增、删除、修改仓库信息。
物资类别表(MaterialCategory):
每个物资类别有唯一的category_code,管理员可以新增、删除、修改物资类别信息。
物资台账明细表(MaterialLedger):
记录每次入库和出库操作,category_id和warehouse_id分别关联物资类别表和仓库表。
物资库存表(MaterialStock):
记录每个仓库中每种物资的库存数量,category_id和warehouse_id分别关联物资类别表和仓库表。
功能实现说明:
- 管理员功能:
新增仓库:向Warehouse表插入新记录。
删除仓库:删除Warehouse表中的记录,需验证MaterialStock表中是否有该仓库的库存记录。
修改仓库:修改Warehouse表中的记录,需验证MaterialStock表中是否有该仓库的库存记录。
新增物资类别:向MaterialCategory表插入新记录,需验证category_code唯一。
删除物资类别:删除MaterialCategory表中的记录,需验证MaterialLedger表中是否有该物资类别的记录。
修改物资类别:修改MaterialCategory表中的记录,需验证MaterialLedger表中是否有该物资类别的记录。
- 仓库管理人员功能:
入库操作:
向MaterialLedger表插入一条入库记录。
更新MaterialStock表中对应物资的库存数量。
出库操作:
向MaterialLedger表插入一条出库记录。
更新MaterialStock表中对应物资的库存数量,需验证库存余额。
统计查询:
查询MaterialStock表,显示物资的库存信息。
查询MaterialLedger表,显示详细的入库单和出库单信息。
总结:
该数据库设计支持管理员和仓库管理人员的功能需求,管理员可以管理仓库和物资类别,仓库管理人员可以进行入库、出库和查询操作。通过MaterialLedger表和MaterialStock表,系统能够准确记录物资的流动情况,并实时更新库存信息。
先分析单个仓库表
单个仓库表(Warehouse)分析
- 表结构设计:
字段名 数据类型 说明
warehouse_id INT 仓库ID,主键,自增
warehouse_code VARCHAR(20) 仓库编码,唯一
warehouse_name VARCHAR(100) 仓库名称
location VARCHAR(255) 仓库地址
created_at DATETIME 仓库创建时间
updated_at DATETIME 仓库信息更新时间 - 字段详细说明:
warehouse_id:
数据类型:INT
说明:仓库的唯一标识,主键,自增。
作用:用于唯一标识每个仓库,其他表(如MaterialStock、MaterialLedger)可以通过warehouse_id关联到该仓库。
warehouse_code:
数据类型:VARCHAR(20)
说明:仓库编码,唯一。
作用:用于业务系统中标识仓库,通常由系统生成或用户输入,确保唯一性。
warehouse_name:
数据类型:VARCHAR(100)
说明:仓库名称。
作用:用于显示仓库的名称,便于用户识别。
location:
数据类型:VARCHAR(255)
说明:仓库地址。
作用:记录仓库的具体位置,便于管理和查询。
created_at:
数据类型:DATETIME
说明:仓库创建时间。
作用:记录仓库的创建时间,便于跟踪仓库的生命周期。
updated_at:
数据类型:DATETIME
说明:仓库信息更新时间。
作用:记录仓库信息的最后更新时间,便于跟踪仓库信息的变更。
- 表的功能需求:
支持多个仓库:
系统需要支持多个仓库的管理,因此每个仓库需要有唯一的标识(warehouse_id和warehouse_code)。
管理员可以新增、删除、修改仓库信息。
仓库编码唯一性:
warehouse_code必须唯一,确保每个仓库在系统中有一个唯一的标识。
在新增仓库时,需要验证warehouse_code是否已经存在。
仓库信息的增删改:
新增仓库:向Warehouse表插入新记录。
删除仓库:删除Warehouse表中的记录,需验证该仓库是否被其他表(如MaterialStock)引用。
修改仓库:修改Warehouse表中的记录,需验证该仓库是否被其他表引用。
仓库地址管理:
location字段用于记录仓库的具体地址,便于管理和查询。
- 表的约束和验证:
主键约束:
warehouse_id是主键,确保每个仓库有唯一的标识。
唯一性约束:
warehouse_code必须唯一,确保每个仓库在系统中有一个唯一的编码。
外键约束:
warehouse_id会被其他表(如MaterialStock、MaterialLedger)引用,因此在删除或修改仓库时,需要验证是否有其他表引用了该仓库。
非空约束:
warehouse_code、warehouse_name、location等字段不能为空,确保仓库信息的完整性。
- 表的业务逻辑:
新增仓库:
管理员输入仓库编码、仓库名称、仓库地址等信息。
系统验证warehouse_code是否唯一。
如果验证通过,向Warehouse表插入新记录。
删除仓库:
管理员选择要删除的仓库。
系统验证该仓库是否被MaterialStock表引用(即是否有物资存储在该仓库中)。
如果没有引用,删除该仓库记录;否则提示用户不允许删除。
修改仓库:
管理员选择要修改的仓库。
系统验证该仓库是否被MaterialStock表引用。
如果没有引用,允许修改仓库信息;否则提示用户不允许修改。
查询仓库:
管理员或仓库管理人员可以查询仓库的基本信息,包括仓库编码、名称、地址等。
- 示例SQL语句:
创建仓库表:
sql
复制
CREATE TABLE Warehouse (
warehouse_id INT AUTO_INCREMENT PRIMARY KEY,
warehouse_code VARCHAR(20) UNIQUE NOT NULL,
warehouse_name VARCHAR(100) NOT NULL,
location VARCHAR(255) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
新增仓库:
sql
复制
INSERT INTO Warehouse (warehouse_code, warehouse_name, location)
VALUES ('WH001', 'Main Warehouse', '123 Main St, City, Country');
删除仓库:
sql
复制
DELETE FROM Warehouse WHERE warehouse_id = 1;
修改仓库:
sql
复制
UPDATE Warehouse
SET warehouse_name = 'Updated Warehouse Name', location = '456 New St, City, Country'
WHERE warehouse_id = 1;
查询仓库:
sql
复制
SELECT * FROM Warehouse WHERE warehouse_code = 'WH001';
7. 总结:
仓库表(Warehouse)是仓储管理系统的核心表之一,用于存储仓库的基本信息。
该表支持多个仓库的管理,每个仓库有唯一的编码和ID。
通过warehouse_id,其他表(如MaterialStock、MaterialLedger)可以关联到具体的仓库。
管理员可以新增、删除、修改仓库信息,系统需要验证仓库是否被引用,确保数据的完整性。
用Javaweb与此连接,连接数据库
要用Java Web连接数据库并操作仓库表(Warehouse),通常需要以下步骤:
准备数据库:确保数据库已经创建,并且仓库表(Warehouse)已经定义。
配置数据库连接:使用JDBC连接数据库。
创建Java Web项目:使用Servlet和JSP实现前后端交互。
编写DAO层:用于与数据库交互,执行增删改查操作。
编写Service层:处理业务逻辑。
编写Servlet:处理HTTP请求,调用Service层。
编写JSP页面:用于展示数据和接收用户输入。
以下是详细的实现步骤和代码示例:
- 准备数据库
假设你已经创建了数据库warehouse_db,并且仓库表Warehouse已经定义,表结构如下:
sql
复制
CREATE TABLE Warehouse (
warehouse_id INT AUTO_INCREMENT PRIMARY KEY,
warehouse_code VARCHAR(20) UNIQUE NOT NULL,
warehouse_name VARCHAR(100) NOT NULL,
location VARCHAR(255) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
2. 配置数据库连接
使用JDBC连接MySQL数据库。首先,确保你已经添加了MySQL的JDBC驱动依赖(如mysql-connector-java)。
Maven依赖:
xml
复制
运行 HTML
数据库连接工具类(DBUtil.java):
java
复制
package com.warehouse.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/warehouse_db?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "your_password";
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
3. 创建Java Web项目
使用Eclipse、IntelliJ IDEA或其他IDE创建一个Java Web项目,并配置好Tomcat服务器。
- 编写DAO层
DAO(Data Access Object)层用于与数据库交互。以下是WarehouseDAO的实现:
java
复制
package com.warehouse.dao;
import com.warehouse.model.Warehouse;
import com.warehouse.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class WarehouseDAO {
// 新增仓库
public void addWarehouse(Warehouse warehouse) throws SQLException {
String sql = "INSERT INTO Warehouse (warehouse_code, warehouse_name, location) VALUES (?, ?, ?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, warehouse.getWarehouseCode());
stmt.setString(2, warehouse.getWarehouseName());
stmt.setString(3, warehouse.getLocation());
stmt.executeUpdate();
}
}
// 查询所有仓库
public List<Warehouse> getAllWarehouses() throws SQLException {
List<Warehouse> warehouses = new ArrayList<>();
String sql = "SELECT * FROM Warehouse";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
Warehouse warehouse = new Warehouse();
warehouse.setWarehouseId(rs.getInt("warehouse_id"));
warehouse.setWarehouseCode(rs.getString("warehouse_code"));
warehouse.setWarehouseName(rs.getString("warehouse_name"));
warehouse.setLocation(rs.getString("location"));
warehouses.add(warehouse);
}
}
return warehouses;
}
// 根据ID查询仓库
public Warehouse getWarehouseById(int warehouseId) throws SQLException {
String sql = "SELECT * FROM Warehouse WHERE warehouse_id = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, warehouseId);
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
Warehouse warehouse = new Warehouse();
warehouse.setWarehouseId(rs.getInt("warehouse_id"));
warehouse.setWarehouseCode(rs.getString("warehouse_code"));
warehouse.setWarehouseName(rs.getString("warehouse_name"));
warehouse.setLocation(rs.getString("location"));
return warehouse;
}
}
}
return null;
}
// 更新仓库
public void updateWarehouse(Warehouse warehouse) throws SQLException {
String sql = "UPDATE Warehouse SET warehouse_name = ?, location = ? WHERE warehouse_id = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, warehouse.getWarehouseName());
stmt.setString(2, warehouse.getLocation());
stmt.setInt(3, warehouse.getWarehouseId());
stmt.executeUpdate();
}
}
// 删除仓库
public void deleteWarehouse(int warehouseId) throws SQLException {
String sql = "DELETE FROM Warehouse WHERE warehouse_id = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, warehouseId);
stmt.executeUpdate();
}
}
}
5. 编写Service层
Service层用于处理业务逻辑。以下是WarehouseService的实现:
java
复制
package com.warehouse.service;
import com.warehouse.dao.WarehouseDAO;
import com.warehouse.model.Warehouse;
import java.sql.SQLException;
import java.util.List;
public class WarehouseService {
private WarehouseDAO warehouseDAO = new WarehouseDAO();
// 新增仓库
public void addWarehouse(Warehouse warehouse) throws SQLException {
warehouseDAO.addWarehouse(warehouse);
}
// 查询所有仓库
public List<Warehouse> getAllWarehouses() throws SQLException {
return warehouseDAO.getAllWarehouses();
}
// 根据ID查询仓库
public Warehouse getWarehouseById(int warehouseId) throws SQLException {
return warehouseDAO.getWarehouseById(warehouseId);
}
// 更新仓库
public void updateWarehouse(Warehouse warehouse) throws SQLException {
warehouseDAO.updateWarehouse(warehouse);
}
// 删除仓库
public void deleteWarehouse(int warehouseId) throws SQLException {
warehouseDAO.deleteWarehouse(warehouseId);
}
}
6. 编写Servlet
Servlet用于处理HTTP请求,并调用Service层。以下是WarehouseServlet的实现:
java
复制
package com.warehouse.servlet;
import com.warehouse.model.Warehouse;
import com.warehouse.service.WarehouseService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
@WebServlet("/warehouse")
public class WarehouseServlet extends HttpServlet {
private WarehouseService warehouseService = new WarehouseService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
try {
if (action == null) {
// 查询所有仓库
List<Warehouse> warehouses = warehouseService.getAllWarehouses();
req.setAttribute("warehouses", warehouses);
req.getRequestDispatcher("/warehouseList.jsp").forward(req, resp);
} else if (action.equals("edit")) {
// 编辑仓库
int warehouseId = Integer.parseInt(req.getParameter("id"));
Warehouse warehouse = warehouseService.getWarehouseById(warehouseId);
req.setAttribute("warehouse", warehouse);
req.getRequestDispatcher("/warehouseForm.jsp").forward(req, resp);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
try {
if (action.equals("add")) {
// 新增仓库
Warehouse warehouse = new Warehouse();
warehouse.setWarehouseCode(req.getParameter("warehouseCode"));
warehouse.setWarehouseName(req.getParameter("warehouseName"));
warehouse.setLocation(req.getParameter("location"));
warehouseService.addWarehouse(warehouse);
} else if (action.equals("update")) {
// 更新仓库
Warehouse warehouse = new Warehouse();
warehouse.setWarehouseId(Integer.parseInt(req.getParameter("warehouseId")));
warehouse.setWarehouseCode(req.getParameter("warehouseCode"));
warehouse.setWarehouseName(req.getParameter("warehouseName"));
warehouse.setLocation(req.getParameter("location"));
warehouseService.updateWarehouse(warehouse);
} else if (action.equals("delete")) {
// 删除仓库
int warehouseId = Integer.parseInt(req.getParameter("warehouseId"));
warehouseService.deleteWarehouse(warehouseId);
}
resp.sendRedirect(req.getContextPath() + "/warehouse");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
7. 编写JSP页面
warehouseList.jsp(展示仓库列表):
jsp
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
仓库列表
新增仓库仓库ID | 仓库编码 | 仓库名称 | 仓库地址 | 操作 |
---|---|---|---|---|
${warehouse.warehouseId} | ${warehouse.warehouseCode} | ${warehouse.warehouseName} | ${warehouse.location} | 编辑 删除 |
仓库表单
8. 运行项目 启动Tomcat服务器。访问http://localhost:8080/your_project_name/warehouse,即可查看仓库列表并进行增删改操作。
总结
通过以上步骤,我们实现了一个简单的Java Web应用,能够连接数据库并操作仓库表。你可以在此基础上继续扩展其他功能,如物资管理、入库出库操作等。
很好,现在添加增加功能
要为现有的Java Web项目添加增加仓库的功能,我们需要完成以下步骤:
在JSP页面中添加“新增仓库”表单。
在Servlet中处理新增仓库的请求。
在DAO层实现新增仓库的数据库操作。
以下是详细的实现步骤和代码示例:
- 在JSP页面中添加“新增仓库”表单
我们已经在warehouseList.jsp中添加了一个“新增仓库”的链接,点击该链接会跳转到warehouseForm.jsp页面。现在我们需要在warehouseForm.jsp中实现新增仓库的表单。
warehouseForm.jsp(新增仓库表单):
jsp
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
新增仓库
返回仓库列表 2. 在Servlet中处理新增仓库的请求 在WarehouseServlet中,我们已经实现了doPost方法来处理新增仓库的请求。以下是相关代码:WarehouseServlet.java(处理新增仓库请求):
java
复制
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
try {
if (action.equals("add")) {
// 新增仓库
Warehouse warehouse = new Warehouse();
warehouse.setWarehouseCode(req.getParameter("warehouseCode"));
warehouse.setWarehouseName(req.getParameter("warehouseName"));
warehouse.setLocation(req.getParameter("location"));
warehouseService.addWarehouse(warehouse); // 调用Service层新增仓库
} else if (action.equals("update")) {
// 更新仓库(已有代码)
Warehouse warehouse = new Warehouse();
warehouse.setWarehouseId(Integer.parseInt(req.getParameter("warehouseId")));
warehouse.setWarehouseCode(req.getParameter("warehouseCode"));
warehouse.setWarehouseName(req.getParameter("warehouseName"));
warehouse.setLocation(req.getParameter("location"));
warehouseService.updateWarehouse(warehouse);
} else if (action.equals("delete")) {
// 删除仓库(已有代码)
int warehouseId = Integer.parseInt(req.getParameter("warehouseId"));
warehouseService.deleteWarehouse(warehouseId);
}
// 重定向到仓库列表页面
resp.sendRedirect(req.getContextPath() + "/warehouse");
} catch (SQLException e) {
e.printStackTrace();
}
}
3. 在DAO层实现新增仓库的数据库操作
在WarehouseDAO中,我们已经实现了addWarehouse方法,用于向数据库插入新的仓库记录。以下是相关代码:
WarehouseDAO.java(新增仓库):
java
复制
// 新增仓库
public void addWarehouse(Warehouse warehouse) throws SQLException {
String sql = "INSERT INTO Warehouse (warehouse_code, warehouse_name, location) VALUES (?, ?, ?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, warehouse.getWarehouseCode());
stmt.setString(2, warehouse.getWarehouseName());
stmt.setString(3, warehouse.getLocation());
stmt.executeUpdate();
}
}
4. 测试新增功能
启动Tomcat服务器。
访问仓库列表页面:
打开浏览器,访问http://localhost:8080/your_project_name/warehouse。
点击“新增仓库”链接,跳转到新增仓库表单页面。
填写表单并提交:
在表单中填写仓库编码、仓库名称和仓库地址。
点击“提交”按钮,表单数据会发送到WarehouseServlet的doPost方法。
查看结果:
提交成功后,页面会重定向到仓库列表页面,显示新增的仓库信息。
- 完整流程
用户点击“新增仓库”链接:
用户访问warehouseList.jsp,点击“新增仓库”链接,跳转到warehouseForm.jsp。
用户填写表单并提交:
用户在warehouseForm.jsp中填写仓库编码、仓库名称和仓库地址,点击“提交”按钮。
Servlet处理请求:
WarehouseServlet的doPost方法接收到请求,判断action为add,调用WarehouseService的addWarehouse方法。
Service层调用DAO层:
WarehouseService调用WarehouseDAO的addWarehouse方法,向数据库插入新的仓库记录。
重定向到仓库列表页面:
新增成功后,Servlet重定向到warehouseList.jsp,显示更新后的仓库列表。
- 代码优化建议
表单验证:
在JSP页面或Servlet中添加表单验证,确保用户输入的仓库编码、名称和地址不为空。
可以在前端使用JavaScript进行简单的非空验证,同时在Servlet中进行后端验证。
异常处理:
在WarehouseDAO中,如果插入数据时发生异常(如仓库编码重复),应该捕获异常并返回友好的错误信息。
日志记录:
使用日志框架(如Log4j或SLF4J)记录关键操作和异常信息,便于排查问题。
- 示例:前端表单验证
在warehouseForm.jsp中添加简单的JavaScript表单验证:
jsp
复制