在Java中构建简单的留言板系统,核心需要完成数据库设计、后端接口开发、前端页面展示三个部分,通过JDBC操作数据库存储留言数据,使用Servlet处理前端请求,最终实现一个可以发布和查看留言的基础系统。

数据库设计
首先需要创建存储留言数据的表,留言板核心需要记录留言内容、留言人、留言时间三个基础信息,对应的建表语句如下:
-- 创建留言表
CREATE TABLE message (
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(500) NOT NULL COMMENT '留言内容',
author VARCHAR(50) NOT NULL COMMENT '留言人',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '留言时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
后端核心功能实现
JDBC工具类封装
为了简化数据库操作,先封装一个JDBC工具类,负责获取数据库连接和释放资源,代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcUtil {
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String URL = "jdbc:mysql://127.0.0.1:3306/message_db?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "root";
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取数据库连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
// 释放资源
public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
留言实体类
创建对应的实体类来映射数据库表结构,方便后续数据传递:
import java.util.Date;
public class Message {
private Integer id;
private String content;
private String author;
private Date createTime;
// getter和setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
留言操作DAO类
封装留言的数据库操作逻辑,包括新增留言和查询所有留言两个核心方法:
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 MessageDao {
// 新增留言
public boolean addMessage(Message message) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
String sql = "INSERT INTO message (content, author) VALUES (?, ?)";
ps = conn.prepareStatement(sql);
ps.setString(1, message.getContent());
ps.setString(2, message.getAuthor());
int rows = ps.executeUpdate();
return rows > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
JdbcUtil.close(conn, ps, null);
}
}
// 查询所有留言
public List<Message> getAllMessages() {
List<Message> messageList = new ArrayList<>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtil.getConnection();
String sql = "SELECT id, content, author, create_time FROM message ORDER BY create_time DESC";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
Message message = new Message();
message.setId(rs.getInt("id"));
message.setContent(rs.getString("content"));
message.setAuthor(rs.getString("author"));
message.setCreateTime(rs.getTimestamp("create_time"));
messageList.add(message);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, ps, rs);
}
return messageList;
}
}
Servlet接口开发
开发两个Servlet分别处理发布留言和查询留言的请求:
发布留言Servlet
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("/addMessage")
public class AddMessageServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String content = req.getParameter("content");
String author = req.getParameter("author");
if (content == null || content.trim().isEmpty() || author == null || author.trim().isEmpty()) {
resp.getWriter().write("留言内容和留言人不能为空");
return;
}
Message message = new Message();
message.setContent(content);
message.setAuthor(author);
MessageDao messageDao = new MessageDao();
boolean success = messageDao.addMessage(message);
if (success) {
resp.sendRedirect(req.getContextPath() + "/getAllMessages");
} else {
resp.getWriter().write("留言发布失败");
}
}
}
查询留言Servlet
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("/getAllMessages")
public class GetAllMessagesServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
MessageDao messageDao = new MessageDao();
List<Message> messageList = messageDao.getAllMessages();
req.setAttribute("messageList", messageList);
req.getRequestDispatcher("/message_list.jsp").forward(req, resp);
}
}
前端页面实现
留言发布页面
创建add_message.jsp作为留言发布页面,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>发布留言</title>
</head>
<body>
<h2>发布新留言</h2>
<form action="${pageContext.request.contextPath}/addMessage" method="post">
<p>
留言人:<input type="text" name="author" required>
</p>
<p>
留言内容:<textarea name="content" rows="5" cols="30" required></textarea>
</p>
<p>
<input type="submit" value="发布留言">
<a href="${pageContext.request.contextPath}/getAllMessages">查看所有留言</a>
</p>
</form>
</body>
</html>
留言列表页面
创建message_list.jsp作为留言展示页面,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>留言列表</title>
</head>
<body>
<h2>所有留言</h2>
<a href="${pageContext.request.contextPath}/add_message.jsp">发布新留言</a>
<hr>
<c:if test="${empty messageList}">
<p>暂无留言</p>
</c:if>
<c:forEach items="${messageList}" var="message">
<div style="border:1px solid #ccc; padding:10px; margin:10px 0;">
<p>留言人:${message.author}</p>
<p>留言内容:${message.content}</p>
<p>留言时间:${message.createTime}</p>
</div>
</c:forEach>
</body>
</html>
部署运行说明
将上述代码部署到Tomcat等Servlet容器中,提前创建好对应的数据库和表,修改JdbcUtil中的数据库连接信息为实际的环境配置,启动容器后访问add_message.jsp页面即可使用留言板的发布和查看功能。如果需要扩展功能,可以在现有基础上增加留言删除、留言回复等逻辑,核心思路和上述实现方式一致。