JavaWeb 项目 --- 博客系统

x33g5p2x  于2022-05-16 转载在 Java  
字(37.0k)|赞(0)|评价(0)|浏览(619)

1. 创建 maven 项目

创建必要的目录.引入需要的依赖

2. 设计数据库

本系统要存入博客文章的信息,
创建博客表.博客的id,博客的标题,博客的内容,博客的日期,博文的博主id
也要存入用户的信息,
创建用户表,用户id,用户名,用户密码

  1. create database if not exists MyBlogSystem;
  2. use MyBlogSystem;
  3. drop table if exists blog;
  4. -- 创建一个博客表
  5. create table blog (
  6. blogId int primary key auto_increment,
  7. title varchar(1024),
  8. content mediumtext,
  9. postTime datetime,
  10. userId int
  11. );
  12. drop table if exists user;
  13. -- 创建一个用户信息表
  14. create table user (
  15. userId int primary key auto_increment,
  16. username varchar(128) unique,
  17. password varchar(128)
  18. );

3. 封装数据库的操作代码

创建包Dao用来放数据库的代码.

3.1 创建 DBUtil 类

用来连接数据库

  1. package Dao;
  2. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
  3. import javax.sql.DataSource;
  4. import java.sql.Connection;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. public class DBUtil {
  9. private static final String URL = "jdbc:mysql://127.0.0.1:3306/MyBlogSystem?characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
  10. private static final String USERNAME = "root";
  11. private static final String PASSWORD = "0000";
  12. private static volatile DataSource dataSource = null;
  13. private static DataSource getDataSource() {
  14. if(dataSource == null){
  15. synchronized(DBUtil.class){
  16. if(dataSource == null){
  17. dataSource = new MysqlDataSource();
  18. ((MysqlDataSource) dataSource).setURL(URL);
  19. ((MysqlDataSource) dataSource).setUser(USERNAME);
  20. ((MysqlDataSource) dataSource).setPassword(PASSWORD);
  21. }
  22. }
  23. }
  24. return dataSource;
  25. }
  26. public static Connection getConnection() throws SQLException {
  27. return getDataSource().getConnection();
  28. }
  29. public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){
  30. if(resultSet != null){
  31. try {
  32. resultSet.close();
  33. } catch (SQLException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. if(statement != null){
  38. try {
  39. statement.close();
  40. } catch (SQLException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. if(connection != null){
  45. try {
  46. connection.close();
  47. } catch (SQLException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. }

3.2 创建类 Blog (代表一篇博客)

Blog

  1. package Dao;
  2. import java.sql.Timestamp;
  3. public class Blog {
  4. public int blogId;
  5. public String title;
  6. public String content;
  7. public Timestamp postTime;
  8. public int userId;
  9. public int getBlogId() {
  10. return blogId;
  11. }
  12. public void setBlogId(int blogId) {
  13. this.blogId = blogId;
  14. }
  15. public String getTitle() {
  16. return title;
  17. }
  18. public void setTitle(String title) {
  19. this.title = title;
  20. }
  21. public String getContent() {
  22. return content;
  23. }
  24. public void setContent(String content) {
  25. this.content = content;
  26. }
  27. public Timestamp getPostTime() {
  28. return postTime;
  29. }
  30. public void setPostTime(Timestamp postTime) {
  31. this.postTime = postTime;
  32. }
  33. public int getUserId() {
  34. return userId;
  35. }
  36. public void setUserId(int userId) {
  37. this.userId = userId;
  38. }
  39. }

3.3 创建类 User (代表一个用户)

  1. package Dao;
  2. public class User {
  3. public int userId;
  4. public String username;
  5. public String password;
  6. public int getUserId() {
  7. return userId;
  8. }
  9. public void setUserId(int userId) {
  10. this.userId = userId;
  11. }
  12. public String getUserName() {
  13. return username;
  14. }
  15. public void setUserName(String userName) {
  16. this.username = userName;
  17. }
  18. public String getPassWord() {
  19. return password;
  20. }
  21. public void setPassWord(String passWord) {
  22. this.password = passWord;
  23. }
  24. }

3.4 创建类 BlogDao (对博客表进行操作)

  1. package Dao;
  2. import java.sql.*;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class BlogDao {
  6. // 1. 插入一篇博客
  7. public void insert(Blog blog) {
  8. Connection connection = null;
  9. PreparedStatement statement = null;
  10. try {
  11. // 1. 建立连接
  12. connection = DBUtil.getConnection();
  13. // 2. 拼装 SQL 语句
  14. String sql = "insert into blog values(null,?,?,?,?)";
  15. statement = connection.prepareStatement(sql);
  16. statement.setString(1,blog.getTitle());
  17. statement.setString(2,blog.getContent());
  18. statement.setTimestamp(3,blog.getPostTime());
  19. statement.setInt(4,blog.getUserId());
  20. // 3. 执行 SQL 语句
  21. int ret = statement.executeUpdate();
  22. if(ret == 1){
  23. System.out.println("插入成功");
  24. }else {
  25. System.out.println("插入失败");
  26. }
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. } finally {
  30. DBUtil.close(connection,statement,null);
  31. }
  32. }
  33. // 2. 获取全部博客
  34. public List<Blog> selectAll() {
  35. Connection connection = null;
  36. PreparedStatement statement = null;
  37. ResultSet resultSet = null;
  38. List<Blog> list = new ArrayList<>();
  39. try {
  40. // 1. 建立连接
  41. connection = DBUtil.getConnection();
  42. // 2. 拼装 SQL 语句
  43. // 这里加上order by postTime desc 就可以根据时间排序了.
  44. String sql = "select * from blog order by postTime desc ";
  45. statement = connection.prepareStatement(sql);
  46. // 3. 执行 SQL 语句
  47. resultSet = statement.executeQuery();
  48. // 4. 遍历结果集
  49. while (resultSet.next()){
  50. Blog blog = new Blog();
  51. blog.setBlogId(resultSet.getInt("blogId"));
  52. blog.setTitle(resultSet.getString("title"));
  53. blog.setContent(resultSet.getString("content"));
  54. blog.setPostTime(resultSet.getTimestamp("postTime"));
  55. blog.setUserId(resultSet.getInt("userId"));
  56. list.add(blog);
  57. }
  58. } catch (SQLException e) {
  59. e.printStackTrace();
  60. } finally {
  61. DBUtil.close(connection,statement,resultSet);
  62. }
  63. return list;
  64. }
  65. // 3. 获取个人博客
  66. public List<Blog> selectAllPerson(int userId){
  67. Connection connection = null;
  68. PreparedStatement statement = null;
  69. ResultSet resultSet = null;
  70. List<Blog> list = new ArrayList<>();
  71. try {
  72. // 1. 建立连接
  73. connection = DBUtil.getConnection();
  74. // 2. 拼装 SQL 语句
  75. // 这里加上order by postTime desc 就可以根据时间排序了.
  76. String sql = "select * from blog where userId = ? order by postTime desc ";
  77. statement = connection.prepareStatement(sql);
  78. statement.setInt(1,userId);
  79. // 3. 执行 SQL 语句
  80. resultSet = statement.executeQuery();
  81. // 4. 遍历结果集
  82. while (resultSet.next()){
  83. Blog blog = new Blog();
  84. blog.setBlogId(resultSet.getInt("blogId"));
  85. blog.setTitle(resultSet.getString("title"));
  86. blog.setContent(resultSet.getString("content"));
  87. blog.setPostTime(resultSet.getTimestamp("postTime"));
  88. blog.setUserId(resultSet.getInt("userId"));
  89. list.add(blog);
  90. }
  91. } catch (SQLException e) {
  92. e.printStackTrace();
  93. } finally {
  94. DBUtil.close(connection,statement,resultSet);
  95. }
  96. return list;
  97. }
  98. // 4. 根据文章id获取指定博客
  99. public Blog selectOne(int blogId) {
  100. Connection connection = null;
  101. PreparedStatement statement = null;
  102. ResultSet resultSet = null;
  103. try {
  104. // 1. 建立连接
  105. connection = DBUtil.getConnection();
  106. // 2. 拼装 SQL 语句
  107. // 这里加上order by postTime desc 就可以根据时间排序了.
  108. String sql = "select * from blog where blogId = ? ";
  109. statement = connection.prepareStatement(sql);
  110. statement.setInt(1,blogId);
  111. // 3. 执行 SQL 语句
  112. resultSet = statement.executeQuery();
  113. // 4. 遍历结果集
  114. if (resultSet.next()){
  115. Blog blog = new Blog();
  116. blog.setBlogId(resultSet.getInt("blogId"));
  117. blog.setTitle(resultSet.getString("title"));
  118. blog.setContent(resultSet.getString("content"));
  119. blog.setPostTime(resultSet.getTimestamp("postTime"));
  120. blog.setUserId(resultSet.getInt("userId"));
  121. return blog;
  122. }
  123. } catch (SQLException e) {
  124. e.printStackTrace();
  125. } finally {
  126. DBUtil.close(connection,statement,resultSet);
  127. }
  128. return null;
  129. }
  130. // 5. 删除指定文章id的博客
  131. public void delete(int blogId) {
  132. Connection connection = null;
  133. PreparedStatement statement = null;
  134. try {
  135. // 1. 建立连接
  136. connection = DBUtil.getConnection();
  137. // 2. 拼装 SQL 语句
  138. String sql = "delete from blog where blogId = ?";
  139. statement = connection.prepareStatement(sql);
  140. statement.setInt(1,blogId);
  141. // 3. 执行 SQL 语句
  142. int ret = statement.executeUpdate();
  143. if(ret == 1){
  144. System.out.println("删除成功");
  145. }else{
  146. System.out.println("删除失败");
  147. }
  148. } catch (SQLException e) {
  149. e.printStackTrace();
  150. } finally {
  151. DBUtil.close(connection,statement,null);
  152. }
  153. }
  154. // 6. 计算个人文章的总数
  155. public Integer selectTotal(int userId) {
  156. Connection connection = null;
  157. PreparedStatement statement = null;
  158. ResultSet resultSet = null;
  159. try {
  160. // 1. 建立连接
  161. connection = DBUtil.getConnection();
  162. // 2. 拼装 SQL 语句
  163. String sql = "select count(userId) from blog where userId = ?";
  164. statement = connection.prepareStatement(sql);
  165. statement.setInt(1,userId);
  166. // 3. 执行 SQL 语句
  167. resultSet = statement.executeQuery();
  168. // 4. 遍历结果集
  169. if (resultSet.next()){
  170. return resultSet.getInt("count(userId)");
  171. }
  172. } catch (SQLException e) {
  173. e.printStackTrace();
  174. } finally {
  175. DBUtil.close(connection,statement,resultSet);
  176. }
  177. return null;
  178. }
  179. public static void main(String[] args) {
  180. BlogDao blogDao = new BlogDao();
  181. Blog blog = new Blog();
  182. blog.setContent("你好");
  183. blog.setTitle("你好");
  184. blog.setUserId(1);
  185. blog.setPostTime(new Timestamp(System.currentTimeMillis()));
  186. blogDao.insert(blog);
  187. System.out.println(blogDao.selectAll());
  188. }
  189. }

3.5 创建类 UserDao (对用户表进行操作)

  1. package Dao;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. public class UserDao {
  7. // 注册账号
  8. public void insert(User user){
  9. Connection connection = null;
  10. PreparedStatement statement = null;
  11. try {
  12. // 1. 建立连接
  13. connection = DBUtil.getConnection();
  14. // 2. 拼装 SQL 语句
  15. String sql = "insert into user values (null,?,?)";
  16. statement = connection.prepareStatement(sql);
  17. statement.setString(1,user.getUserName());
  18. statement.setString(2, user.getPassWord());
  19. // 3. 执行 SQL 语句
  20. int ret = statement.executeUpdate();
  21. if(ret == 1){
  22. System.out.println("注册成功!");
  23. }else{
  24. System.out.println("注册失败!");
  25. }
  26. } catch (SQLException e) {
  27. e.printStackTrace();
  28. } finally {
  29. DBUtil.close(connection,statement,null);
  30. }
  31. }
  32. // 通过用户名查找
  33. public User selectByName(String username){
  34. Connection connection = null;
  35. PreparedStatement statement = null;
  36. ResultSet resultSet = null;
  37. try {
  38. // 1. 建立连接
  39. connection = DBUtil.getConnection();
  40. // 2. 拼装 SQL 语句
  41. String sql = "select * from user where username = ?";
  42. statement = connection.prepareStatement(sql);
  43. statement.setString(1,username);
  44. // 3. 执行 SQL 语句
  45. resultSet = statement.executeQuery();
  46. // 4. 查找结果集
  47. if (resultSet.next()){
  48. User user = new User();
  49. user.setUserId(resultSet.getInt("userId"));
  50. user.setUserName(resultSet.getString("username"));
  51. user.setPassWord(resultSet.getString("password"));
  52. return user;
  53. }
  54. } catch (SQLException e) {
  55. e.printStackTrace();
  56. } finally {
  57. DBUtil.close(connection,statement,resultSet);
  58. }
  59. return null;
  60. }
  61. // 通过用户id查找
  62. public User selectById(int userId){
  63. Connection connection = null;
  64. PreparedStatement statement = null;
  65. ResultSet resultSet = null;
  66. try {
  67. // 1. 建立连接
  68. connection = DBUtil.getConnection();
  69. // 2. 拼装 SQL 语句
  70. String sql = "select * from user where userId = ?";
  71. statement = connection.prepareStatement(sql);
  72. statement.setInt(1,userId);
  73. // 3. 执行 SQL 语句
  74. resultSet = statement.executeQuery();
  75. // 4. 遍历结果集
  76. if (resultSet.next()){
  77. User user = new User();
  78. user.setUserId(resultSet.getInt("userId"));
  79. user.setUserName(resultSet.getString("username"));
  80. user.setPassWord(resultSet.getString("password"));
  81. return user;
  82. }
  83. } catch (SQLException e) {
  84. e.printStackTrace();
  85. } finally {
  86. DBUtil.close(connection,statement,resultSet);
  87. }
  88. return null;
  89. }
  90. }

4. 初始化 TemplateEngine

  1. package View;
  2. import org.thymeleaf.TemplateEngine;
  3. import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletContextEvent;
  6. import javax.servlet.ServletContextListener;
  7. import javax.servlet.annotation.WebListener;
  8. @WebListener
  9. public class ThymeleafConfig implements ServletContextListener {
  10. @Override
  11. public void contextInitialized(ServletContextEvent servletContextEvent) {
  12. ServletContext context = servletContextEvent.getServletContext();
  13. // 1. 创建 engine 实例
  14. TemplateEngine engine = new TemplateEngine();
  15. // 2. 创建 resolve 对象
  16. ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(context);
  17. resolver.setCharacterEncoding("utf-8");
  18. resolver.setPrefix("/WEB-INF/template/");
  19. resolver.setSuffix(".html");
  20. // 3. 把 resolve 对象和 engine 关联起来
  21. engine.setTemplateResolver(resolver);
  22. // 4. 把 engine 放到 ServletContext;
  23. context.setAttribute("engine",engine);
  24. }
  25. @Override
  26. public void contextDestroyed(ServletContextEvent servletContextEvent) {
  27. }
  28. }

5. 实现主页界面

观看可以看出,内容的部分是动态的,其他都是静态的.(用户个人界面暂不管)

5.1 创建网页模板

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <link rel="stylesheet" href="css/list.css">
  9. <link rel="stylesheet" href="css/common.css">
  10. </head>
  11. <body>
  12. <div class="nav">
  13. <img src="image/2.png" alt="头像">
  14. <span class="title">我的博客系统</span>
  15. <a href="home.html">主页</a>
  16. <a href="edit.html">创作</a>
  17. <a href="login.html">注销</a>
  18. </div>
  19. <div class="parent">
  20. <div class="left">
  21. <div class="card">
  22. <img src="image/头像.jpg">
  23. <span class="name">蜡笔小新</span>
  24. <a href="#">github 地址</a>
  25. <div class='one'>
  26. <span>文章</span>
  27. <span>分类</span>
  28. </div>
  29. <div class='one'>
  30. <span>2</span>
  31. <span>1</span>
  32. </div>
  33. </div>
  34. </div>
  35. <div class="right">
  36. <div class="article" th:each="blog : ${blogs}">
  37. <h2 class="title" th:text="${blog.title}">我的第一篇博客</h2>
  38. <span class="date" th:text="${blog.postTime}">2022-4-17</span>
  39. <div class="desc" th:text="${blog.content}">今天开始我要认真写博客</div>
  40. <a th:href="${'details.html?blogId=' + blog.blogId}" class="more" >查看全文&gt;&gt;</a>
  41. </div>
  42. </div>
  43. </div>
  44. </body>
  45. </html>

5.2 创建 IndexServlet

  1. package View;
  2. import Dao.Blog;
  3. import Dao.BlogDao;
  4. import org.thymeleaf.TemplateEngine;
  5. import org.thymeleaf.context.WebContext;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.util.List;
  13. @WebServlet("/index.html")
  14. public class IndexServlet extends HttpServlet {
  15. @Override
  16. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  17. resp.setContentType("text/html;charset=utf-8");
  18. // 1.从数据库拿到所有的博客列表
  19. BlogDao blogDao = new BlogDao();
  20. List<Blog> blogs = blogDao.selectAll();
  21. // 2.通过模板引擎渲染页面
  22. TemplateEngine engine = (TemplateEngine) getServletContext().getAttribute("engine");
  23. WebContext webContext = new WebContext(req,resp,getServletContext());
  24. webContext.setVariable("blogs",blogs);
  25. engine.process("index",webContext, resp.getWriter());
  26. }
  27. }

5.3 发现问题

插入太多会超出文章的页面

在之前css里面加上 overflow: auto 就有一个滚动条了

发现显示的内容每次显示的情况不一样

只需更改 SelectAll()中的代码.这里的80是随便设置的

6. 实现详情页界面

6.1 创建网页模板

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <link rel="stylesheet" href="css/moreList.css">
  9. <link rel="stylesheet" href="css/common.css">
  10. </head>
  11. <body>
  12. <div class="nav">
  13. <img src="image/2.png" alt="头像">
  14. <span class="title">我的博客系统</span>
  15. <a href="home.html">主页</a>
  16. <a href="edit.html">创作</a>
  17. <a href="login.html">注销</a>
  18. </div>
  19. <div class="parent">
  20. <div class="left">
  21. <div class="card">
  22. <img src="image/头像.jpg">
  23. <span class="name">蜡笔小新</span>
  24. <a href="#">github 地址</a>
  25. <div class='one'>
  26. <span>文章</span>
  27. <span>分类</span>
  28. </div>
  29. <div class='one'>
  30. <span>2</span>
  31. <span>1</span>
  32. </div>
  33. </div>
  34. </div>
  35. <div class="right">
  36. <div class="article">
  37. <h2 class="title" th:text="${blog.title}">我的第一篇博客</h2>
  38. <span class="date" th:text="${blog.postTime}">2022-4-17</span>
  39. <div class="desc" th:text="${blog.content}">1</div>
  40. </div>
  41. </div>
  42. </div>
  43. </body>
  44. </html>

6.2 创建 DetailsServlet

  1. package View;
  2. import Dao.Blog;
  3. import Dao.BlogDao;
  4. import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;
  5. import org.thymeleaf.TemplateEngine;
  6. import org.thymeleaf.context.WebContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.annotation.WebServlet;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.io.IOException;
  13. @WebServlet("/details.html")
  14. public class DetailsServlet extends HttpServlet {
  15. @Override
  16. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  17. resp.setContentType("text/html;charset=utf-8");
  18. String str = req.getParameter("blogId");
  19. if(str == null || str.length() == 0){
  20. resp.getWriter().write("blogId缺失!");
  21. return;
  22. }
  23. int blogId = Integer.parseInt(str);
  24. BlogDao blogDao = new BlogDao();
  25. Blog blog = blogDao.selectOne(blogId);
  26. if(blog == null){
  27. resp.getWriter().write("当前博客不存在!");
  28. return;
  29. }
  30. TemplateEngine engine = (TemplateEngine) getServletContext().getAttribute("engine");
  31. WebContext webContext = new WebContext(req,resp,getServletContext());
  32. webContext.setVariable("blog",blog);
  33. engine.process("details",webContext,resp.getWriter());
  34. }
  35. }

7. 实现博客登录界面

7.1 修改之前的前端代码

7.2 创建 LoginServlet

  1. package View;
  2. import Dao.User;
  3. import Dao.UserDao;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10. import java.io.IOException;
  11. @WebServlet("/login")
  12. public class LoginServlet extends HttpServlet {
  13. @Override
  14. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  15. resp.setContentType("text/html;charset=utf-8");
  16. // 1. 获取用户名密码
  17. String username = req.getParameter("username");
  18. String password = req.getParameter("password");
  19. // 2. 判断用户名密码是否为空
  20. if(username == null || "".equals(username) || password == null || "".equals(password)){
  21. resp.getWriter().write("<h3>用户名或者密码为空,登录失败!</h3>");
  22. return;
  23. }
  24. // 3. 判断输入的用户名或者密码是否正确
  25. UserDao userDao = new UserDao();
  26. User user = userDao.selectByName(username);
  27. if(user == null){
  28. resp.getWriter().write("<h3>用户名或者密码错误,登录失败!</h3>");
  29. return;
  30. }
  31. if(!user.getPassWord().equals(password)){
  32. resp.getWriter().write("<h3>用户名或者密码错误,登录失败!</h3>");
  33. return;
  34. }
  35. // 4. 登陆成功,就把user存到HttpSession中
  36. HttpSession session = req.getSession(true);
  37. session.setAttribute("user",user);
  38. // 5. 重定向到主页
  39. resp.sendRedirect("index.html");
  40. }
  41. }

8. 实现博客的注销功能

8.1 创建 LogoutServlet 类

  1. package View;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. @WebServlet("/logout")
  10. public class LogoutServlet extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. resp.setContentType("text/html;charset=utf-8");
  14. // 1. 检查当前的用户是否登录
  15. HttpSession session = req.getSession(false);
  16. if(session == null){
  17. resp.getWriter().write("<h3>当前未登录</h3>");
  18. return;
  19. }
  20. // 2. 删除user
  21. session.removeAttribute("user");
  22. // 3. 重定向到登录页面
  23. resp.sendRedirect("login.html");
  24. }
  25. }

9. 实现博客的注册功能

9.1 创建前端页面

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport"
  6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>Document</title>
  9. <link rel="stylesheet" href="css/common.css">
  10. <link rel="stylesheet" href="css/login.css">
  11. </head>
  12. <body>
  13. <div class="nav">
  14. <img src="image/logo.png" alt="头像">
  15. <span class="title">我的博客系统</span>
  16. <a href="index.html">主页</a>
  17. <a href="edit.html">创作</a>
  18. <a href="register.html">注册</a>
  19. </div>
  20. <div id="one">
  21. <div class="login">
  22. <form action="register" method="post">
  23. <div class="text">注册</div>
  24. <div class="one"><span class="name">用户名</span><input type="text" class="user" name="username"></div>
  25. <div class="one"><span class="name">密码</span><input type="password" class="password" name="password1"></div>
  26. <div class="one"><span class="name">确认密码</span><input type="password" class="password" name="password2"></div>
  27. <div class="submit"><input type="submit" value="注 册" ></div>
  28. </form>
  29. </div>
  30. </div>
  31. </body>
  32. </html>

9.2 创建 RegisterServlet

  1. package View;
  2. import Dao.User;
  3. import Dao.UserDao;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. @WebServlet("/register")
  11. public class RegisterServlet extends HttpServlet {
  12. @Override
  13. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. resp.setContentType("text/html; charset=utf-8");
  15. // 1. 获取输入的用户名和密码
  16. String username = req.getParameter("username");
  17. String password1 = req.getParameter("password1");
  18. String password2 = req.getParameter("password2");
  19. // 2. 如果有一个为空就注册失败
  20. if (username == null || password1 == null || password2 == null || "".equals(username) || "".equals(password1) || "".equals(password2)) {
  21. resp.getWriter().write("<h3>输入有误!注册失败!</h3>");
  22. return;
  23. }
  24. UserDao userDao = new UserDao();
  25. User user = userDao.selectByName(username);
  26. // 如果user不为空.表示有人注册了
  27. if(user!=null){
  28. resp.getWriter().write("<h3>用户名已经被使用了</h3>");
  29. return;
  30. }
  31. // 如果两次密码不一致注册失败
  32. if(!password1.equals(password2)){
  33. resp.getWriter().write("<h3>两次输入的密码不一致,注册失败!");
  34. return;
  35. }
  36. // 这里就注册成功了
  37. User user1 = new User();
  38. user1.setUserName(username);
  39. user1.setPassWord(password1);
  40. userDao.insert(user1);
  41. resp.sendRedirect("login.html");
  42. }
  43. }

