JavaWeb+MySQL实现简易留言板(详细的很~)

JavaWeb+MySQL实现简易留言板

Hello,各位小伙伴们你们好,我是Bug终结者~,不知不觉,已经放假2周了,一晃来到了一周一更,今天我决定更新文章,今天为大家带来我学习过程中的一些经验,为小伙伴们避坑,下面为大家带来今日分享

留言板需求在这里插入图片描述

上图显示的是评论页面的样式

评论页面主要分为三部分: 登录状态区、 评论区(评论和回复操作的区域)、评论列表区(显示所有的评论、回复,以及翻页控件)

  1. 登录状态区:

    1.1 用户不登录也可以看到该列表,但必须登录才可以发表评论和回复。

    1.2 用户不登录也可以看到评论区

    1.3 用户不登录也可以看到回复按钮

    1.4 用户未登录状态,在评论区上方显示: 注册 和 登录 超级链接,点击分别可以进入注册和登录页面。

    1.5 登录状态,在评论区上方显示: 欢迎 XXXX ,注销 。

    1.6 注销是超级链接,点击注销进入未登录状态。

  2. 评论区:

    2.1 默认显示为发表评论状态。

    2.2 发表评论状态下,只显示 textarea控件 和 发表评论按钮。

    点击某条评论的回复按钮,状态切换为针对该条评论的回复状态。

    2.3 回复状态下,在评论区 textarea 上方将显示:
    我要回复 XXX 在 2021-08-09 19:23 的评论: 听的又123

    2.4 回复状态下,发表评论按钮,变成 发表回复

    2.5 回复状态下,发表评论按钮右侧显示一个按钮“返回评论状态” ,点击将进入评论状态。

    即评论区有两个状态: 评论状态和 回复状态

    2.6 评论状态,发表的是 评论,回复状态是对某条评论回复评论。

    2.7 回复状态是针对某条评论的。

  3. 评论列表:

    显示所有评论的列表。

    显示评论人、评论时间、评论内容。

    每条评论的右侧,有回复按钮,点击回复将进入针对该条评论的 回复状态。

    登录状态下自己发表的评论,右侧有删除按钮

    其他人发表的评论,右侧看不到删除按钮。

    如果评论有回复,则在评论下显示回复列表。

    每条回复显示 回复人、回复时间、回复内容。

    在登录状态下,当前登录人可以看到自己回复记录的右侧有删除按钮。

    评论要实现分页,不需要查询。

看下效果:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

数据表

用户表

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `realname` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci


评论表

CREATE TABLE `t_comment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '评论人id,对应用户表的id',
  `pl_content` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '评论的内容',
  `pl_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci


回复表

CREATE TABLE `t_revert` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pl_id` int(11) NOT NULL COMMENT '评论人id,对应t_comment.id',
  `user_id` int(11) DEFAULT NULL COMMENT '回复人id,对应当前登录的账号.id',
  `hf_content` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '回复的内容',
  `hf_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '回复的时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

项目结构
在这里插入图片描述

部分代码

IndexServlet

@WebServlet("/index")
public class IndexServlet extends HttpServlet{

