3月4日总结

今天又烧了一天,持续低烧,真的好难受,又在宿舍躺了一天,简单补了补作业,我恨牙疼我恨发烧。

个人作业02

利用Intelij IDEA构建一个Web项目,选择Maven,服务器为Tomcat,要求完成物资类别单的增删改查。
具体要求为:
在MySQL数据库中创建物资类别表,包含物资名称、规格、材料,需要满足不同的物资名称、规格、材质的物资不能设立相同的物资编码,随后在Intelij IDEA创建Maven的Web项目,与MySQL数据库连接,利用HTML与Servlet完成物资类别单的新增、删除、修改、查询四个功能。

AI结果生成为:

好,我现在需要按照用户的要求,使用IntelliJ IDEA构建一个Maven Web项目,连接MySQL数据库,实现物资类别单的增删改查功能。首先,我需要理清楚整个项目的结构和所需的步骤,确保每个环节都正确无误。

首先,用户提到要在MySQL中创建物资类别表,包含物资名称、规格、材料,并且不同的物资名称、规格和材质的组合不能有相同的物资编码。这里可能需要先设计数据库表的结构。物资编码应该是主键,但用户的要求是当名称、规格、材料不同时,编码不能重复。不过这里可能有点矛盾,通常主键本身就是唯一的,所以可能需要理解用户的需求是组合唯一,而不是编码本身唯一。或者用户可能希望物资编码是自动生成的,或者根据某种规则生成,确保名称、规格、材料不同的情况下编码不同。这点可能需要进一步确认,但根据常规做法,可能物资编码是主键,自动生成,而名称、规格、材料的组合需要唯一,所以应该在数据库表中为这三个字段添加唯一约束。

接下来,在IntelliJ中创建Maven Web项目。需要选择Maven archetype,比如使用maven-archetype-webapp。然后配置Tomcat服务器,确保项目能正确部署和运行。

然后需要添加MySQL的JDBC驱动依赖到pom.xml文件中,这样Maven会自动下载所需的库。同时,可能需要配置数据库连接信息,通常放在一个属性文件中,比如jdbc.properties,方便管理。

接着,创建数据库表。使用MySQL Workbench或者命令行,执行CREATE TABLE语句,定义物资类别表的结构,包括字段如id(主键)、name、specification、material,可能还有code(物资编码)。根据用户要求,name、specification、material的组合必须唯一,所以需要在这三个字段上添加唯一约束。或者可能物资编码需要由这三个字段生成?这里可能需要澄清。假设物资编码是自动生成的主键,而三个字段的组合必须唯一,那么需要在这三个字段上添加UNIQUE约束。

接下来是后端部分,使用Servlet处理HTTP请求,实现增删改查。通常每个操作对应一个Servlet,或者使用一个Servlet通过不同的action参数区分操作。然后,需要编写DAO(Data Access Object)层,处理与数据库的交互,比如增删改查的方法。

前端部分,使用HTML和可能的JSP或者简单的HTML表单,通过AJAX或者表单提交与Servlet交互。用户提到用HTML,所以可能使用静态HTML页面,通过表单提交到Servlet,然后Servlet处理请求后重定向或返回结果页面。

具体步骤可能如下:

  1. 创建数据库和表:
  • 创建数据库,比如wuzi_db。

  • 创建表material_category,字段包括id(主键自增)、code(唯一)、name、specification、material,并且name、specification、material的组合唯一。或者可能code由这三个字段生成,但需要确保唯一。或者code是主键,而这三个字段的组合唯一?需要明确用户的需求。例如,用户可能要求物资编码必须唯一,且不能有相同的名称、规格、材料组合,即使编码不同。或者,当新增时,如果名称、规格、材料已存在,则不允许新增,此时需要在数据库中为这三个字段添加唯一约束。

比如,表结构可能如下:

CREATE TABLE material_category (

id INT PRIMARY KEY AUTO_INCREMENT,

code VARCHAR(50) UNIQUE,

name VARCHAR(100) NOT NULL,

specification VARCHAR(100),

material VARCHAR(100),

UNIQUE KEY unique_combo (name, specification, material)

);

这里code是唯一的,同时name、specification、material的组合也是唯一的。或者可能code是根据这三个字段生成的,比如某种哈希或组合,但这样的话code可能不需要用户输入,而是自动生成。但用户的问题中提到“物资编码”,可能需要用户输入,但需要确保当这三个字段不同时,编码不能重复。这可能需要进一步分析。