10. 实现博客编辑界面

10.1 修改之前前端代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <link rel="stylesheet" href="css/common.css">
  9. <link rel="stylesheet" href="css/edit.css">
  10. <!-- 引入 editor.md 的依赖 -->
  11. <link rel="stylesheet" href="editor.md/css/editormd.min.css" />
  12. <script src="js/jquery.min.js"></script>
  13. <script src="editor.md/lib/marked.min.js"></script>
  14. <script src="editor.md/lib/prettify.min.js"></script>
  15. <script src="editor.md/editormd.js"></script>
  16. </head>
  17. <body>
  18. <div class="nav">
  19. <img src="image/2.png" alt="头像">
  20. <span class="title">我的博客系统</span>
  21. <a href="index.html">主页</a>
  22. <a href="edit.html">创作</a>
  23. <a href="logout">注销</a>
  24. </div>
  25. <div class="leader">
  26. <form action="edit" method="post" style="height:100%">
  27. <div class="empOne">
  28. <input type="text" class="title" value="在这里写下文章标题" onblur="if(this.value == '')this.value='在这里写下文章标题';" onclick="if(this.value == '在这里写下文章标题')this.value='';" name="title">
  29. <input type="submit" value="发布文章" class="publish">
  30. </div>
  31. <div id="editor">
  32. <textarea name="content" style="display:none;"></textarea>
  33. </div>
  34. </form>
  35. </div>
  36. <script>
  37. // 初始化编辑器
  38. var editor = editormd("editor", {
  39. // 这里的尺寸必须在这里设置. 设置样式会被 editormd 自动覆盖掉.
  40. width: "100%",
  41. // 高度 100% 意思是和父元素一样高. 要在父元素的基础上去掉标题编辑区的高度
  42. height: "calc(100% - 75px)",
  43. // 编辑器中的初始内容
  44. markdown: "# 在这里写下一篇博客",
  45. // 指定 editor.md 依赖的插件路径
  46. path: "editor.md/lib/",
  47. saveHTMLToTextarea: true
  48. });
  49. </script>
  50. </body>
  51. </html>

