您现在的位置是:主页 > news > 网站的留言板怎么做/seo发帖工具

网站的留言板怎么做/seo发帖工具

admin2025/5/8 16:58:33news

简介网站的留言板怎么做,seo发帖工具,建设网站教程全集,丽水高端网站建设文章目录一、项目框架二、前期准备工作三、创建数据库四、连接数据库四、创建实体类五、 Dao类六、功能实现1.使用Themeleaf 模板引擎2.用户登录3.用户注册4.博客列表页5.新增博客6.博客内容页7.删除博客8.注销博客七、前端一、项目框架 二、前期准备工作 建一个 maven 项目ma…

网站的留言板怎么做,seo发帖工具,建设网站教程全集,丽水高端网站建设文章目录一、项目框架二、前期准备工作三、创建数据库四、连接数据库四、创建实体类五、 Dao类六、功能实现1.使用Themeleaf 模板引擎2.用户登录3.用户注册4.博客列表页5.新增博客6.博客内容页7.删除博客8.注销博客七、前端一、项目框架 二、前期准备工作 建一个 maven 项目ma…

文章目录

  • 一、项目框架
  • 二、前期准备工作
  • 三、创建数据库
  • 四、连接数据库
  • 四、创建实体类
  • 五、 Dao类
  • 六、功能实现
    • 1.使用Themeleaf 模板引擎
    • 2.用户登录
    • 3.用户注册
    • 4.博客列表页
    • 5.新增博客
    • 6.博客内容页
    • 7.删除博客
    • 8.注销博客
  • 七、前端

一、项目框架

在这里插入图片描述

二、前期准备工作

  1. 建一个 maven 项目
  2. maven的核心 — pom.xml
    2.1 导入依赖
<dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.12.RELEASE</version></dependency></dependencies>

2.2 默认是jar包,但是maven识别的是war包。需要把jar包改为war包

<packaging>war</packaging>

2.3 修改war包名字

    <build><finalName> myBlog </finalName></build>

2.3 设为utf-8

    <properties><encoding>UTF-8</encoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties>

2.4 在main下建一个 webapp/WEB-INF/web.xml,具体内容为:

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name>
</web-app>

三、创建数据库

create database if not exists myblog;
use myblog;drop table if exists blog;
create table blog (blogId int primary key auto_increment,title varchar(512),content text,userId int,postTime datetime
);drop table if exists user;
create table user (userId int primary key auto_increment,username varchar(50),password varchar(50)
);

创建两张表:blog表和user表
在这里插入图片描述
在这里插入图片描述

四、连接数据库

