【JAVA】Java项目实战—Java EE项目:企业资源规划(ERP)系统

在企业管理中,企业资源规划(ERP)系统是不可或缺的工具。它能够帮助企业高效管理各种资源,包括人力资源、财务资源和库存等。Java作为一种成熟的编程语言,因其跨平台特性、强大的生态系统以及良好的社区支持,成为开发ERP系统的热门选择。

在本项目中,实现一个简单的ERP系统,涵盖员工管理、财务管理和库存管理等功能。通过这一项目,每个人将深入理解Java EE的核心概念,并掌握如何在实际应用中运用这些知识。

Java EE概述

Java EE(Java Platform, Enterprise Edition)是Java的一个重要分支,专为企业级应用开发设计。Java EE提供了一系列的API和运行环境,帮助开发者构建大规模的分布式应用程序。其核心组件包括:

  • Servlet:用于处理HTTP请求和响应。

  • JSP(JavaServer Pages):用于动态生成HTML页面。

  • EJB(Enterprise JavaBeans):用于构建分布式、事务性和可扩展的企业级应用。

  • JPA(Java Persistence API):用于对象关系映射(ORM),简化数据库操作。

  • Web Services:用于构建基于SOAP或REST的服务。

项目结构

在本项目中,使用Maven作为构建工具,项目结构如下:

复制代码
erp-system/
│
├── pom.xml
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── erp/
│   │   │           ├── controller/
│   │   │           ├── model/
│   │   │           ├── service/
│   │   │           └── repository/
│   │   └── resources/
│   │       └── application.properties
│   └── test/
│       └── java/
│           └── com/
│               └── erp/
└── webapp/
    ├── index.jsp
    └── WEB-INF/
        └── web.xml

1. 理论知识:Java EE的基础

1.1 Servlet

Servlet是Java EE的核心组件之一,主要用于处理HTTP请求。它是一个Java类,能够接收请求并生成响应。

示例代码:

复制代码
package com.erp.controller;

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;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.getWriter().println("<h1>Hello, ERP System!</h1>");
    }
}

解释:

  • @WebServlet("/hello"):定义Servlet的URL映射,当访问/hello时,该Servlet会被调用。

  • doGet方法:处理GET请求,设置响应类型为HTML,并输出一条简单的欢迎信息。

1.2 JSP

JSP(JavaServer Pages)用于创建动态网页。它允许在HTML中嵌入Java代码。

示例代码:

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>ERP System</title>
</head>
<body>
<h1>Welcome to the ERP System</h1>
<p>Current Date: <%= new java.util.Date() %></p>
</body>
</html>

解释:

  • <%= new java.util.Date() %>:JSP标签,输出当前日期。

2. 实现员工管理功能

员工管理是ERP系统的重要组成部分,下面我们将实现一个简单的员工管理模块。

2.1 数据模型

首先,我们需要定义员工的模型类。

示例代码:

复制代码
package com.erp.model;

public class Employee {
    private int id;
    private String name;
    private String position;

    public Employee(int id, String name, String position) {
        this.id = id;
        this.name = name;
        this.position = position;
    }

    // Getters and Setters
    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 String getPosition() { return position; }
    public void setPosition(String position) { this.position = position; }
}

解释:

  • Employee类包含员工的基本信息:ID、姓名和职位。
2.2 仓库层

接下来,我们实现员工的仓库层,用于数据的存储和检索。

示例代码:

复制代码
package com.erp.repository;

import com.erp.model.Employee;
import java.util.ArrayList;
import java.util.List;

public class EmployeeRepository {
    private List<Employee> employees = new ArrayList<>();

    public void addEmployee(Employee employee) {
        employees.add(employee);
    }

    public List<Employee> getAllEmployees() {
        return employees;
    }
}

解释:

  • EmployeeRepository类维护一个员工列表,并提供添加和获取员工的方法。
2.3 服务层

服务层负责业务逻辑的处理。

示例代码:

复制代码
package com.erp.service;

import com.erp.model.Employee;
import com.erp.repository.EmployeeRepository;

import java.util.List;

public class EmployeeService {
    private EmployeeRepository repository = new EmployeeRepository();

    public void addEmployee(Employee employee) {
        repository.addEmployee(employee);
    }

    public List<Employee> getAllEmployees() {
        return repository.getAllEmployees();
    }
}

解释:

  • EmployeeService类调用EmployeeRepository来管理员工数据。
2.4 控制层

最后,我们实现控制层,处理用户请求。

示例代码:

复制代码
package com.erp.controller;

import com.erp.model.Employee;
import com.erp.service.EmployeeService;

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.util.List;