10.2 实现 EditServlet

  1. package View;
  2. import Dao.Blog;
  3. import Dao.BlogDao;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. import java.sql.Timestamp;
  11. @WebServlet("/edit")
  12. public class EditServlet extends HttpServlet {
  13. @Override
  14. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  15. resp.setContentType("text/html;charset=utf-8");
  16. // 1. 获取参数
  17. String title = req.getParameter("title");
  18. String content = req.getParameter("content");
  19. // 2. 判断是否存在
  20. if(title==null || "".equals(title) || content==null || "".equals(content)){
  21. resp.getWriter().write("<h3>文章标题或者内容不存在</h3>");
  22. return;
  23. }
  24. // 插入到数据库中
  25. Blog blog = new Blog();
  26. blog.setContent(content);
  27. blog.setTitle(title);
  28. blog.setPostTime(new Timestamp(System.currentTimeMillis()));
  29. BlogDao blogDao = new BlogDao();
  30. blogDao.insert(blog);
  31. // 重定向
  32. resp.sendRedirect("index.html");
  33. }
  34. }

11. 实现博客的删除功能

11.1 查看博客详情页

根据这里的blogId查找当前的userId,如果登录的userId等于当前的userId 就有删除按钮

前端改进

添加样式

  1. #deleteA {
  2. margin: 5px;
  3. display: block;
  4. text-align: center;
  5. color:black;
  6. text-decoration: none;
  7. }
  8. #deleteA:hover{
  9. background-color: rgba(206, 144, 64, 0.8);
  10. }