public class DBUtil {private static final String URL = "jdbc:mysql://127.0.0.1:3306/myblog?characterEncoding=utf8&useSSL=false";private static final String USERNAME = "root";private static final String PASSWORD = "123456";private static DataSource dataSource = null;public static DataSource getDataSource() {// 看一下 dataSource 当前是否已经持有一个实例了.// 如果没有, 就创建一个新的.// 如果有了, 就不必创建新的, 直接返回之前的if (dataSource == null) {MysqlDataSource mysqlDataSource = new MysqlDataSource();mysqlDataSource.setUrl(URL);mysqlDataSource.setUser(USERNAME);mysqlDataSource.setPassword(PASSWORD);dataSource = mysqlDataSource;}return dataSource;}public static Connection getConnection() {try {return getDataSource().getConnection();} catch (SQLException e) {e.printStackTrace();}return null;}//关闭资源   注意关闭顺序public static void close(Connection connection,PreparedStatement statement,ResultSet resultSet) {if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

四、创建实体类

创建 User 实体类

public class User {private int userId;private String username;private String password;public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "dao.User{" +"userId=" + userId +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

创建 Blog 实体类

public class Blog {private int blogId;private String title;private String content;private int userId;private Timestamp postTime;public int getBlogId() {return blogId;}public void setBlogId(int blogId) {this.blogId = blogId;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public Timestamp getPostTime() {return postTime;}public void setPostTime(Timestamp postTime) {this.postTime = postTime;}@Overridepublic String toString() {return "dao.Blog{" +"blogId=" + blogId +", title='" + title + '\'' +", content='" + content + '\'' +", userId=" + userId +", postTime=" + postTime +'}';}
}

五、 Dao类

UserDao 类

public class UserDao {// 注册的时候, 需要新增用户到数据库中.// 规定 username 不能重复// 注册的时候(insert 之前), 先判定该 username 是否已经存在// 如果存在, 就直接不执行后续的 insert 操作// username 的唯一性不一定非得通过 数据库的约束 来完成,也可以通过用户代码来完成public void insert(User user) {// 1. 和数据库建立连接.Connection connection = DBUtil.getConnection();// 2. 拼装 SQLString sql = "insert into user values(null, ?, ?)";PreparedStatement statement = null;try {statement = connection.prepareStatement(sql);statement.setString(1, user.getUsername());statement.setString(2, user.getPassword());// 3. 执行 SQLstatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {// 4. 关闭连接.DBUtil.close(connection, statement, null);}}// 登陆的时候, 需要根据用户名获取到密码public User selectByName(String username) {// 1. 和数据库建立连接.Connection connection = DBUtil.getConnection();// 2. 拼装 SQLString sql = "select * from user where username = ?";PreparedStatement statement = null;ResultSet resultSet = null;try {statement = connection.prepareStatement(sql);statement.setString(1, username);// 3. 执行 SQLresultSet = statement.executeQuery();// 4. 遍历结果集. 预期按照名字查找的结果是唯一的记录.if (resultSet.next()) {User user = new User();user.setUserId(resultSet.getInt("userId"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));return user;}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.close(connection, statement, resultSet);}return null;}// 根据用户 id 来查用户信息public User selectById(int userId) {// 1. 和数据库建立连接.Connection connection = DBUtil.getConnection();// 2. 拼装 SQLString sql = "select * from user where userId = ?";PreparedStatement statement = null;ResultSet resultSet = null;try {statement = connection.prepareStatement(sql);statement.setInt(1, userId);// 3. 执行 SQLresultSet = statement.executeQuery();// 4. 遍历结果集. 预期结果只是有 0 个或者 1 个.if (resultSet.next()) {User user = new User();user.setUserId(resultSet.getInt("userId"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));return user;}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.close(connection, statement, resultSet);}return null;}public static void main(String[] args) {UserDao userDao = new UserDao();// 1. 测试注册功能dao.User user = new dao.User();user.setUsername("aaa");user.setPassword("111");userDao.insert(user);// 2. 测试根据名字查找.
//        dao.User user = userDao.selectByName("bbb");
//        System.out.println(user);// 3. 测试根据 id 查找.
//        dao.User user = userDao.selectById(1);
//        System.out.println(user);}
}

BlogDao 类

public class BlogDao {// 往数据库中新增一个 博客public void insert(dao.Blog blog) {// 1. 和数据库服务器建立连接.Connection con = DBUtil.getConnection();// 2. 拼装 SQLString sql = "insert into blog values(null, ?, ?, ?, now())";PreparedStatement prs = null;try {prs = con.prepareStatement(sql);prs.setString(1, blog.getTitle());prs.setString(2, blog.getContent());prs.setInt(3, blog.getUserId());// 3. 执行 SQLprs.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {// 4. 收尾工作.DBUtil.close(con, prs, null);}}// 从数据库删除博客public void delete(int blogId) {// 1. 和数据库服务器建立连接.Connection con = DBUtil.getConnection();// 2. 拼装 SQLString sql = "delete from blog where blogId = ?";PreparedStatement prs = null;try {prs = con.prepareStatement(sql);prs.setInt(1, blogId);// 3. 执行 SQLprs.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.close(con, prs, null);}}// 从数据库中查找出所有的博客.// 如果博客数目少, 无所谓// 如果博客数目很多, 应该要支持 "分页查询":limit offsetpublic List<dao.Blog> selectAll() {List<dao.Blog> blogs = new ArrayList<dao.Blog>();// 1. 和数据库服务器建立连接.Connection con = DBUtil.getConnection();// 2. 拼装 SQLPreparedStatement prs = null;ResultSet resultSet = null;try {con = DBUtil.getConnection();String sql = "select * from blog order by blogId desc";//排序是为了让新增的博客在前面显示prs = con.prepareStatement(sql);// 3. 执行 SQLresultSet = prs.executeQuery();// 4. 遍历结果集合.while (resultSet.next()) {Blog blog = new dao.Blog();blog.setBlogId(resultSet.getInt("blogId"));blog.setTitle(resultSet.getString("title"));String title = resultSet.getString("title");String content = resultSet.getString("content");//如果博客标题过长,则只显示前10个字符if (title.length() > 10) {title = title.substring(0, 10) + "...";}//如果博客正文内容过长,则只显示前45个字符if (content.length() > 45) {content = content.substring(0, 45) + "...";}blog.setContent(content);blog.setTitle(title);blog.setUserId(resultSet.getInt("userId"));blog.setPostTime(resultSet.getTimestamp("postTime"));blogs.add(blog);}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.close(con, prs, resultSet);}return blogs;}// 从数据库查询出指定的一篇博客.// 实现博客详情页的时候, 需要这个方法.public dao.Blog selectOne(int blogId) {// 1. 和数据库建立连接.Connection con = DBUtil.getConnection();// 2. 拼装 SQLString sql = "select * from blog where blogId = ?";PreparedStatement prs = null;ResultSet resultSet = null;try {prs = con.prepareStatement(sql);prs.setInt(1, blogId);// 3. 执行 SQLresultSet = prs.executeQuery();// 4. 遍历结果集. 要么是 0 个记录, 要么只有 1 条记录.if (resultSet.next()) {dao.Blog blog = new dao.Blog();blog.setBlogId(resultSet.getInt("blogId"));blog.setTitle(resultSet.getString("title"));blog.setContent(resultSet.getString("content"));blog.setUserId(resultSet.getInt("userId"));blog.setPostTime(resultSet.getTimestamp("postTime"));return blog;}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.close(con, prs, resultSet);}return null;}public static void main(String[] args) {// 通过这里的代码对上面的数据库操作进行验证.// 1. 验证插入.// 此处的测试, 只是一个简单的 "冒烟测试"dao.Blog blog = new dao.Blog();blog.setTitle("这是博客标题");blog.setContent("这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文这是博客正文");blog.setUserId(1);BlogDao blogDao = new BlogDao();blogDao.insert(blog);// 2. 验证查找.
//        dao.BlogDao blogDao = new dao.BlogDao();
//        List<dao.Blog> blogs = blogDao.selectAll();
//        System.out.println(blogs);
//        dao.Blog blog = blogDao.selectOne(1);
//        System.out.println(blog);// 3. 验证删除.
//        dao.BlogDao blogDao = new dao.BlogDao();
//        blogDao.delete(1);}
}

六、功能实现

1.使用Themeleaf 模板引擎


@WebListener
public class ThymeleafConfig implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 这个方法就会在当前 webapp 的 ServletContext 初始化之后立即执行. //Thymeleaf 的初始化就在这里调用即可// 初始化 Thymeleaf// 1) 创建一个 engine(引擎), 负责把 Java 中的数据替换到模板中.TemplateEngine engine = new TemplateEngine();// 2) 创建一个 resolver 对象(解析器), 负责找到 html 模板在哪, 并加载到内存中.//    供 engine 对象来使用.ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(sce.getServletContext());// 3) 给 resolver 设置一些属性, 让它能够找到 html 模板.resolver.setCharacterEncoding("utf-8");// Prefix 表示 "前缀", 设定了满足什么样条件的文件被加载到内存中作为 HTML 模板resolver.setPrefix("/WEB-INF/template/");//    Suffix 表示 "后缀"resolver.setSuffix(".html");// 4) 把 resolver 和 engine 关联起来.engine.setTemplateResolver(resolver);// 把初始化好的 engine 对象交给 ServletContext 来保管.ServletContext context = sce.getServletContext();context.setAttribute("engine", engine);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {}
}

2.用户登录

@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");// 1. 从 req 读取用户提交的 username 和 passwordString username = req.getParameter("username");String password = req.getParameter("password");if (username == null || "".equals(username)|| password == null || "".equals(password)) {resp.sendError(404, "用户名或密码不能为空");return;}// 2. 从数据库中查找指定用户名的用户信息.UserDao userDao = new UserDao();User user = userDao.selectByName(username);if (user == null) {resp.sendError(404, "用户名或者密码错误");return;}if (!password.equals(user.getPassword())) {// 密码不匹配resp.sendError(404, "用户名或者密码错误");return;}// 3. 登陆成功! 创建会话.HttpSession session = req.getSession(true);session.setAttribute("user", user);// 4. 直接把用户页面重定向到博客列表页.resp.sendRedirect("blogList");}
}

3.用户注册

@WebServlet("/register")
public class RegisterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");// 1. 先读取用户提交的用户名和密码String username = req.getParameter("username");String password = req.getParameter("password");if (username == null || "".equals(username)|| password == null || "".equals(password)) {resp.sendError(404, "提交的用户名或者密码为空");return;}// 2. 查询数据库, 看看 username 是否存在UserDao userDao = new UserDao();User existsUser = userDao.selectByName(username);if (existsUser != null ) {// 用户已经存在! 提示注册失败!resp.sendError(404, "用户名已经存在,注册失败!");return;}// 3. 构造 dao.User 对象, 插入到数据库中.User newUser = new User();newUser.setUsername(username);newUser.setPassword(password);userDao.insert(newUser);// 4. 返回结果.resp.setContentType("text/html; charset=utf-8");resp.getWriter().write("<h3>注册成功!</h3>");//resp.sendRedirect("login");}
}

4.博客列表页

@WebServlet("/blogList")
public class BlogListServlet extends HttpServlet {@Overridepublic void init() throws ServletException {}//判定用户是否登录private User checkLogin(HttpServletRequest req) {HttpSession session = req.getSession(false);if (session == null) {return null;}User user = (User) session.getAttribute("user");return user;}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 0. 从 req 里面读取一下当前用户信息. 判定用户是否登陆.User user = checkLogin(req);boolean isLogin = false;if (user != null) {isLogin = true;}// 1. 先从数据库查询出都有哪些博客.BlogDao blogDao = new BlogDao();List<Blog> blogList = blogDao.selectAll();// 2. 构造博客页面.// 1) 通过 Thymeleaf 进行渲染. 渲染的时候需要定义 "数据集合" 这样的概念.// WebContext 功能就是把要替换的数据给收集起来, 统一的传给模板引擎.WebContext webContext = new WebContext(req, resp, getServletContext());// 2) setVariable 可以设置多个键值对// 模板里的每个 ${ } 里面的内容都需要在 webContext 设定进去.webContext.setVariable("blogs", blogList);webContext.setVariable("isLogin", isLogin);webContext.setVariable("user", user);// 3) 进行渲染.TemplateEngine engine = (TemplateEngine) getServletContext().getAttribute("engine");String html = engine.process("blog_list", webContext);System.out.println("模板渲染的内容: " + html);resp.setContentType("text/html; charset=utf-8");resp.getWriter().write(html);}
}

5.新增博客

@WebServlet("/blogInsert")
public class BlogInsertServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");// 0. 判定用户是否已经登陆HttpSession session = req.getSession(false);if (session == null) {resp.sendError(404, "当前尚未登陆, 不能发布博客!");return;}User user = (User) session.getAttribute("user");if (user == null) {resp.sendError(404, "当前尚未登陆, 不能发布博客!");return;}// 1. 读取请求中的参数.String title = req.getParameter("title");String content = req.getParameter("content");if (title == null || "".equals(title)|| content == null || "".equals(content)) {resp.sendError(404, "标题或者正文为空");return;}// 2. 根据读到的数据构造 Blog 对象, 并插入数据库Blog blog = new Blog();blog.setTitle(title);blog.setContent(content);blog.setUserId(user.getUserId());BlogDao blogDao = new BlogDao();blogDao.insert(blog);// 3. 重定向到博客列表页resp.sendRedirect("blogList");}
}