@WebServlet("/employees")
public class EmployeeController extends HttpServlet {
    private EmployeeService employeeService = new EmployeeService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Employee> employees = employeeService.getAllEmployees();
        request.setAttribute("employees", employees);
        request.getRequestDispatcher("/employeeList.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String position = request.getParameter("position");
        Employee employee = new Employee(1, name, position); // ID可以用数据库生成
        employeeService.addEmployee(employee);
        response.sendRedirect("employees");
    }
}

解释:

  • doGet方法:获取所有员工并转发到employeeList.jsp页面。

  • doPost方法:处理添加员工的请求。

2.5 JSP页面

创建一个JSP页面以显示员工列表。

示例代码:

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Employee List</title>
</head>
<body>
<h1>Employee List</h1>
<form action="employees" method="post">
    Name: <input type="text" name="name" required>
    Position: <input type="text" name="position" required>
    <input type="submit" value="Add Employee">
</form>
<table border="1">
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Position</th>
    </tr>
    <%
        List<Employee> employees = (List<Employee>) request.getAttribute("employees");
        for (Employee employee : employees) {
    %>
    <tr>
        <td><%= employee.getId() %></td>
        <td><%= employee.getName() %></td>
        <td><%= employee.getPosition() %></td>
    </tr>
    <%
        }
    %>
</table>
</body>
</html>

解释:

  • 表单用于添加新员工,表格显示所有员工信息。

3. 财务管理功能

财务管理是ERP系统的另一个重要模块。我们将实现简单的财务记录功能。

3.1 数据模型

定义财务记录的模型类。

示例代码:

复制代码
package com.erp.model;

public class FinanceRecord {
    private int id;
    private String description;
    private double amount;

    public FinanceRecord(int id, String description, double amount) {
        this.id = id;
        this.description = description;
        this.amount = amount;
    }

    // Getters and Setters
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getDescription() { return description; }
    public void setDescription(String description) { this.description = description; }
    public double getAmount() { return amount; }
    public void setAmount(double amount) { this.amount = amount; }
}

解释:

  • FinanceRecord类包含财务记录的基本信息:ID、描述和金额。
3.2 仓库层

实现财务记录的仓库层。

示例代码:

复制代码
package com.erp.repository;

import com.erp.model.FinanceRecord;
import java.util.ArrayList;
import java.util.List;

public class FinanceRepository {
    private List<FinanceRecord> records = new ArrayList<>();

    public void addRecord(FinanceRecord record) {
        records.add(record);
    }

    public List<FinanceRecord> getAllRecords() {
        return records;
    }
}

解释:

  • FinanceRepository类维护一个财务记录列表,并提供添加和获取记录的方法。
3.3 服务层

服务层负责财务记录的业务逻辑处理。

示例代码:

复制代码
package com.erp.service;

import com.erp.model.FinanceRecord;
import com.erp.repository.FinanceRepository;

import java.util.List;

public class FinanceService {
    private FinanceRepository repository = new FinanceRepository();

    public void addRecord(FinanceRecord record) {
        repository.addRecord(record);
    }

    public List<FinanceRecord> getAllRecords() {
        return repository.getAllRecords();
    }
}

解释:

  • FinanceService类调用FinanceRepository来管理财务记录数据。
3.4 控制层

控制层处理财务记录的请求。

示例代码:

复制代码
package com.erp.controller;

import com.erp.model.FinanceRecord;
import com.erp.service.FinanceService;

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.util.List;

@WebServlet("/finance")
public class FinanceController extends HttpServlet {
    private FinanceService financeService = new FinanceService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<FinanceRecord> records = financeService.getAllRecords();
        request.setAttribute("records", records);
        request.getRequestDispatcher("/financeList.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String description = request.getParameter("description");
        double amount = Double.parseDouble(request.getParameter("amount"));
        FinanceRecord record = new FinanceRecord(1, description, amount); // ID可以用数据库生成
        financeService.addRecord(record);
        response.sendRedirect("finance");
    }
}

解释:

  • doGet方法:获取所有财务记录并转发到financeList.jsp页面。

  • doPost方法:处理添加财务记录的请求。

3.5 JSP页面

创建一个JSP页面以显示财务记录列表。

示例代码:

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Finance Records</title>
</head>
<body>
<h1>Finance Records</h1>
<form action="finance" method="post">
    Description: <input type="text" name="description" required>
    Amount: <input type="number" step="0.01" name="amount" required>
    <input type="submit" value="Add Record">
</form>
<table border="1">
    <tr>
        <th>ID</th>
        <th>Description</th>
        <th>Amount</th>
    </tr>
    <%
        List<FinanceRecord> records = (List<FinanceRecord>) request.getAttribute("records");
        for (FinanceRecord record : records) {
    %>
    <tr>
        <td><%= record.getId() %></td>
        <td><%= record.getDescription() %></td>
        <td><%= record.getAmount() %></td>
    </tr>
    <%
        }
    %>
</table>
</body>
</html>