修改 DetailsServlet

11.2 创建 DeleteServlet

  1. package View;
  2. import Dao.BlogDao;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. @WebServlet("/delete")
  10. public class DeleteServlet extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. resp.setContentType("text/html;charset=utf-8");
  14. String str = req.getParameter("blogId");
  15. int blogId = Integer.parseInt(str);
  16. BlogDao blogDao = new BlogDao();
  17. blogDao.delete(blogId);
  18. resp.sendRedirect("index.html");
  19. }
  20. }

12. 改进

12.1 点击每个页面的时候,判断是否登录了

12.1.1 创建一个 Util类

  1. package common;
  2. import Dao.User;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpSession;
  5. public class Util {
  6. public static User checkLoginStatus (HttpServletRequest req){
  7. // 判断是否登录了. 如果能够拿到 Session, 并且拿到 Session 里的 user对象,就认为是登录状态
  8. HttpSession session = req.getSession(false);
  9. if(session == null){
  10. // 没有登录的情况
  11. return null;
  12. }
  13. User user = (User) session.getAttribute("user");
  14. return user;
  15. }
  16. }

12.1.2 改进各个界面的代码

12.2 对个人资料的名字进行修改.

12.3 内容没有支持markdown语法

12.3.1 修改details.html的代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <link rel="stylesheet" href="css/moreList.css">
  9. <link rel="stylesheet" href="css/common.css">
  10. <!-- 引入 editor.md 的依赖 -->
  11. <link rel="stylesheet" href="editor.md/css/editormd.min.css" />
  12. <script src="js/jquery.min.js"></script>
  13. <script src="editor.md/lib/marked.min.js"></script>
  14. <script src="editor.md/lib/prettify.min.js"></script>
  15. <script src="editor.md/editormd.js"></script>
  16. </head>
  17. <body>
  18. <div class="nav">
  19. <img src="image/2.png" alt="头像">
  20. <span class="title">我的博客系统</span>
  21. <a href="index.html">主页</a>
  22. <a href="personlist.html">我的</a>
  23. <a href="edit.html">创作</a>
  24. <a href="logout">注销</a>
  25. </div>
  26. <div class="parent">
  27. <div class="left">
  28. <div class="card">
  29. <img src="image/头像.jpg">
  30. <span class="name" th:text="${user.username}">蜡笔小新</span>
  31. <a href="#">github 地址</a>
  32. <div class='one'>
  33. <span>文章</span>
  34. <span>分类</span>
  35. </div>
  36. <div class='one'>
  37. <span>2</span>
  38. <span>1</span>
  39. </div>
  40. </div>
  41. </div>
  42. <div class="right">
  43. <div class="article">
  44. <h2 class="title" th:text="${blog.title}">我的第一篇博客</h2>
  45. <span class="date" th:text="${blog.postTime}">2022-4-17</span>
  46. <a th:href="${'delete?blogId=' + blog.blogId}" id="deleteA" th:if="${showDelete}">删除文章</a>
  47. <div class="desc" id="content" th:text="${blog.content}" style="background-color: transparent;"></div>
  48. </div>
  49. </div>
  50. </div>
  51. <script>
  52. function renderMD() {
  53. let contentDiv = document.querySelector('#content');
  54. let markdown = contentDiv.innerHTML;
  55. // 1把contentDiv清空
  56. contentDiv.innerHTML = '';
  57. editormd.markdownToHTML('content',{
  58. markdown: markdown
  59. });
  60. }
  61. renderMD();
  62. </script>
  63. </body>
  64. </html>