	public static final Integer pageSize = 5;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获取当前页数
		String strPageNumb = req.getParameter("pageNumb");
		Integer pageNumb = 1;
		if (!StringUtils.isEmpty(strPageNumb)) {
			pageNumb = Integer.valueOf(strPageNumb);
		}
		CommentService commentService = new CommentServiceImpl();
		try {
			PageInfo pager = commentService.page(pageNumb, pageSize);
			req.setAttribute("pager", pager);
			req.getRequestDispatcher("/WEB-INF/comment.jsp")
			.forward(req, resp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

CommentServlet

@WebServlet("/comment")
public class CommentServlet extends HttpServlet{

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获取数据,当前评论人的id,评论的内容
		String content = req.getParameter("content");
		User user = (User)req.getSession().getAttribute("user");
		Integer userId = user.getId();
		CommentService commentService = new CommentServiceImpl();
		try {
			if (commentService.saveComment(userId, content)) {
				resp.sendRedirect(req.getContextPath()+"/index");
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

RevertServlet

@WebServlet("/revert")
public class RevertServlet extends HttpServlet{

	RevertService RevertService = new RevertServiceImpl();
	CommentService CommentService = new CommentServiceImpl();
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获取回复的记录id
		String pl_id = req.getParameter("pl_id");
		try {
			Comment comment = CommentService.queryById(Integer.valueOf(pl_id));
			System.out.println("123");
			req.setAttribute("comment", comment);
			req.getRequestDispatcher("/WEB-INF/revert.jsp")
			.forward(req, resp);
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获取回复的具体信息
		String plId = req.getParameter("pl_id");
		String liuYan = req.getParameter("liuYan");
		System.out.println(plId);
		User user = (User) req.getSession().getAttribute("user");
		Integer userId = user.getId();
		try {
			if (RevertService.saveRevert(plId, liuYan, userId)) {
				resp.sendRedirect(req.getContextPath()+"/index");
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

**Dao层核心代码 **


连接数据库基类

BaseDao

public class BaseDao {

	private static DataSource ds = null;

	public QueryRunner initQueryRunner() throws Exception {
		String dbFile = this.getClass().getClassLoader().getResource("/").getFile();
		dbFile = dbFile.substring(1) + "db.properties";
		
		FileReader fr = new FileReader(dbFile);
		
		Properties pro = new Properties();
		pro.load(fr);
		
//		DataSource ds = DruidDataSourceFactory.createDataSource(pro);
		if (ds == null) {
			ds = DruidDataSourceFactory.createDataSource(pro);
		}
		QueryRunner qur = new QueryRunner(ds);
		System.out.println(ds);
		return qur;
	}
}

CommentDaoImpl

public class CommentDaoImpl extends BaseDao implements CommentDao{

	@Override
	public List<Comment> page(Integer pageNumb, Integer pageSize) throws Exception {
		// TODO Auto-generated method stub
		QueryRunner qur = initQueryRunner();
		String sql = "select * from t_comment order by pl_time desc limit ?, ? ";
		return qur.query(sql, new BeanListHandler<Comment>(Comment.class), (pageNumb - 1) * pageSize, pageSize);
	}

	@Override
	public Comment queryById(Integer id) throws Exception {
		// TODO Auto-generated method stub
		QueryRunner qur = initQueryRunner();
		String sql = "select * from t_comment where id = ?";
		return qur.query(sql, new BeanHandler<Comment>(Comment.class), id);
	}

	@Override
	public Integer delete(String pl_id) throws Exception {
		// TODO Auto-generated method stub
		QueryRunner qur = initQueryRunner();
		String sql = "delete from t_comment where id = ?";
		return qur.update(sql, pl_id);
	}

	@Override
	public Integer saveComment(Integer userId, String content) throws Exception {
		// TODO Auto-generated method stub
		QueryRunner qur = initQueryRunner();
		String sql = "insert into t_comment (user_id, pl_content) values(?, ?)";
		//如果update方法返回的大于0,代表增加成功,返回的小于0代表失败
		return qur.update(sql, userId, content);
	}

	@Override
	public Integer getCount() throws Exception {
		// TODO Auto-generated method stub
		QueryRunner qur = initQueryRunner();
		String sql = "select count(1) from t_comment";
		Long rowCount = qur.query(sql, new ScalarHandler<Long>());
		return rowCount.intValue();
	}

	
}

RevertDaoImpl

public class RevertDaoImpl extends BaseDao implements RevertDao{

	@Override
	public Integer saveRevert(String plId, String liuYan, Integer userId) throws Exception {
		// TODO Auto-generated method stub
		QueryRunner qur = initQueryRunner();
		String sql = "insert into t_revert (pl_id, user_id, hf_content) values(?, ?, ?)";
		System.out.println(plId);
		return qur.update(sql, plId, userId, liuYan);
	}

	@Override
	public List<Revert> getListByCommentId(Integer pl_id) throws Exception {
		// TODO Auto-generated method stub
		QueryRunner qur = initQueryRunner();
		String sql = "select * from t_revert where pl_id = ?";
		return qur.query(sql, new BeanListHandler<Revert>(Revert.class), pl_id);
	}

	@Override
	public Integer delete(String hfId) throws Exception {
		// TODO Auto-generated method stub
		QueryRunner qur = initQueryRunner();
		String sql = "delete from t_revert where id = ?";
		return qur.update(sql, hfId);
	}

}

絮语

今日经验分享到此就要结束了,代码路漫漫,有人与你共赴前行,遇到困难去解决,最后都会化为你宝贵的经验,每周一更,回忆一周内值得写的项目,把代码共享,分享自己做练习的一些思路,好了,本周分享该案例,我们下周见!

都看到这了,点个赞支持一下博主吧~

  • 20
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
好的,以下是一个用Javaweb+mysql的简单留言板实现步骤: 1. 创建数据库和表格: 首先需要在mysql中创建一个名为message_board的数据库,然后在该数据库中创建一个名为messages的表格,表格中包含以下字段:id(主键,自增)、username、content、create_time。 2. 编写前端页面: 创建一个index.jsp页面,其中包含一个表单,用户可以输入用户名和留言内容,以及一个提交按钮。 3. 编写后端处理程序: a. 创建一个servlet,用来处理用户提交的表单数据,将数据存储到数据库中,并重定向到一个新页面。 b. 创建另一个servlet,用来从数据库中取出所有留言,并将它们显示在一个新页面中。 4. 部署应用程序: 将编写好的代码打成war包,然后将其部署到Tomcat等服务器上即可。 以下是代码示例: 1. 创建数据库和表格: ``` CREATE DATABASE message_board; USE message_board; CREATE TABLE messages ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, content TEXT NOT NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` 2. 编写前端页面: index.jsp ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>留言板</title> </head> <body> <h1>留言板</h1> <form action="addMessage" method="post"> <label for="username">用户名:</label> <input type="text" name="username" required><br> <label for="content">留言内容:</label> <textarea name="content" rows="5" required></textarea><br> <input type="submit" value="提交"> </form> <p><a href="showMessages">查看留言</a></p> </body> </html> ``` 3. 编写后端处理程序: AddMessageServlet.java ```java import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AddMessageServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String content = request.getParameter("content"); try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/message_board", "root", "password"); PreparedStatement stmt = conn.prepareStatement("INSERT INTO messages (username, content) VALUES (?, ?)"); stmt.setString(1, username); stmt.setString(2, content); stmt.executeUpdate(); response.sendRedirect("success.jsp"); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); response.sendRedirect("error.jsp"); } } } ``` ShowMessagesServlet.java ```java import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ShowMessagesServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Message> messages = new ArrayList<>(); try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/message_board", "root", "password"); PreparedStatement stmt = conn.prepareStatement("SELECT * FROM messages ORDER BY create_time DESC"); ResultSet rs = stmt.executeQuery(); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String content = rs.getString("content"); String createTime = rs.getString("create_time"); Message message = new Message(id, username, content, createTime); messages.add(message); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); response.sendRedirect("error.jsp"); return; } request.setAttribute("messages", messages); request.getRequestDispatcher("showMessages.jsp").forward(request, response); } } ``` Message.java ```java public class Message { private int id; private String username; private String content; private String createTime; public Message(int id, String username, String content, String createTime) { this.id = id; this.username = username; this.content = content; this.createTime = createTime; } public int getId() { return id; } public String getUsername() { return username; } public String getContent() { return content; } public String getCreateTime() { return createTime; } } ``` 4. 部署应用程序: 将AddMessageServlet.java、ShowMessagesServlet.java、Message.java、index.jsp、success.jsp、showMessages.jsp、error.jsp打包成一个war包,并将其部署到Tomcat等服务器上即可。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bug 终结者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值