解释:

  • 表单用于添加新财务记录,表格显示所有财务记录信息。

4. 库存管理功能

库存管理是ERP系统的另一个重要模块。我们将实现简单的库存记录功能。

4.1 数据模型

定义库存记录的模型类。

示例代码:

复制代码
package com.erp.model;

public class InventoryItem {
    private int id;
    private String name;
    private int quantity;

    public InventoryItem(int id, String name, int quantity) {
        this.id = id;
        this.name = name;
        this.quantity = quantity;
    }

    // Getters and Setters
    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 int getQuantity() { return quantity; }
    public void setQuantity(int quantity) { this.quantity = quantity; }
}

解释:

  • InventoryItem类包含库存项目的基本信息:ID、名称和数量。
4.2 仓库层

实现库存记录的仓库层。

示例代码:

复制代码
package com.erp.repository;

import com.erp.model.InventoryItem;
import java.util.ArrayList;
import java.util.List;

public class InventoryRepository {
    private List<InventoryItem> items = new ArrayList<>();

    public void addItem(InventoryItem item) {
        items.add(item);
    }

    public List<InventoryItem> getAllItems() {
        return items;
    }
}

解释:

  • InventoryRepository类维护一个库存项目列表,并提供添加和获取项目的方法。
4.3 服务层

服务层负责库存记录的业务逻辑处理。

示例代码:

复制代码
package com.erp.service;

import com.erp.model.InventoryItem;
import com.erp.repository.InventoryRepository;

import java.util.List;

public class InventoryService {
    private InventoryRepository repository = new InventoryRepository();

    public void addItem(InventoryItem item) {
        repository.addItem(item);
    }

    public List<InventoryItem> getAllItems() {
        return repository.getAllItems();
    }
}

解释:

  • InventoryService类调用InventoryRepository来管理库存项目数据。
4.4 控制层

控制层处理库存记录的请求。

示例代码:

复制代码
package com.erp.controller;

import com.erp.model.InventoryItem;
import com.erp.service.InventoryService;

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.util.List;

@WebServlet("/inventory")
public class InventoryController extends HttpServlet {
    private InventoryService inventoryService = new InventoryService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<InventoryItem> items = inventoryService.getAllItems();
        request.setAttribute("items", items);
        request.getRequestDispatcher("/inventoryList.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        int quantity = Integer.parseInt(request.getParameter("quantity"));
        InventoryItem item = new InventoryItem(1, name, quantity); // ID可以用数据库生成
        inventoryService.addItem(item);
        response.sendRedirect("inventory");
    }
}

解释:

  • doGet方法:获取所有库存项目并转发到inventoryList.jsp页面。

  • doPost方法:处理添加库存项目的请求。

4.5 JSP页面

创建一个JSP页面以显示库存项目列表。

示例代码:

复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Inventory Items</title>
</head>
<body>
<h1>Inventory Items</h1>
<form action="inventory" method="post">
    Name: <input type="text" name="name" required>
    Quantity: <input type="number" name="quantity" required>
    <input type="submit" value="Add Item">
</form>
<table border="1">
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Quantity</th>
    </tr>
    <%
        List<InventoryItem> items = (List<InventoryItem>) request.getAttribute("items");
        for (InventoryItem item : items) {
    %>
    <tr>
        <td><%= item.getId() %></td>
        <td><%= item.getName() %></td>
        <td><%= item.getQuantity() %></td>
    </tr>
    <%
        }
    %>
</table>
</body>
</html>

解释:

  • 表单用于添加新库存项目,表格显示所有库存项目的信息。

总结

通过本项目,我们实现了一个简单的ERP系统,涵盖了员工管理、财务管理和库存管理等功能。在这个过程中,我们深入了解了Java EE的核心组件,包括Servlet、JSP、服务层和仓库层的设计模式。这些知识不仅适用于ERP系统的开发,也可以推广到其他企业级应用的开发中。

后续工作

  • 持久化存储:使用JPA将数据持久化到数据库中。

  • 用户认证与授权:实现用户登录和权限管理功能。

  • 前端框架:使用现代前端框架(如React或Vue.js)增强用户体验。

  • RESTful API:构建RESTful API,以便与前端或移动应用进行交互。

希望本项目能够为读者提供一个清晰的Java EE开发实践的示例,激励更多的开发者深入学习和应用Java EE技术。

相关推荐
挺菜的9 分钟前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法
掘金-我是哪吒1 小时前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
亲爱的非洲野猪1 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm1 小时前
spring事件使用
java·后端·spring
微风粼粼2 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄2 小时前
设计模式之中介者模式
java·设计模式·中介者模式
rebel2 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温3 小时前
5种高效解决Maven依赖冲突的方法
java·maven
慕y2743 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习
paishishaba3 小时前
Maven
java·maven