6.博客内容页

@WebServlet("/blogContent")
public class BlogContentServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html; charset=utf-8");// 1. 从 req 中读取出 blogIdString blogId = req.getParameter("blogId");if (blogId == null || "".equals(blogId)) {resp.sendError(404, "blogId 参数错误!");return;}// 2. 根据 blogId 在数据库中查询出博客的详细内容.BlogDao blogDao = new BlogDao();Blog blog = blogDao.selectOne(Integer.parseInt(blogId));if (blog == null) {resp.sendError(404, "blogId 指定的文章不存在!");return;}// 3. 根据 blog.userId 找到对应的 dao.User 对象UserDao userDao = new UserDao();User user = userDao.selectById(blog.getUserId());// 4. 根据详细内容, 渲染到模板中.TemplateEngine engine = (TemplateEngine) getServletContext().getAttribute("engine");WebContext webContext = new WebContext(req, resp, getServletContext());webContext.setVariable("blog", blog);webContext.setVariable("username", user.getUsername());String html = engine.process("blog_content", webContext);// 5. 把渲染好的结果写回客户端.resp.getWriter().write(html);}
}

7.删除博客

@WebServlet("/blogDelete")
public class BlogDeleteServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 1. 从 req 中读取要删除的 blogIdString blogId = req.getParameter("blogId");if (blogId == null || "".equals(blogId)) {resp.sendError(404, "blogId 为空!");return;}// 2. 判定用户的登陆状态, 未登陆不能删除.HttpSession session = req.getSession(false);if (session == null) {resp.sendError(404, "当前未登录, 不能删除!");return;}User user = (User) session.getAttribute("user");if (user == null) {resp.sendError(404, "当前未登录, 不能删除!");return;}// 3. 根据 blogId, 查询 blogId 的作者 id, 与当前登陆的用户 id 作比较//    如果不相同,就不能删除BlogDao blogDao = new BlogDao();Blog blog = blogDao.selectOne(Integer.parseInt(blogId));if (blog == null) {resp.sendError(404, "您要删除的博客不存在!!!");return;}if (blog.getUserId() != user.getUserId()) {resp.sendError(403, "不能删除别人的博客哦");return;}// 4. 如果用户相同, 从数据库中删除这个博客blogDao.delete(Integer.parseInt(blogId));// 5. 重定向到博客列表页resp.sendRedirect("blogList");}
}

8.注销博客

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 把当前用户的 session 中的 user 数据删掉.HttpSession session = req.getSession(false);if (session == null) {resp.sendError(404, "当前尚未登陆, 不能注销");return;}session.removeAttribute("user");resp.sendRedirect("blogList");}
}

七、前端

前端页面要根据个人喜好来设定,我审美不怎样就不献丑了

注意:可以把博客列表和博客内容的前端放在 /WEB-INF/template/ 目录下,用 Thymeleaf模板会比较方便一点,也可以自己设计

一个美好的祝愿 秋招顺利!!