可能用户的意思是,物资编码是主键,但不同的名称、规格、材料不能有相同的编码。这可能需要应用层逻辑来检查,或者在数据库中将这三个字段设为唯一,同时编码由用户输入,但必须唯一。但这样的话,可能存在三个字段相同但编码不同的情况,但用户不允许。所以正确的做法可能是,将name、specification、material的组合设为唯一,这样即使编码不同,这三个字段相同的话也会被拒绝。或者用户可能希望编码由这三个字段生成,比如某种组合,确保唯一。或者用户可能希望当新增记录时,如果这三个字段的组合已存在,则不允许新增,不管编码是否相同。这种情况下,应该在数据库中对这三个字段设置唯一约束,这样无论编码是否相同,只要这三个字段重复,就会报错。

所以,正确的表结构可能包括:

CREATE TABLE material_category (

id INT PRIMARY KEY AUTO_INCREMENT,

code VARCHAR(50) UNIQUE NOT NULL,

name VARCHAR(100) NOT NULL,

specification VARCHAR(100) NOT NULL,

material VARCHAR(100) NOT NULL,

UNIQUE KEY unique_combo (name, specification, material)

);

这样,code字段必须唯一,且name、spec、material的组合也唯一。这可能满足用户的要求,即不同的名称、规格、材料不能有相同的code,或者说不同的组合不能有相同的code?可能用户的意思是,不同的组合必须有不同的code,但code本身必须唯一。所以,当插入一条记录时,如果code已存在,或者三个字段的组合已存在,都会导致插入失败。这可能需要同时设置这两个唯一约束。不过,可能用户的需求是,当三个字段的组合不同时,code可以相同?不太可能。因此,可能需要进一步明确。根据用户的原话:“不同的物资名称、规格、材质的物资不能设立相同的物资编码”,也就是如果名称、规格、材质不同,那么它们的编码不能相同。这可能意味着,当三个字段中的任何一个不同时,编码必须不同。或者,当三个字段的组合不同时,编码不能相同。这可能难以通过数据库约束实现,因为需要确保不同组合的编码也不相同。例如,假设有一条记录的编码是A,三个字段是X,Y,Z;另一条记录的三个字段是A,B,C,它们的编码不能是A。这种情况下,编码必须全局唯一,而不仅仅是组合唯一。这可能意味着code字段需要设置唯一约束,而三个字段的组合也需要唯一约束。或者用户可能希望code由三个字段生成,比如拼接,这样不同的组合自然有不同的code。但用户可能需要code由用户输入,这时候需要确保不同组合的code不同,这可能需要应用层逻辑来检查,比如在插入时,检查是否存在相同的code,或者相同的组合。这时候可能需要更复杂的逻辑。

但根据用户描述,可能更合理的做法是,code是主键,且当三个字段不同时,code必须不同。这可能意味着code的生成逻辑需要确保这一点,或者用户输入时必须保证。这种情况下,可能code需要是唯一的,而三个字段的组合也需要唯一。这样,无论是code重复还是组合重复,都无法插入。例如,code是主键,同时三个字段的组合有唯一约束。这可能满足用户的需求,即不同的组合不能有相同的code,同时code本身必须唯一。但用户的原话是“不同的物资名称、规格、材质的物资不能设立相同的物资编码”,也就是当三个字段不同时,它们的code不能相同。例如,如果存在两条记录,三个字段不同,但code相同,这是不允许的。因此,在这种情况下,code必须唯一,而三个字段的组合不需要唯一约束,但需要确保当三个字段不同时,code不能重复。但这样的话,code的唯一性约束已经确保了code的唯一性,无论三个字段是否相同。这可能与用户的需求不符。用户的需求可能实际上是,当三个字段的组合相同时,不允许插入,而code可以是其他情况。例如,用户可能希望三个字段的组合唯一,而code可以自动生成或由用户输入,但必须唯一。这时候,三个字段的组合需要唯一约束,而code也需要唯一约束。这样,无论哪个条件被违反,都会导致插入失败。

所以,最终的数据库表结构应该包括:

  • id INT 主键自增(可选)

  • code VARCHAR 唯一

  • name VARCHAR

  • specification VARCHAR

  • material VARCHAR

  • 唯一约束在 (name, specification, material)