12.4 在左侧动态的显示自己的文章总数

13. 添加个人主页功能

13.1 创建前端代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <link rel="stylesheet" href="css/list.css">
  9. <link rel="stylesheet" href="css/common.css">
  10. </head>
  11. <body>
  12. <div class="nav">
  13. <img src="image/2.png" alt="头像">
  14. <span class="title">我的博客系统</span>
  15. <a href="index.html">主页</a>
  16. <a href="personlist.html">个人主页</a>
  17. <a href="edit.html">创作</a>
  18. <a href="logout">注销</a>
  19. </div>
  20. <div class="parent">
  21. <div class="left">
  22. <div class="card">
  23. <img src="image/头像.jpg">
  24. <span class="name" th:text="${user.username}">蜡笔小新</span>
  25. <a href="#">github 地址</a>
  26. <div class='one'>
  27. <span>文章</span>
  28. <span>分类</span>
  29. </div>
  30. <div class='one'>
  31. <span>2</span>
  32. <span>1</span>
  33. </div>
  34. </div>
  35. </div>
  36. <div class="right">
  37. <div class="article" th:each="blog : ${blogs}">
  38. <h2 class="title" th:text="${blog.title}">我的第一篇博客</h2>
  39. <span class="date" th:text="${blog.postTime}">2022-4-17</span>
  40. <div class="desc" th:text="${blog.content}">.</div>
  41. <a th:href="${'details.html?blogId=' + blog.blogId}" class="more">查看全文&gt;&gt;</a>
  42. </div>
  43. </div>
  44. </div>
  45. </body>
  46. </html>

