12.29
第四步:创建数据库连接工具类 (DBUtil.java)
这个类负责管理数据库的连接和关闭,是项目中所有数据库操作的基础。
- 操作步骤:
在 IDEA 的项目视图中,依次展开 src -> main -> java -> com.company.detection。
在 com.company.detection 包上右键 -> New -> Package,创建一个名为 util 的新包。
然后在 util 包上右键 -> New -> Java Class,创建一个名为 DBUtil 的类。 - 代码实现:
将以下代码完整地复制并粘贴到 DBUtil.java 文件中。
java
运行
package com.company.detection.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
-
数据库连接工具类
-
提供获取和关闭数据库连接的静态方法
*/
public class DBUtil {// 数据库连接信息 (请根据你的实际情况修改)
private static final String URL = "jdbc:mysql://localhost:3306/engineering_detection_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
private static final String USER = "root"; // 你的MySQL用户名
private static final String PASSWORD = "123456"; // 你的MySQL密码// 静态代码块,在类加载时只执行一次,用于注册JDBC驱动
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("JDBC驱动注册成功!");
} catch (ClassNotFoundException e) {
System.err.println("JDBC驱动注册失败!");
e.printStackTrace();
}
}/**
- 获取数据库连接
- @return 一个有效的数据库连接对象 (Connection)
*/
public static Connection getConnection() {
try {
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
return conn;
} catch (SQLException e) {
System.err.println("获取数据库连接失败!");
e.printStackTrace();
return null;
}
}
/**
- 关闭数据库资源
- @param conn 连接对象
- @param ps 预编译语句对象
- @param rs 结果集对象
*/
public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
- 关闭数据库资源的重载方法 (当没有ResultSet时使用)
- @param conn 连接对象
- @param ps 预编译语句对象
*/
public static void close(Connection conn, PreparedStatement ps) {
close(conn, ps, null);
}
// 主方法,用于测试数据库连接是否成功
public static void main(String[] args) {
Connection connection = getConnection();
if (connection != null) {
System.out.println("数据库连接成功!");
try {
connection.close(); // 测试后关闭连接
} catch (SQLException e) {
e.printStackTrace();
}
} else {
System.out.println("数据库连接失败,请检查配置!");
}
}
}
重要提示:
请务必修改 DBUtil.java 文件中的 USER 和 PASSWORD 变量,将其改为你自己的 MySQL 用户名和密码。
- 测试连接:
保存文件后,右键点击 DBUtil.java 文件 -> Run 'DBUtil.main()'。
观察 IDEA 下方的控制台输出。
如果显示 JDBC驱动注册成功! 和 数据库连接成功!,说明你的数据库连接配置正确。
如果报错,请仔细检查控制台的错误信息,通常是用户名、密码错误或数据库服务未启动。第五步:创建 Servlet 和 JSP 页面 - 创建 webapp 目录结构
首先,请确保你的 src/main/webapp 目录下有以下结构。如果没有,请手动创建。
plaintext
webapp/
├── WEB-INF/
│ └── web.xml # Web应用的部署描述符
├── login.jsp # 登录页面
├── client/ # 委托客户页面目录
│ └── client_home.jsp
├── inspector/ # 检测员页面目录
│ └── inspector_home.jsp
├── manager/ # 项目经理页面目录
│ └── manager_home.jsp
└── director/ # 总监页面目录
└── director_home.jsp - 配置 web.xml
在 WEB-INF 目录下创建 web.xml 文件,用于配置 Servlet 和启动页面。
路径: src/main/webapp/WEB-INF/web.xml
xml
<!-- 配置欢迎页面(默认访问登录页) -->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<!-- 配置登录Servlet -->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.company.detection.controller.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!-- 配置委托客户Servlet -->
<servlet>
<servlet-name>ClientServlet</servlet-name>
<servlet-class>com.company.detection.controller.ClientServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ClientServlet</servlet-name>
<url-pattern>/client/*</url-pattern>
</servlet-mapping>
<!-- 配置检测员Servlet -->
<servlet>
<servlet-name>InspectorServlet</servlet-name>
<servlet-class>com.company.detection.controller.InspectorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>InspectorServlet</servlet-name>
<url-pattern>/inspector/*</url-pattern>
</servlet-mapping>
<!-- 配置项目经理Servlet -->
<servlet>
<servlet-name>ManagerServlet</servlet-name>
<servlet-class>com.company.detection.controller.ManagerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ManagerServlet</servlet-name>
<url-pattern>/manager/*</url-pattern>
</servlet-mapping>
<!-- 配置总监Servlet -->
<servlet>
<servlet-name>DirectorServlet</servlet-name>
<servlet-class>com.company.detection.controller.DirectorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DirectorServlet</servlet-name>
<url-pattern>/director/*</url-pattern>
</servlet-mapping>
3. 创建 Servlet 类
在 java 目录下创建 controller 包,并添加以下 Servlet。
a. LoginServlet.java
路径: src/main/java/com/company/detection/controller/LoginServlet.java
java
运行
package com.company.detection.controller;
import com.company.detection.entity.User;
import com.company.detection.service.UserService;
import com.company.detection.service.impl.UserServiceImpl;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String userId = request.getParameter("userId");
String password = request.getParameter("password");
User user = userService.login(userId, password);
if (user != null) {
HttpSession session = request.getSession();
session.setAttribute("user", user);
// 根据用户类别跳转到不同主页
switch (user.getUserCategory()) {
case 0: // 总监
response.sendRedirect(request.getContextPath() + "/director/home");
break;
case 1: // 项目经理
response.sendRedirect(request.getContextPath() + "/manager/home");
break;
case 2: // 检测员
response.sendRedirect(request.getContextPath() + "/inspector/home");
break;
case 3: // 委托客户
response.sendRedirect(request.getContextPath() + "/client/home");
break;
default:
response.getWriter().write("未知用户类型!");
break;
}
} else {
// 登录失败,返回登录页并提示错误
request.setAttribute("errorMsg", "用户名或密码错误!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
b. ClientServlet.java (委托客户)
路径: src/main/java/com/company/detection/controller/ClientServlet.java
java
运行
package com.company.detection.controller;
import com.company.detection.entity.Task;
import com.company.detection.entity.User;
import com.company.detection.service.TaskService;
import com.company.detection.service.impl.TaskServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
public class ClientServlet extends HttpServlet {
private TaskService taskService = new TaskServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
response.sendRedirect(request.getContextPath() + "/login.jsp");
return;
}
String uri = request.getRequestURI();
String action = uri.substring(uri.lastIndexOf("/") + 1);
if ("home".equals(action)) {
// 客户主页,查询自己提交的任务
List<Task> tasks = taskService.queryTasksByRole(user.getUserId(), user.getUserCategory());
request.setAttribute("tasks", tasks);
request.getRequestDispatcher("/client/client_home.jsp").forward(request, response);
} else if ("add".equals(action)) {
// 跳转到添加任务页面
request.getRequestDispatcher("/client/client_add.jsp").forward(request, response);
} else if ("doAdd".equals(action)) {
// 处理添加任务的请求
Task task = new Task();
task.setId(taskService.generateTaskId());
task.setCommitDate(request.getParameter("commitDate"));
task.setClientName(user.getUserName()); // 客户名就是当前登录用户的姓名
task.setItemName(request.getParameter("itemName"));
task.setItemContent(request.getParameter("itemContent"));
int result = taskService.addTask(task);
if (result > 0) {
response.sendRedirect(request.getContextPath() + "/client/home");
} else {
response.getWriter().write("任务提交失败!");
}
}
}
}
注意:为了简化,我只实现了委托客户的部分功能。其他角色的 Servlet(InspectorServlet, ManagerServlet, DirectorServlet)的逻辑类似,你可以根据这个模式来实现。
4. 创建 JSP 页面
现在,我们来创建几个简单的 JSP 页面。
a. login.jsp (登录页)
路径: src/main/webapp/login.jsp
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
系统登录
<%-- 显示登录错误信息 --%> <% if (request.getAttribute("errorMsg") != null) { %>欢迎您,${user.userName} (委托客户)
<h2>我的任务列表</h2>
<table border="1" cellpadding="8" cellspacing="0">
<tr>
<th>任务编号</th>
<th>委托日期</th>
<th>项目名称</th>
<th>当前状态</th>
</tr>
<c:forEach var="task" items="${tasks}">
<tr>
<td>${task.id}</td>
<td>${task.commitDate}</td>
<td>${task.itemName}</td>
<td>${task.state}</td>
</tr>
</c:forEach>
<c:if test="${empty tasks}">
<tr>
<td colspan="4" align="center">暂无任务记录</td>
</tr>
</c:if>
</table>
c. client_add.jsp (客户添加任务页)
路径: src/main/webapp/client/client_add.jsp
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
提交新的检测任务
<form action="${pageContext.request.contextPath}/client/doAdd" method="post">
<table>
<tr>
<td>委托日期:</td>
<td><input type="text" name="commitDate" placeholder="格式: YYYYMMDD" required></td>
</tr>
<tr>
<td>项目名称:</td>
<td><input type="text" name="itemName" required></td>
</tr>
<tr>
<td>项目内容:</td>
<td><textarea name="itemContent" rows="5" cols="30"></textarea></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交任务"></td>
</tr>
</table>
</form>

浙公网安备 33010602011771号