您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
在Web应用程序中,评论和回复功能是非常常见的需求。无论是社交媒体、博客还是电子商务网站,用户通常都需要对内容进行评论,并且可以对其他用户的评论进行回复。本文将介绍如何使用Java实现一个简单的评论和回复功能。
首先,我们需要设计数据库表来存储评论和回复信息。通常,评论和回复可以存储在同一张表中,通过一个字段来区分它们。
我们可以设计一个comments
表,包含以下字段:
id
: 评论的唯一标识符(主键)。content
: 评论的内容。parent_id
: 父评论的ID。如果该字段为NULL
,则表示这是一条顶级评论;否则,表示这是一条回复。user_id
: 发表评论的用户ID。created_at
: 评论的创建时间。CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
parent_id INT,
user_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (parent_id) REFERENCES comments(id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
为了简化示例,我们假设已经有一个users
表来存储用户信息:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
接下来,我们需要在Java中创建对应的实体类。
public class User {
private int id;
private String username;
private String email;
// Getters and Setters
}
import java.util.Date;
import java.util.List;
public class Comment {
private int id;
private String content;
private Integer parentId;
private int userId;
private Date createdAt;
private List<Comment> replies;
// Getters and Setters
}
我们需要创建一个DAO类来操作数据库中的评论数据。
import java.util.List;
public interface CommentDao {
List<Comment> getCommentsByParentId(int parentId);
void addComment(Comment comment);
Comment getCommentById(int id);
}
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class CommentDaoImpl implements CommentDao {
private Connection connection;
public CommentDaoImpl(Connection connection) {
this.connection = connection;
}
@Override
public List<Comment> getCommentsByParentId(int parentId) {
List<Comment> comments = new ArrayList<>();
String sql = "SELECT * FROM comments WHERE parent_id = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setInt(1, parentId);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
Comment comment = new Comment();
comment.setId(rs.getInt("id"));
comment.setContent(rs.getString("content"));
comment.setParentId(rs.getInt("parent_id"));
comment.setUserId(rs.getInt("user_id"));
comment.setCreatedAt(rs.getTimestamp("created_at"));
comments.add(comment);
}
} catch (SQLException e) {
e.printStackTrace();
}
return comments;
}
@Override
public void addComment(Comment comment) {
String sql = "INSERT INTO comments (content, parent_id, user_id) VALUES (?, ?, ?)";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setString(1, comment.getContent());
stmt.setObject(2, comment.getParentId());
stmt.setInt(3, comment.getUserId());
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public Comment getCommentById(int id) {
String sql = "SELECT * FROM comments WHERE id = ?";
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
stmt.setInt(1, id);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
Comment comment = new Comment();
comment.setId(rs.getInt("id"));
comment.setContent(rs.getString("content"));
comment.setParentId(rs.getInt("parent_id"));
comment.setUserId(rs.getInt("user_id"));
comment.setCreatedAt(rs.getTimestamp("created_at"));
return comment;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
服务层负责处理业务逻辑,例如获取评论树、添加评论等。
import java.util.List;
public interface CommentService {
List<Comment> getCommentTree();
void addComment(Comment comment);
}
import java.util.ArrayList;
import java.util.List;
public class CommentServiceImpl implements CommentService {
private CommentDao commentDao;
public CommentServiceImpl(CommentDao commentDao) {
this.commentDao = commentDao;
}
@Override
public List<Comment> getCommentTree() {
List<Comment> topLevelComments = commentDao.getCommentsByParentId(0);
for (Comment comment : topLevelComments) {
comment.setReplies(getReplies(comment.getId()));
}
return topLevelComments;
}
private List<Comment> getReplies(int parentId) {
List<Comment> replies = commentDao.getCommentsByParentId(parentId);
for (Comment reply : replies) {
reply.setReplies(getReplies(reply.getId()));
}
return replies;
}
@Override
public void addComment(Comment comment) {
commentDao.addComment(comment);
}
}
控制器层负责处理HTTP请求,并将请求转发给服务层。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/comments")
public class CommentController {
@Autowired
private CommentService commentService;
@GetMapping
public List<Comment> getComments() {
return commentService.getCommentTree();
}
@PostMapping
public void addComment(@RequestBody Comment comment) {
commentService.addComment(comment);
}
}
在前端,我们可以使用递归的方式来展示评论树。以下是一个简单的HTML和JavaScript示例:
<div id="comments"></div>
<script>
function renderComment(comment) {
let html = `<div class="comment">
<p>${comment.content}</p>
<p>By: ${comment.userId}</p>
<p>${comment.createdAt}</p>
<div class="replies">`;
if (comment.replies && comment.replies.length > 0) {
comment.replies.forEach(reply => {
html += renderComment(reply);
});
}
html += `</div></div>`;
return html;
}
fetch('/comments')
.then(response => response.json())
.then(comments => {
let commentsHtml = '';
comments.forEach(comment => {
commentsHtml += renderComment(comment);
});
document.getElementById('comments').innerHTML = commentsHtml;
});
</script>
通过以上步骤,我们实现了一个简单的评论和回复功能。这个功能可以进一步扩展,例如添加分页、点赞、删除评论等功能。希望本文能帮助你理解如何在Java中实现评论和回复功能。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。