13.2 创建 PersonServlet

  1. package View;
  2. import Dao.Blog;
  3. import Dao.BlogDao;
  4. import Dao.User;
  5. import Dao.UserDao;
  6. import common.Util;
  7. import org.thymeleaf.TemplateEngine;
  8. import org.thymeleaf.context.WebContext;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.annotation.WebServlet;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import java.io.IOException;
  15. import java.util.List;
  16. @WebServlet("/personlist.html")
  17. public class PersonServlet extends HttpServlet {
  18. @Override
  19. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  20. resp.setContentType("text/html;charset=utf-8");
  21. User user = Util.checkLoginStatus(req);
  22. if(user == null){
  23. resp.sendRedirect("login.html");
  24. return;
  25. }
  26. BlogDao blogDao = new BlogDao();
  27. List<Blog> blogs = blogDao.selectAllPerson(user.getUserId());
  28. TemplateEngine engine = (TemplateEngine) getServletContext().getAttribute("engine");
  29. WebContext webContext = new WebContext(req,resp,getServletContext());
  30. webContext.setVariable("blogs",blogs);
  31. engine.process("personlist",webContext,resp.getWriter());
  32. }
  33. }

14. 实现博客的编辑功能

14.1 修改博客详情页的前端代码

14.2 在数据中实现修改博客的操作

  1. public void update(Blog blog){
  2. Connection connection = null;
  3. PreparedStatement statement = null;
  4. try {
  5. // 1. 建立连接
  6. connection = DBUtil.getConnection();
  7. // 2. 拼装 SQL 语句
  8. String sql = "update blog set content = ? ,title = ?,postTime = ? where blogId = ?";
  9. statement = connection.prepareStatement(sql);
  10. statement.setString(1,blog.getContent());
  11. statement.setString(2,blog.getTitle());
  12. statement.setTimestamp(3,blog.getPostTime());
  13. statement.setInt(4,blog.getBlogId());
  14. // 3. 执行 SQL 语句
  15. int ret = statement.executeUpdate();
  16. if(ret == 1){
  17. System.out.println("编辑成功");
  18. }else{
  19. System.out.println("编辑失败");
  20. }
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. } finally {
  24. DBUtil.close(connection,statement,null);
  25. }
  26. }