这样,当用户试图插入一条记录时,如果code已存在,或者三个字段的组合已存在,都会导致插入失败。这应该满足用户的需求。

  1. 在IntelliJ中创建Maven Web项目:
  • 使用maven-archetype-webapp创建项目结构。

  • 配置pom.xml,添加Servlet API依赖,MySQL驱动依赖,JSTL(如果需要)等。

  • 配置Tomcat服务器,确保项目能正确部署。

  1. 编写DAO层:
  • 创建数据库连接工具类,读取jdbc.properties配置。

  • 编写MaterialCategoryDAO类,包含增删改查方法。

  • 在新增方法中,需要处理可能出现的重复code或重复组合的异常,返回相应的提示。

  1. 编写Servlet:
  • 创建AddMaterialServlet、DeleteMaterialServlet、UpdateMaterialServlet、QueryMaterialServlet,分别处理对应的请求。

  • 或者使用一个MaterialServlet,通过请求参数区分action(如action=add, action=delete等)。

  • 在Servlet中获取请求参数,调用DAO层方法,处理结果,并重定向或转发到相应的页面。

  1. 编写前端页面:
  • 创建HTML页面,如add.html(新增页面)、list.html(查询页面,包含编辑和删除链接)。

  • 在查询页面,可能需要使用JSP或Thymeleaf来动态显示数据,但用户提到用HTML,可能需要通过Servlet转发请求属性,使用JSP来显示动态内容。或者使用AJAX从后端获取数据,动态填充HTML表格。不过用户可能允许使用JSP,因为纯HTML无法动态显示数据。

  1. 测试:
  • 确保每个功能都能正确操作数据库,处理异常情况,如重复数据等。

  • 测试增删改查功能,验证数据正确性。

现在,可能遇到的问题包括:

  • 数据库连接配置错误,比如驱动类名、URL、用户名密码是否正确。

  • 唯一约束冲突时的异常处理,需要在前端显示错误信息。

  • 事务管理,是否需要使用事务,但在简单的增删改查中可能不需要。

  • 前端页面的表单提交是否正确,Servlet是否正确处理参数。

  • 分页和查询条件的处理,用户可能要求查询功能支持条件查询,但根据需求可能只是列出所有记录。

现在,我需要按照这些步骤逐步实现。

首先,创建数据库:

CREATE DATABASE wuzi_db;

USE wuzi_db;

CREATE TABLE material_category (

id INT PRIMARY KEY AUTO_INCREMENT,

code VARCHAR(50) UNIQUE NOT NULL,

name VARCHAR(100) NOT NULL,

specification VARCHAR(100) NOT NULL,

material VARCHAR(100) NOT NULL,

UNIQUE KEY unique_combo (name, specification, material)

);

然后,在IntelliJ中创建Maven项目,选择maven-archetype-webapp。项目结构应该包括src/main/webapp,WEB-INF/web.xml等。

在pom.xml中添加依赖:

<dependencies>

<!-- Servlet API -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>4.0.1</version>

<scope>provided</scope>

</dependency>

<!-- MySQL Driver -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>8.0.23</version>

</dependency>

<!-- 如果需要JSON处理,比如返回JSON数据 -->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.12.3</version>

</dependency>

</dependencies>

然后,创建数据库连接工具类,比如DBUtil,读取jdbc.properties:

在src/main/resources目录下创建jdbc.properties:

jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/wuzi_db?useSSL=false&serverTimezone=UTC

jdbc.username=root

jdbc.password=123456

然后,编写DBUtil类,放在src/main/java下的合适包中,比如com.example.util:

public class DBUtil {

private static String driver;

private static String url;

private static String username;

private static String password;

static {

try {

Properties props = new Properties();

InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");

props.load(in);

driver = props.getProperty("jdbc.driver");

url = props.getProperty("jdbc.url");

username = props.getProperty("jdbc.username");

password = props.getProperty("jdbc.password");

Class.forName(driver);

} catch (IOException | ClassNotFoundException e) {

e.printStackTrace();

}

}

public static Connection getConnection() throws SQLException {

return DriverManager.getConnection(url, username, password);

}

public static void close(Connection conn, Statement stmt, ResultSet rs) {

try {

if (rs != null) rs.close();

if (stmt != null) stmt.close();

if (conn != null) conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

然后,创建MaterialCategory实体类,对应数据库表:

public class MaterialCategory {

private int id;

private String code;

private String name;

private String specification;

private String material;

// getters and setters

}

接下来,编写MaterialCategoryDAO,实现增删改查:

public class MaterialCategoryDAO {

public boolean add(MaterialCategory mc) {

String sql = "INSERT INTO material_category (code, name, specification, material) VALUES (?, ?, ?, ?)";

try (Connection conn = DBUtil.getConnection();

PreparedStatement pstmt = conn.prepareStatement(sql)) {

pstmt.setString(1, mc.getCode());

pstmt.setString(2, mc.getName());

pstmt.setString(3, mc.getSpecification());

pstmt.setString(4, mc.getMaterial());

int rows = pstmt.executeUpdate();

return rows > 0;

} catch (SQLException e) {

e.printStackTrace();

return false;

}

}

public boolean deleteByCode(String code) {

String sql = "DELETE FROM material_category WHERE code = ?";

try (Connection conn = DBUtil.getConnection();

PreparedStatement pstmt = conn.prepareStatement(sql)) {

pstmt.setString(1, code);

int rows = pstmt.executeUpdate();

return rows > 0;

} catch (SQLException e) {

e.printStackTrace();

return false;

}

}

public boolean update(MaterialCategory mc) {

String sql = "UPDATE material_category SET name=?, specification=?, material=? WHERE code=?";

try (Connection conn = DBUtil.getConnection();

PreparedStatement pstmt = conn.prepareStatement(sql)) {

pstmt.setString(1, mc.getName());

pstmt.setString(2, mc.getSpecification());

pstmt.setString(3, mc.getMaterial());

pstmt.setString(4, mc.getCode());

int rows = pstmt.executeUpdate();

return rows > 0;

} catch (SQLException e) {

e.printStackTrace();

return false;

}

}

public List<MaterialCategory> findAll() {

List<MaterialCategory> list = new ArrayList<>();

String sql = "SELECT * FROM material_category";

try (Connection conn = DBUtil.getConnection();

PreparedStatement pstmt = conn.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery()) {

while (rs.next()) {

MaterialCategory mc = new MaterialCategory();

mc.setId(rs.getInt("id"));

mc.setCode(rs.getString("code"));

mc.setName(rs.getString("name"));

mc.setSpecification(rs.getString("specification"));

mc.setMaterial(rs.getString("material"));

list.add(mc);

}

} catch (SQLException e) {

e.printStackTrace();

}

return list;

}

public MaterialCategory findByCode(String code) {

String sql = "SELECT * FROM material_category WHERE code = ?";

try (Connection conn = DBUtil.getConnection();

PreparedStatement pstmt = conn.prepareStatement(sql)) {

pstmt.setString(1, code);

ResultSet rs = pstmt.executeQuery();

if (rs.next()) {

MaterialCategory mc = new MaterialCategory();

mc.setId(rs.getInt("id"));

mc.setCode(rs.getString("code"));

mc.setName(rs.getString("name"));

mc.setSpecification(rs.getString("specification"));

mc.setMaterial(rs.getString("material"));

return mc;

}

} catch (SQLException e) {

e.printStackTrace();

}

return null;

}

}

然后,编写Servlet。例如,处理新增的AddServlet:

@WebServlet("/add")

public class AddMaterialServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String code = request.getParameter("code");

String name = request.getParameter("name");

String spec = request.getParameter("specification");

String material = request.getParameter("material");

MaterialCategory mc = new MaterialCategory();

mc.setCode(code);

mc.setName(name);

mc.setSpecification(spec);

mc.setMaterial(material);

MaterialCategoryDAO dao = new MaterialCategoryDAO();

boolean success = dao.add(mc);

if (success) {

response.sendRedirect("list");

} else {

// 处理失败情况,可能因为唯一约束冲突

request.setAttribute("error", "添加失败,物资编码或组合已存在");

request.getRequestDispatcher("/add.html").forward(request, response);

}

}

}

同样,处理删除的DeleteServlet:

@WebServlet("/delete")

public class DeleteMaterialServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String code = request.getParameter("code");

MaterialCategoryDAO dao = new MaterialCategoryDAO();

boolean success = dao.deleteByCode(code);

if (success) {

response.sendRedirect("list");

} else {

request.setAttribute("error", "删除失败");

request.getRequestDispatcher("/list").forward(request, response);

}

}

}

更新和查询的Servlet类似。

然后,编写前端页面。例如,add.html:

<!DOCTYPE html>

<html>

<head>

