java怎么实现评论和回复功能

发布时间:2022-06-20 11:43:45 作者:iii
来源:亿速云 阅读:293

Java怎么实现评论和回复功能

在Web应用程序中,评论和回复功能是非常常见的需求。无论是社交媒体、博客还是电子商务网站,用户通常都需要对内容进行评论,并且可以对其他用户的评论进行回复。本文将介绍如何使用Java实现一个简单的评论和回复功能。

1. 数据库设计

首先,我们需要设计数据库表来存储评论和回复信息。通常,评论和回复可以存储在同一张表中,通过一个字段来区分它们。

1.1 评论表设计

我们可以设计一个comments表,包含以下字段:

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)
);

1.2 用户表设计

为了简化示例,我们假设已经有一个users表来存储用户信息:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL
);

2. Java实体类设计

接下来,我们需要在Java中创建对应的实体类。

2.1 用户实体类

public class User {
    private int id;
    private String username;
    private String email;

    // Getters and Setters
}

2.2 评论实体类

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
}

3. 数据访问层(DAO)

我们需要创建一个DAO类来操作数据库中的评论数据。

3.1 评论DAO接口

import java.util.List;

public interface CommentDao {
    List<Comment> getCommentsByParentId(int parentId);
    void addComment(Comment comment);
    Comment getCommentById(int id);
}

3.2 评论DAO实现类

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;
    }
}

4. 服务层

服务层负责处理业务逻辑,例如获取评论树、添加评论等。

4.1 评论服务接口

import java.util.List;

public interface CommentService {
    List<Comment> getCommentTree();
    void addComment(Comment comment);
}

4.2 评论服务实现类

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);
    }
}

5. 控制器层

控制器层负责处理HTTP请求,并将请求转发给服务层。

5.1 评论控制器

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);
    }
}

6. 前端展示

在前端,我们可以使用递归的方式来展示评论树。以下是一个简单的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>

7. 总结

通过以上步骤,我们实现了一个简单的评论和回复功能。这个功能可以进一步扩展,例如添加分页、点赞、删除评论等功能。希望本文能帮助你理解如何在Java中实现评论和回复功能。

推荐阅读:
  1. mongodb评论回复的相关设计
  2. 原生js实现回复评论功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:html5注释有没有快捷键

下一篇:html5的data属性有什么作用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》