14.3 编写一个编辑的界面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <link rel="stylesheet" href="css/common.css">
  9. <link rel="stylesheet" href="css/edit.css">
  10. <!-- 引入 editor.md 的依赖 -->
  11. <link rel="stylesheet" href="editor.md/css/editormd.min.css" />
  12. <script src="js/jquery.min.js"></script>
  13. <script src="editor.md/lib/marked.min.js"></script>
  14. <script src="editor.md/lib/prettify.min.js"></script>
  15. <script src="editor.md/editormd.js"></script>
  16. </head>
  17. <body>
  18. <div class="nav">
  19. <img src="image/2.png" alt="头像">
  20. <span class="title">我的博客系统</span>
  21. <a href="index.html">主页</a>
  22. <a href="personlist.html">我的</a>
  23. <a href="edit.html">创作</a>
  24. <a href="logout">注销</a>
  25. </div>
  26. <div class="leader">
  27. <form th:action="${'update?blogId=' + blog.blogId}" method="post" style="height:100%">
  28. <div class="empOne">
  29. <input type="text" class="title" th:value="${blog.title}" name="title">
  30. <input type="submit" value="发布文章" class="publish">
  31. </div>
  32. <div id="editor">
  33. <textarea name="content" style="display:none;" th:text="${blog.content}"></textarea>
  34. </div>
  35. </form>
  36. </div>
  37. <script>
  38. // 初始化编辑器
  39. var editor = editormd("editor", {
  40. // 这里的尺寸必须在这里设置. 设置样式会被 editormd 自动覆盖掉.
  41. width: "100%",
  42. // 高度 100% 意思是和父元素一样高. 要在父元素的基础上去掉标题编辑区的高度
  43. height: "calc(100% - 75px)",
  44. // 指定 editor.md 依赖的插件路径
  45. path: "editor.md/lib/",
  46. saveHTMLToTextarea: true
  47. });
  48. </script>
  49. </body>
  50. </html>