<title>新增物资类别</title>

</head>

<body>

<h1>新增物资类别</h1>

<form action="add" method="post">

<label>物资编码:<input type="text" name="code" required></label><br>

<label>名称:<input type="text" name="name" required></label><br>

<label>规格:<input type="text" name="specification" required></label><br>

<label>材料:<input type="text" name="material" required></label><br>

<input type="submit" value="提交">

</form>

<a href="list">返回列表</a>

</body>

</html>

查询页面可能需要使用JSP来动态显示数据,因为纯HTML无法展示数据库内容。例如,list.jsp:

<%@ page import="java.util.List" %>

<%@ page import="com.example.model.MaterialCategory" %>

<!DOCTYPE html>

<html>

<head>

<title>物资类别列表</title>

</head>

<body>

<h1>物资类别列表</h1>

<table border="1">

<tr>

<th>物资编码</th>

<th>名称</th>

<th>规格</th>

<th>材料</th>

<th>操作</th>

</tr>

<%

List<MaterialCategory> list = (List<MaterialCategory>) request.getAttribute("list");

for (MaterialCategory mc : list) {

%>

<tr>

<td><%= mc.getCode() %></td>

<td><%= mc.getName() %></td>

<td><%= mc.getSpecification() %></td>

<td><%= mc.getMaterial() %></td>

<td>

<a href="edit?code=<%= mc.getCode() %>">编辑</a>

<a href="delete?code=<%= mc.getCode() %>" onclick="return confirm('确定删除?')">删除</a>

</td>

</tr>

<% } %>

</table>

<a href="add.html">新增物资类别</a>

</body>

</html>

对应的ListServlet:

@WebServlet("/list")

public class ListMaterialServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

MaterialCategoryDAO dao = new MaterialCategoryDAO();

List<MaterialCategory> list = dao.findAll();

request.setAttribute("list", list);

request.getRequestDispatcher("/list.jsp").forward(request, response);

}

}

编辑页面edit.jsp:

<%@ page import="com.example.model.MaterialCategory" %>

<%

MaterialCategory mc = (MaterialCategory) request.getAttribute("material");

%>

<!DOCTYPE html>

<html>

<head>

<title>编辑物资类别</title>

</head>

<body>

<h1>编辑物资类别</h1>

<form action="update" method="post">

<input type="hidden" name="code" value="<%= mc.getCode() %>">

<label>名称:<input type="text" name="name" value="<%= mc.getName() %>" required></label><br>

<label>规格:<input type="text" name="specification" value="<%= mc.getSpecification() %>" required></label><br>

<label>材料:<input type="text" name="material" value="<%= mc.getMaterial() %>" required></label><br>

<input type="submit" value="更新">

</form>

<a href="list">返回列表</a>

</body>

</html>

对应的EditServlet:

@WebServlet("/edit")

public class EditMaterialServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String code = request.getParameter("code");

MaterialCategoryDAO dao = new MaterialCategoryDAO();

MaterialCategory mc = dao.findByCode(code);

if (mc != null) {

request.setAttribute("material", mc);

request.getRequestDispatcher("/edit.jsp").forward(request, response);

} else {

response.sendRedirect("list");

}

}

}

UpdateServlet:

@WebServlet("/update")

public class UpdateMaterialServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String code = request.getParameter("code");

String name = request.getParameter("name");

String spec = request.getParameter("specification");

String material = request.getParameter("material");

MaterialCategory mc = new MaterialCategory();

mc.setCode(code);

mc.setName(name);

mc.setSpecification(spec);

mc.setMaterial(material);

MaterialCategoryDAO dao = new MaterialCategoryDAO();

boolean success = dao.update(mc);

if (success) {

response.sendRedirect("list");

} else {

request.setAttribute("error", "更新失败,可能组合已存在");

request.getRequestDispatcher("/edit?code=" + code).forward(request, response);

}

}

}

最后,配置web.xml(虽然使用注解方式配置Servlet,但可能还需要配置欢迎页面等):

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

version="4.0">

<welcome-file-list>

<welcome-file>list</welcome-file>

</welcome-file-list>

</web-app>

在部署到Tomcat时,需要确保数据库连接参数正确,并且Tomcat的lib目录下有MySQL驱动(如果遇到ClassNotFoundException,可能需要将驱动放在Tomcat的lib目录下,或者确保Maven依赖正确)。