14.4 实现 UpdateServlet

这里的 doget 请求是进入编辑页
dopost请求是提交编辑后的内容

  1. package View;
  2. import Dao.Blog;
  3. import Dao.BlogDao;
  4. import Dao.User;
  5. import common.Util;
  6. import org.thymeleaf.TemplateEngine;
  7. import org.thymeleaf.context.WebContext;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.annotation.WebServlet;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import java.io.IOException;
  14. import java.sql.Timestamp;
  15. @WebServlet("/update")
  16. public class UpdateServlet extends HttpServlet{
  17. @Override
  18. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  19. resp.setContentType("text/html;charset=utf-8");
  20. String str = req.getParameter("blogId");
  21. if(str==null || "".equals(str)){
  22. resp.getWriter().write("<h3>博客Id不存在</h3>");
  23. return;
  24. }
  25. int blogId = Integer.parseInt(str);
  26. BlogDao blogDao = new BlogDao();
  27. Blog blog = blogDao.selectOne(blogId);
  28. if(blog == null){
  29. resp.getWriter().write("<h3>博文不存在</h3>");
  30. return;
  31. }
  32. TemplateEngine engine = (TemplateEngine) getServletContext().getAttribute("engine");
  33. WebContext webContext = new WebContext(req,resp,getServletContext());
  34. webContext.setVariable("blog",blog);
  35. engine.process("alter",webContext,resp.getWriter());
  36. }
  37. @Override
  38. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  39. resp.setContentType("text/html;charset=utf-8");
  40. req.setCharacterEncoding("utf-8");
  41. User user = Util.checkLoginStatus(req);
  42. if(user == null){
  43. resp.sendRedirect("login.html");
  44. return;
  45. }
  46. // 1. 获取参数
  47. String title = req.getParameter("title");
  48. String content = req.getParameter("content");
  49. String str = req.getParameter("blogId");
  50. if(str==null || "".equals(str)){
  51. System.out.println("blogId不存在");
  52. return;
  53. }
  54. int blogId = Integer.parseInt(str);
  55. // 2. 判断是否存在
  56. if(title==null || "".equals(title) || content==null || "".equals(content)){
  57. resp.getWriter().write("<h3>文章标题或者内容不存在</h3>");
  58. return;
  59. }
  60. // 插入到数据库中
  61. Blog blog = new Blog();
  62. blog.setContent(content);
  63. blog.setTitle(title);
  64. blog.setPostTime(new Timestamp(System.currentTimeMillis()));
  65. blog.setBlogId(blogId);
  66. BlogDao blogDao = new BlogDao();
  67. blogDao.update(blog);
  68. // 重定向
  69. resp.sendRedirect("personlist.html");
  70. }
  71. }

相关文章

最新文章

更多