测试时,访问http://localhost:8080/项目名/list,应该能看到物资列表,进行增删改查操作。

可能还需要处理异常情况,比如当添加重复的code或组合时,显示错误信息。例如,在add.html中,如果添加失败,返回错误信息。可能需要使用JSP来动态显示错误信息,或者通过Servlet转发到带有错误提示的页面。

总结来说,整个流程包括数据库设计、项目搭建、DAO层编写、Servlet处理请求、前端页面展示。需要确保每个环节的连接正确,异常处理得当。

以下是分步指南,帮助您使用IntelliJ IDEA创建Maven Web项目并实现物资类别单的增删改查功能。

步骤1:创建数据库和表
在MySQL中执行以下SQL语句:

sql
CREATE DATABASE wuzi_db;
USE wuzi_db;

CREATE TABLE material_category (
    id INT PRIMARY KEY AUTO_INCREMENT,
    code VARCHAR(50) UNIQUE NOT NULL,
    name VARCHAR(100) NOT NULL,
    specification VARCHAR(100) NOT NULL,
    material VARCHAR(100) NOT NULL,
    UNIQUE KEY unique_combo (name, specification, material)
);

步骤2:创建Maven Web项目
打开IntelliJ IDEA,选择 File > New > Project。

选择 Maven,勾选 Create from archetype,选择 maven-archetype-webapp。

填写 GroupId 和 ArtifactId,完成项目创建。

步骤3:配置pom.xml
添加依赖到pom.xml:

xml
<dependencies>
    <!-- Servlet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- MySQL Driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
    <!-- JSON Support -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.3</version>
    </dependency>
</dependencies>

步骤4:创建数据库工具类
在src/main/java下创建com.example.util.DBUtil:

public class DBUtil {
    // 数据库连接配置(参考思考过程)
    // 确保创建jdbc.properties文件并配置正确参数
}

步骤5:创建实体类
创建com.example.model.MaterialCategory:

public class MaterialCategory {
    private int id;
    private String code;
    private String name;
    private String specification;
    private String material;
    // Getters and Setters
}

步骤6:创建DAO类
创建com.example.dao.MaterialCategoryDAO,包含增删改查方法(参考思考过程中的DAO实现)。

步骤7:创建Servlet
创建以下Servlet(每个功能对应一个Servlet):

AddMaterialServlet(处理新增)

DeleteMaterialServlet(处理删除)

UpdateMaterialServlet(处理更新)

ListMaterialServlet(显示列表)

EditMaterialServlet(跳转到编辑页面)

示例ListMaterialServlet

@WebServlet("/list")
public class ListMaterialServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        MaterialCategoryDAO dao = new MaterialCategoryDAO();
        List<MaterialCategory> list = dao.findAll();
        request.setAttribute("list", list);
        request.getRequestDispatcher("/list.jsp").forward(request, response);
    }
}

步骤8:创建前端页面
list.jsp(显示物资列表)

add.html(新增物资表单)

edit.jsp(编辑物资表单)

示例list.jsp:

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <title>物资列表</title>
</head>
<body>
    <h1>物资类别列表</h1>
    <table border="1">
        <tr>
            <th>编码</th><th>名称</th><th>规格</th><th>材料</th><th>操作</th>
        </tr>
        <c:forEach items="${list}" var="item">
            <tr>
                <td>${item.code}</td>
                <td>${item.name}</td>
                <td>${item.specification}</td>
                <td>${item.material}</td>
                <td>
                    <a href="edit?code=${item.code}">编辑</a>
                    <a href="delete?code=${item.code}" onclick="return confirm('确定删除?')">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
    <a href="add.html">新增物资</a>
</body>
</html>

步骤9:配置Tomcat并运行
点击IntelliJ右上角 Add Configuration,添加Tomcat服务器。

部署项目,启动Tomcat。

访问 http://localhost:8080/项目名/list 测试功能。

注意事项
确保MySQL服务正在运行,且jdbc.properties中的连接信息正确。

处理表单提交时,Servlet的doPost方法需正确接收参数。

编辑功能需先查询数据再填充到表单中。

添加唯一约束后,数据库会拒绝重复数据,需在前端或Servlet中处理异常提示。

通过以上步骤,您可以实现物资类别单的增删改查功能。根据具体需求调整代码逻辑和页面设计。

posted @ 2025-03-04 23:47  阿伟·  阅读(8)  评论(0)    收藏  举报