当前位置:   article > 正文

博客网站/部署服务器---继上篇前端页面接入后端

博客网站/部署服务器---继上篇前端页面接入后端

目录

准备工作

创建用户类博客类与连接数据库

创建博客类

创建用户类

创建连接数据库工具类

实现对数据库数据博客的操作

实现对数据库用户的操作

创建数据库语句

登录页面

前端

后端

博客列表

前端

注销登录

写入数据

判断用户是否登录

替换页面用户昵称

后端

处理注销登录 LogoutServlet/doGet

处理获取所有博客 BlogServlet/doGet

处理判断用户是否登录 loginServlet/doGet

处理替换页面用户昵称 UserinfoServlet/doGet

博客详情页

前端

注销登录

查询博客

判断用户是否登录

将博客详情页昵称替换为当前博客作者昵称/是否显示删除博客

后端

处理注销登录 LogoutServlet/doGet

处理查询博客 BlogServlet/doGet

处理判断用户是否登录 LoginServlet/doGet

处理将博客详情页昵称替换为当前博客作者昵称/是否显示删除博客 UserinfoServlet/doGet

博客编辑页

前端

后端 BlogServlet/doPost

部署

准备工作

下载jdk

下载tomcat

加权限

安装mysql

使用maven打包

访问


准备工作

在main下创建webapp文件夹下再创建WEB-INF文件夹下再创建web.xml文件

web.xml

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

需要用到

  1. javaservlet3.1
  2. jackson 版本随意
  3. mysql 根据你的mysql版本

这些均在Maven Repository: Search/Browse/Explore (mvnrepository.com)网址内下载

之后复制代码粘贴到pom.xml下的 <dependecies>标签内,并且设置打包格式为war这是tomcat要求的(之后部署需要使用),再设置包名

  1. <dependencies>
  2. <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
  3. <!--jQuery库-->
  4. <dependency>
  5. <groupId>javax.servlet</groupId>
  6. <artifactId>javax.servlet-api</artifactId>
  7. <version>3.1.0</version>
  8. <scope>provided</scope>
  9. </dependency>
  10. <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
  11. <!--jackSon库-->
  12. <dependency>
  13. <groupId>com.fasterxml.jackson.core</groupId>
  14. <artifactId>jackson-databind</artifactId>
  15. <version>2.13.5</version>
  16. </dependency>
  17. <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
  18. <!--Mysql库-->
  19. <dependency>
  20. <groupId>com.mysql</groupId>
  21. <artifactId>mysql-connector-j</artifactId>
  22. <version>8.0.33</version>
  23. </dependency>
  24. </dependencies>
  25. <!-- 打包格式-->
  26. <packaging>war</packaging>
  27. <build>
  28. <!-- 包名-->
  29. <finalName>blog_system</finalName>
  30. </build>

创建用户类博客类与连接数据库

创建博客类

博客包含

  1. 博客ID
  2. 博客标题
  3. 博客内容
  4. 创建它的作者ID
  5. 发布博客的时间

之后ALT+Insert生成Get和Set方法(时间的get方法有所改变,需要格式化为日期格式)

  1. package model;
  2. import java.sql.Timestamp;
  3. import java.text.SimpleDateFormat;
  4. import java.util.SimpleTimeZone;
  5. //表示博客
  6. public class Blog {
  7. private int blogId;
  8. private String title;
  9. private String content;
  10. private int userId;
  11. private Timestamp postTime;
  12. public int getBlogId() {
  13. return blogId;
  14. }
  15. public void setBlogId(int blogId) {
  16. this.blogId = blogId;
  17. }
  18. public String getTitle() {
  19. return title;
  20. }
  21. public void setTitle(String title) {
  22. this.title = title;
  23. }
  24. public String getContent() {
  25. return content;
  26. }
  27. public void setContent(String content) {
  28. this.content = content;
  29. }
  30. public int getUserId() {
  31. return userId;
  32. }
  33. public void setUserId(int userId) {
  34. this.userId = userId;
  35. }
  36. public String getPostTime() {
  37. //把时间戳构造成日期结构
  38. SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  39. return simpleDateFormat.format(this.postTime);
  40. }
  41. public void setPostTime(Timestamp postTime) {
  42. this.postTime = postTime;
  43. }
  44. }

创建用户类

  1. 用户包含
  2. 用户ID
  3. 用户名称
  4. 用户密码
  5. 判定该博客是否是登录用户的博客(后续删除博客功能需要用到、此变量不会写入数据库)

生成Get、Set方法

  1. package model;
  2. //表示用户
  3. public class User {
  4. private int userId;
  5. private String username;
  6. private String password;
  7. private int isYourBlog=0;
  8. public int getIsYourBlog() {
  9. return isYourBlog;
  10. }
  11. public void setIsYourBlog(int isYourBlog) {
  12. this.isYourBlog = isYourBlog;
  13. }
  14. public int getUserId() {
  15. return userId;
  16. }
  17. public void setUserId(int userId) {
  18. this.userId = userId;
  19. }
  20. public String getUsername() {
  21. return username;
  22. }
  23. public void setUsername(String username) {
  24. this.username = username;
  25. }
  26. public String getPassword() {
  27. return password;
  28. }
  29. public void setPassword(String password) {
  30. this.password = password;
  31. }
  32. }

创建连接数据库工具类

获取数据库连接 管理数据库的创建配置和管理

  1. package model;
  2. import com.mysql.cj.jdbc.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. //定义私有静态的DataSource对象,用于存储数据库连接信息。
  10. //volatile确保了对这个变量的读写操作都是原子性的,即使再多线程环境下
  11. //对这个变量访问也是线程安全的
  12. private volatile static DataSource dataSource=null;
  13. //获取数据库连接 管理数据库的创建、配置和管理
  14. private static javax.sql.DataSource getDataSource() {
  15. //如果为空时 加锁
  16. if(dataSource==null){
  17. synchronized (DBUtil.class){
  18. if (dataSource == null) {
  19. dataSource = new MysqlDataSource();
  20. ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/blog_system?characterEncoding=utf8&useSSL=false");
  21. ((MysqlDataSource)dataSource).setUser("root");
  22. ((MysqlDataSource)dataSource).setPassword("monan1946");
  23. }
  24. }
  25. }
  26. return dataSource;
  27. }
  28. //这个方法是从DataSource获取一个具体的数据库连接
  29. //它通常在需要执行数据库操作时调用,比如执行SQL查询或更新
  30. public static Connection getConnection() throws SQLException {
  31. return getDataSource().getConnection();
  32. }
  33. //关闭数据库连接
  34. public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){
  35. if (resultSet!=null){
  36. try {
  37. resultSet.close();
  38. } catch (SQLException e) {
  39. throw new RuntimeException(e);
  40. }
  41. }
  42. if(statement!=null){
  43. try {
  44. statement.close();
  45. } catch (SQLException e) {
  46. throw new RuntimeException(e);
  47. }
  48. }
  49. if(connection!=null){
  50. try {
  51. connection.close();
  52. } catch (SQLException e) {
  53. throw new RuntimeException(e);
  54. }
  55. }
  56. }
  57. }

实现对数据库数据博客的操作

与数据库连接后,查询数据库,插入数据,删除数据操作

  1. package model;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. //import static jdk.nashorn.internal.objects.NativeString.substring;
  9. //Dao Data Access Object 用来访问数据的对象
  10. //针对博客的增删改查
  11. public class BlogDao {
  12. //插入博客
  13. public void insert(Blog blog){
  14. Connection connection=null;
  15. PreparedStatement statement=null;
  16. try {
  17. //与数据库建立连接
  18. connection = DBUtil.getConnection();
  19. //构造SQL语句
  20. String sql = "insert into blog values(null,?,?,?,now())";
  21. //写入sql语句
  22. statement = connection.prepareStatement(sql);
  23. //写入问号对应的数据
  24. statement.setString(1, blog.getTitle());
  25. statement.setString(2, blog.getContent());
  26. statement.setInt(3, blog.getUserId());
  27. //执行sql
  28. int ret = statement.executeUpdate();
  29. if (ret == 1) {
  30. System.out.println("插入成功");
  31. } else {
  32. System.out.println("插入失败");
  33. }
  34. }catch (SQLException e) {
  35. e.printStackTrace();
  36. }finally {
  37. //关闭连接
  38. DBUtil.close(connection,statement,null);
  39. }
  40. }
  41. //查询所有博客
  42. public List<Blog> selectAll(){
  43. Connection connection=null;
  44. PreparedStatement statement=null;
  45. ResultSet resultSet=null;
  46. List<Blog> blogs=new ArrayList<>();
  47. try {
  48. //与数据库建立连接
  49. connection=DBUtil.getConnection();
  50. //构造sql
  51. //让新的先读取 页面新的在最上面
  52. String sql="select * from blog order by postTime desc";
  53. //写入sql
  54. statement=connection.prepareStatement(sql);
  55. //执行SQL
  56. resultSet=statement.executeQuery();
  57. //遍历结果集合
  58. while (resultSet.next()){
  59. Blog blog=new Blog();
  60. blog.setBlogId(resultSet.getInt("blogId"));
  61. blog.setTitle(resultSet.getString("title"));
  62. String content=resultSet.getString("content");
  63. // //如果长度大于100时,只截取100个字符作为摘要
  64. if(content.length()>100){
  65. content=content.substring(0,100);
  66. }
  67. //如果不大于100 不截取
  68. blog.setContent(content);
  69. blog.setUserId(resultSet.getInt("userId"));
  70. blog.setPostTime(resultSet.getTimestamp("postTime"));
  71. blogs.add(blog);
  72. }
  73. } catch (SQLException e) {
  74. e.printStackTrace();
  75. }finally {
  76. //关闭连接
  77. DBUtil.close(connection,statement,resultSet);
  78. }
  79. return blogs;
  80. }
  81. //查询一篇博客
  82. public Blog selectOne(int blogId) {
  83. Connection connection = null;
  84. PreparedStatement statement = null;
  85. ResultSet resultSet = null;
  86. try {
  87. // 1. 和数据库建立连接
  88. connection = DBUtil.getConnection();
  89. // 2. 构造 SQL
  90. String sql = "select * from blog where blogId = ?";
  91. statement = connection.prepareStatement(sql);
  92. statement.setInt(1, blogId);
  93. // 3. 执行 SQL
  94. resultSet = statement.executeQuery();
  95. // 4. 遍历结果集. 由于是按照 blogId 来查询. blogId 是自增主键, 不能重复.
  96. // 此处的查询结果不可能是多条记录. 只能是 1 条或者 0 条.
  97. if (resultSet.next()) {
  98. Blog blog = new Blog();
  99. blog.setBlogId(resultSet.getInt("blogId"));
  100. blog.setTitle(resultSet.getString("title"));
  101. blog.setContent(resultSet.getString("content"));
  102. blog.setPostTime(resultSet.getTimestamp("postTime"));
  103. blog.setUserId(resultSet.getInt("userId"));
  104. return blog;
  105. }
  106. } catch (SQLException throwables) {
  107. throwables.printStackTrace();
  108. } finally {
  109. // 5. 关闭资源
  110. DBUtil.close(connection, statement, resultSet);
  111. }
  112. return null;
  113. }
  114. //删除博客
  115. public void delete(int blogId){
  116. Connection connection=null;
  117. PreparedStatement statement=null;
  118. ResultSet resultSet=null;
  119. try {
  120. //建立连接
  121. connection =DBUtil.getConnection();
  122. //构造SQL语句
  123. String sql="delete from blog where blogId=?";
  124. //写入sql
  125. statement=connection.prepareStatement(sql);
  126. //替换?
  127. statement.setInt(1,blogId);
  128. //执行sql
  129. int ret=statement.executeUpdate();
  130. if(ret==1){
  131. System.out.println("删除成功");
  132. }
  133. else{
  134. System.out.println("删除失败");
  135. }
  136. } catch (SQLException e) {
  137. e.printStackTrace();
  138. }finally {
  139. DBUtil.close(connection,statement,null);
  140. }
  141. }
  142. }

实现对数据库用户的操作

对数据库内的数据进行操作

  1. package model;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. //Dao Data Access Object 用来访问数据的对象
  7. //针对用户的增删改查
  8. public class UserDao {
  9. //查询用户
  10. public User selectByName(String username){
  11. Connection connection=null;
  12. PreparedStatement statement=null;
  13. ResultSet resultSet=null;
  14. try {
  15. //建立连接
  16. connection=DBUtil.getConnection();
  17. //构造sql语句
  18. String sql="select * from user where username=?";
  19. //写入sql
  20. statement=connection.prepareStatement(sql);
  21. //填入问号
  22. statement.setString(1,username);
  23. //执行sql
  24. resultSet=statement.executeQuery();
  25. if(resultSet.next()){
  26. User user=new User();
  27. user.setUserId(resultSet.getInt("userId"));
  28. user.setUsername(resultSet.getString("username"));
  29. user.setPassword(resultSet.getString("password"));
  30. return user;
  31. }
  32. } catch (SQLException e) {
  33. e.printStackTrace();
  34. }finally {
  35. DBUtil.close(connection,statement,resultSet);
  36. }
  37. return null;
  38. }
  39. public User selectById(int userId){
  40. Connection connection=null;
  41. PreparedStatement statement=null;
  42. ResultSet resultSet=null;
  43. try {
  44. //建立连接
  45. connection=DBUtil.getConnection();
  46. //构造sql语句
  47. String sql="select * from user where userId=?";
  48. //写入sql
  49. statement=connection.prepareStatement(sql);
  50. //填入问号
  51. statement.setInt(1,userId);
  52. //执行sql
  53. resultSet=statement.executeQuery();
  54. if(resultSet.next()){
  55. User user=new User();
  56. user.setUserId(resultSet.getInt("userId"));
  57. user.setUsername(resultSet.getString("username"));
  58. user.setPassword(resultSet.getString("password"));
  59. return user;
  60. }
  61. } catch (SQLException e) {
  62. e.printStackTrace();
  63. }finally {
  64. DBUtil.close(connection,statement,resultSet);
  65. }
  66. return null;
  67. }
  68. }

创建数据库语句

需要把创建数据库的语句放入db.sql中,方便后续更换数据库使用

  1. create database blog_system;
  2. use blog_system;
  3. create table blog(
  4. blogId int primary key auto_increment, --主键 自增 博客ID
  5. title varchar(1024), --博客标题
  6. content mediumtext, --博客正文 mediutext类型很长
  7. userId int, --作者id
  8. postTime datetime --发布事件
  9. );
  10. create table blog(
  11. blogId int primary key auto_increment,
  12. title varchar(1024),
  13. content mediumtext,
  14. userId int,
  15. postTime datetime
  16. );
  17. create table user(
  18. userId int primary key auto_increment, --用户id
  19. username varchar(128) unique , --用户名
  20. password varchar(128) --密码
  21. );
  22. create table user(
  23. userId int primary key auto_increment,
  24. username varchar(128) unique ,
  25. password varchar(128)
  26. );

登录页面

前端

login/loginServlet

前端将用户写入的数据已post方法提交给后端

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>登录页</title>
  7. <link rel="stylesheet" href="css/common.css">
  8. <link rel="stylesheet" href="css/login.css">
  9. </head>
  10. <body>
  11. <!-- 导航栏 -->
  12. <div class="nav">
  13. <!-- logo图片 -->
  14. <img src="image/logo.jpg" alt="" width="50px">
  15. <span class="title">我的博客系统</span>
  16. <span class="spacer"></span>
  17. <!-- 导航栏 -->
  18. <a href="blog_list.html">主页</a>
  19. <a href="blog_edit.html">写博客</a>
  20. </div>
  21. <!-- 登录板块 -->
  22. <div class="login-container">
  23. <div class="login-dialog">
  24. <p>登录</p>
  25. <form action="login" method="post">
  26. <div class="row">
  27. <span>用户名</span>
  28. <input type="text" id="username" name="username">
  29. </div>
  30. <div class="row">
  31. <span>密码</span>
  32. <input type="password" id="password" name="password">
  33. </div>
  34. <div class="row">
  35. <input type="submit" value="提交"id="submit">
  36. </div>
  37. </form>
  38. </div>
  39. </div>
  40. </body>
  41. </html>

后端

  1. 后端调用doPost方法
  2. 使用resp.getParameter方法获取数据
  3. 去数据库内查询数据。
  4. 查询不到则响应登录失败
  5. 若查询到时,创建session HttpSession session= req.getSession()
  6. 也就是浏览器内的cookie session.setAttribute把此用户存储进去,方便后续使用之后登录成功跳转至博客列表
  1. package controller;
  2. import model.User;
  3. import model.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. //告诉servlet(服务器)按照utf格式解析请求中的body
  16. //如果不使用这个 中文格式的会乱码
  17. req.setCharacterEncoding("utf8");
  18. //告诉浏览器 按照utf8格式解析响应
  19. // resp.setCharacterEncoding("utf8");
  20. resp.setContentType("text/html;charset=utf8");
  21. String username=req.getParameter("username");
  22. String password=req.getParameter("password");
  23. // System.out.println(username);
  24. // System.out.println(password);
  25. // if(username.equals("user")&&password.equals("123")){
  26. // resp.getWriter().write("登录成功");
  27. // }
  28. // else
  29. // {
  30. // resp.getWriter().write("用户名或密码错误");
  31. // }
  32. UserDao userDao=new UserDao();
  33. User user=userDao.selectByName(username);
  34. if(user==null){
  35. resp.getWriter().write("用户名或密码错误");
  36. return;
  37. }
  38. if(!user.getPassword().equals(password)){
  39. resp.getWriter().write("用户名或密码错误");
  40. return;
  41. }
  42. //到这里就是登录成功了
  43. //构造会话 cookie
  44. HttpSession session= req.getSession();
  45. //把信息存到cookie内,方便后续使用
  46. session.setAttribute("user",user);
  47. //登录成功后 跳转页面
  48. resp.sendRedirect("blog_list.html");
  49. }
  50. @Override
  51. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  52. //验证登录状态
  53. //如果用户未登录,强制重定向到登录页面
  54. //如果用户已登录,不做动作
  55. //取查询session
  56. HttpSession session=req.getSession(false);
  57. if(session==null){
  58. //如果连session都没有 返回403状态码
  59. //403状态码就是代表用户未登录的状态码
  60. resp.setStatus(403);
  61. return;
  62. }
  63. //取cookie查找是否有user这个用户
  64. //这个user不是用户名 而是user内的用户名
  65. User user= (User) session.getAttribute("user");
  66. if(user==null){
  67. //没有这个用户,说明未登录
  68. resp.setStatus(403);
  69. return;
  70. }
  71. //到这说明用户已经登录成功
  72. resp.setStatus(200);
  73. }
  74. }

博客列表

前端

前端使用ajax方法,所以需要引入jquery

jquery需要从jQuery CDN  链接内点击minified 复制

https://code.jquery.com/jquery-3.7.1.min.js

之后引入即可使用

前端整体代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>墨轩博客页</title>
  7. <link rel="stylesheet" href="css/common.css">
  8. <link rel="stylesheet" href="css/blog.css">
  9. </head>
  10. <body>
  11. <!-- 导航栏 -->
  12. <div class="nav">
  13. <!-- logo图片 -->
  14. <img src="image/logo.jpg" alt="" width="50px">
  15. <span class="title">我的博客系统</span>
  16. <span class="spacer"></span>
  17. <!-- 导航栏 -->
  18. <a href="blog_list.html">主页</a>
  19. <a href="blog_edit.html">写博客</a>
  20. <a href="logout">注销</a>
  21. <!-- a会直接向对应路径发起get请求-->
  22. </div>
  23. <!-- 页面主体 -->
  24. <div class="container">
  25. <!-- 左侧个人信息 -->
  26. <div class="container-left">
  27. <div class="card">
  28. <img src="image/蕾姆.jpg" alt="">
  29. <h2>墨轩111</h2>
  30. <a href="#">github链接</a>
  31. <div class="counter">
  32. <span>文章</span>
  33. <span>分类</span>
  34. </div>
  35. <div class="counter">
  36. <span>2</span>
  37. <span>3</span>
  38. </div>
  39. </div>
  40. <!-- 右侧个人信息 -->
  41. </div>
  42. <div class="container-right">
  43. <!-- <div class="blog">这是我的第一篇文章</div>
  44. <div class="date">2024-3-27 20:20</div>
  45. <div class="desc">文章内容Lorem ipsum dolor sit amet consectetur, adipisicing elit. At laboriosam quis quos, numquam tenetur cum ipsa architecto nihil, a asperiores error fugit. Praesentium eaque animi esse nemo ut nobis atque.</div>
  46. <a href="blog_detail.html">查看全文 &gt;&gt; </a> -->
  47. <!-- &gt;是html的> 正常的>无法之间写入 -->
  48. </div>
  49. </div>
  50. <!-- 引入jquery -->
  51. <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  52. <script src="js/app.js"></script>
  53. <script>
  54. function getBlogs(){
  55. //构造ajax
  56. $.ajax({
  57. type:'get',
  58. url:'blog',
  59. success: function(body){
  60. let container=document.querySelector('.container-right');
  61. //后端返回的是json数据
  62. //如果Content-Type是application/json,jquery ajax会把body转成js对象
  63. for(let blog of body){
  64. //构造最外层的div
  65. let blogDiv=document.createElement('div');
  66. blogDiv.className='blog';
  67. //创建博客标题
  68. let titleDiv=document.createElement('div');
  69. titleDiv.className='title';
  70. //把后端传来的json,被jackson解析成blog对象,对象内的标题属性赋值
  71. titleDiv.innerHTML=blog.title;
  72. //把titleDiv添加在blogDiv内
  73. blogDiv.appendChild(titleDiv);
  74. //创建日期
  75. let dateDiv=document.createElement('div');
  76. dateDiv.className='date';
  77. //把后端传来的json,被jackson解析成blog对象 对象内的时间属性赋值
  78. dateDiv.innerHTML=blog.postTime;
  79. //把dateDiv添加到blogDiv内
  80. blogDiv.appendChild(dateDiv);
  81. //创建内容
  82. let descDiv=document.createElement('div');
  83. descDiv.className='desc';
  84. //把把后端传来的json,被jackson解析成blog对象 对象内的内容属性赋值
  85. descDiv.innerHTML=blog.content;
  86. //把descDiv添加到blogDiv内
  87. blogDiv.appendChild(descDiv);
  88. //创建按钮
  89. let a=document.createElement('a');
  90. a.innerHTML='查看全文 >>';
  91. //传递这篇博客的ID是多少 后端才能取查询这篇博客的详细页
  92. a.href='blog_detail.html?blogId='+blog.blogId;
  93. blogDiv.appendChild(a);
  94. //把blogDiv添加到container内
  95. container.appendChild(blogDiv);
  96. }
  97. }
  98. });
  99. }
  100. getBlogs();
  101. //使用ajax构造get方法。判断当前是否用户
  102. // 如果没登陆,强制跳转到登录页面
  103. checkLogin();
  104. //将博客列表的昵称替换为当前登录用户的昵称
  105. function GetUser(){
  106. $.ajax({
  107. type: 'get',
  108. url:'userInfo',
  109. //后端查询失败时,发送状态码为403 403不会触发回调函数
  110. success:function (body){
  111. //将登录的用户名替换上去
  112. let user=document.querySelector('.card h2');
  113. user.innerHTML=body.username;
  114. }
  115. });
  116. }
  117. GetUser();
  118. </script>
  119. </body>
  120. </html>

注销登录

注意:注销登录和注销账号是不同的,注销登录即退出登录,而注销账户是删除账号

  1. <a href="logout">注销</a>
  2. <!-- a会直接向对应路径发起get请求-->

写入数据

  1. 前端构造ajax构造get方法,发送给后端。
  2. 调用回调函数。
  3. 遍历后端传来的数据(想要用遍历,那么后端传来的数据一定是像List这种可遍历的,如何只传来的对象,那就无法遍历)
  4. 创建div 分别把博客的标题,时间,内容创建,把后端数据都写入。并且创建查询博客详情页的按键。当按下这个按键时,会把博客ID传递给博客详情页,详情页就能拿着这个ID去后端查询此博客
  5. 把整体div放入原先的div内
  1. <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  2. <script src="js/app.js"></script>
  3. <script>
  4. function getBlogs(){
  5. //构造ajax
  6. $.ajax({
  7. type:'get',
  8. url:'blog',
  9. success: function(body){
  10. let container=document.querySelector('.container-right');
  11. //后端返回的是json数据
  12. //如果Content-Type是application/json,jquery ajax会把body转成js对象
  13. for(let blog of body){
  14. //构造最外层的div
  15. let blogDiv=document.createElement('div');
  16. blogDiv.className='blog';
  17. //创建博客标题
  18. let titleDiv=document.createElement('div');
  19. titleDiv.className='title';
  20. //把后端传来的json,被jackson解析成blog对象,对象内的标题属性赋值
  21. titleDiv.innerHTML=blog.title;
  22. //把titleDiv添加在blogDiv内
  23. blogDiv.appendChild(titleDiv);
  24. //创建日期
  25. let dateDiv=document.createElement('div');
  26. dateDiv.className='date';
  27. //把后端传来的json,被jackson解析成blog对象 对象内的时间属性赋值
  28. dateDiv.innerHTML=blog.postTime;
  29. //把dateDiv添加到blogDiv内
  30. blogDiv.appendChild(dateDiv);
  31. //创建内容
  32. let descDiv=document.createElement('div');
  33. descDiv.className='desc';
  34. //把把后端传来的json,被jackson解析成blog对象 对象内的内容属性赋值
  35. descDiv.innerHTML=blog.content;
  36. //把descDiv添加到blogDiv内
  37. blogDiv.appendChild(descDiv);
  38. //创建按钮
  39. let a=document.createElement('a');
  40. a.innerHTML='查看全文 >>';
  41. //传递这篇博客的ID是多少 后端才能取查询这篇博客的详细页
  42. a.href='blog_detail.html?blogId='+blog.blogId;
  43. blogDiv.appendChild(a);
  44. //把blogDiv添加到container内
  45. container.appendChild(blogDiv);
  46. }
  47. }
  48. });
  49. }
  50. getBlogs();

判断用户是否登录

因为这个功能是多个页面都会使用,所以写入js文件内,在前面引入js即可调用这个方法

  1. //使用ajax构造get方法。判断当前是否用户
  2. // 如果没登陆,强制跳转到登录页面
  3. checkLogin();
  4. 这个在js内的app.js文件
  5. function checkLogin(){
  6. $.ajax({
  7. type: 'get',
  8. url:'login',
  9. success:function (){
  10. // 当客户端响应200状态码时,说明用户已登录,不做处理
  11. },
  12. error:function (){
  13. //发客户端响应403时 就会触发error
  14. //强制跳转登录页面
  15. location.assign('login.html');
  16. }
  17. })
  18. }

替换页面用户昵称

向后端发起get方法,把页面昵称替换为当前登录用户的昵称

  1. function GetUser(){
  2. $.ajax({
  3. type: 'get',
  4. url:'userInfo',
  5. //后端查询失败时,发送状态码为403 403不会触发回调函数
  6. success:function (body){
  7. //将登录的用户名替换上去
  8. let user=document.querySelector('.card h2');
  9. user.innerHTML=body.username;
  10. }
  11. });
  12. }
  13. GetUser();

后端

处理注销登录 LogoutServlet/doGet

  1. req.getSession查询是否创建了session
  2. 使用session.removeAttribute删除session的当前的用户
  3. resp.sendRedirect强制跳转到登录页面
  1. @WebServlet("/logout")
  2. public class LogoutServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. //注销功能
  6. //删除session中的对象 就相当于取消状态
  7. //查找是否有session
  8. HttpSession session=req.getSession(false);
  9. if(session==null) {
  10. resp.setStatus(403);
  11. return;
  12. }
  13. //删除session中的user
  14. session.removeAttribute("user");
  15. //重定向到登录页面
  16. resp.sendRedirect("login.html");
  17. }
  18. }

处理获取所有博客 BlogServlet/doGet

  1. 想要构造JSON格式,就得创建ObjectMapper
  2. 因为前端使用的是ajax,后端需要响应json格式。所以需要用resp.setContentType设置响应格式 (application/json;charset=utf8)
  3. 创建操作博客内容的数据库类
  4. 查看req.getParameter获取前端是否传来了博客ID,如果传来了,说明前端想要查询单个博客(这里是博客详情页,后续讲)
  5. 如果没传博客ID,说明前端想要查询所有博客,博客列表是查询所有博客
  6. 调用blogDo查询博客类,查询所有博客,并且把这些数据放入List,保证所有博客可以遍历。
  7. 使用objectMapper.writeValueAsString将数据构造成json格式
  8. 响应数据
  1. @Override
  2. //发送博客列表或博客详情页的内容
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. //想要构造JSON格式,就得用到此类
  5. private ObjectMapper objectMapper=new ObjectMapper();
  6. resp.setContentType("application/json;charset=utf8");
  7. //要拿到写数据库操作的类
  8. BlogDao blogDao=new BlogDao();
  9. //获取url中的博客ID
  10. String blogId=req.getParameter("blogId");
  11. System.out.println(blogId);
  12. //为空时 说明时获取博客列表,而不是获取博客详情
  13. if(blogId==null){
  14. //查询所有 返回的是list 每个类型是一个博客类型
  15. List<Blog> blogs=blogDao.selectAll();
  16. //转成json格式
  17. String jsonString=objectMapper.writeValueAsString(blogs);
  18. //响应
  19. resp.getWriter().write(jsonString);
  20. }else{
  21. //如果获取到博客ID时,说明时获取博客详情页
  22. //使用数据库查找这个博客ID
  23. Blog blog=blogDao.selectOne(Integer.parseInt(blogId));
  24. //记住,传json格式,如果你要用for循环 那么你的对象一定要是可迭代的对象
  25. //如果你单构造个类过去,你用for是肯定循环不了的,你必须使用List这种可以迭代的对象,才能使用这个迭代循环
  26. List<Blog> blogs=new ArrayList<>();
  27. blogs.add(blog);
  28. //你也可以单传个对象 到前端那不用循环直接使用也可以
  29. // List<Blog> blogs=new ArrayList<>();
  30. // String jsonString=objectMapper.writeValueAsString(blog);
  31. //转为json格式
  32. String jsonString=objectMapper.writeValueAsString(blogs);
  33. //响应
  34. resp.getWriter().write(jsonString);
  35. }
  36. }

处理判断用户是否登录 loginServlet/doGet

  1. req.getSession查询是否创建了session(这里可以直接判断用户是否登录了,因为只要登录,那么就一定创建了session
  2. 为空时,resp.setStatus响应状态码403
  3. 如果不为空时,session.getAttribute查询session是否有该用户
  4. 如果为空,则有创建session,但没有此用户,setStatus响应状态码403
  5. 如果也不为空,说明该用户以及登录,setStatus响应状态码200
  6. 响应状态码403是为了不让前端调用回调函数,当返回200时,才调用
  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. //验证登录状态
  4. //如果用户未登录,强制重定向到登录页面
  5. //如果用户已登录,不做动作
  6. //取查询session
  7. HttpSession session=req.getSession(false);
  8. if(session==null){
  9. //如果连session都没有 返回403状态码
  10. //403状态码就是代表用户未登录的状态码
  11. resp.setStatus(403);
  12. return;
  13. }
  14. //取cookie查找是否有user这个用户
  15. //这个user不是用户名 而是user内的用户名
  16. User user= (User) session.getAttribute("user");
  17. if(user==null){
  18. //没有这个用户,说明未登录
  19. resp.setStatus(403);
  20. return;
  21. }
  22. //到这说明用户已经登录成功
  23. resp.setStatus(200);
  24. }

处理替换页面用户昵称 UserinfoServlet/doGet

  1. 想要构造JSON格式,就得创建此类objectMapper
  2. req.getParameter获取blogId(如果为空,则是博客列表发来的,想要获取此博客的用户名,如果不为空,是博客详情页发来的,判断此博客是否是当前登录用户的博客)
  3. req.getSession判断是否有session
  4. session.getAttribute 查询session是否有该用户,获取此用户
  5. 当blogId为空时,博客列表发来的
  6. 首先用户的密码设为空串 (不是修改数据库内的数据)
  7. resp.setContentType设置响应格式
  8. objectMapper.writeValueAsString数据构造为JSON格式
  9. 响应数据
  1. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. //想要构造json 就要创建这个类
  3. ObjectMapper objectMapper=new ObjectMapper();
  4. String blogid=req.getParameter("blogId");
  5. //直接取查找是否有cookie
  6. HttpSession session=req.getSession(false);
  7. if(session==null){
  8. //后端查询失败时,发送状态码为403 403不会触发回调函数
  9. resp.setStatus(403);
  10. resp.setContentType("text/html;charset=utf8");
  11. resp.getWriter().write("没有该用户");
  12. return;
  13. }
  14. //获取当前登录用户
  15. User user= (User) session.getAttribute("user");
  16. if(user==null){
  17. resp.setStatus(403);
  18. resp.setContentType("text/html;charset=utf8");
  19. resp.getWriter().write("没有该用户");
  20. return;
  21. }
  22. if(blogid==null){
  23. //查询登录的用户
  24. //当url中的查询字符串中没有blogId时,说明是博客列表发来的请求
  25. //不用让密码在body中明文显示
  26. user.setPassword("");
  27. resp.setContentType("application/json;charset=utf8");
  28. //构造成json格式
  29. //返回登录的用户
  30. String jsonString=objectMapper.writeValueAsString(user);
  31. //写入
  32. resp.getWriter().write(jsonString);

博客详情页

前端

总体

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>博客详情页</title>
  7. <link rel="stylesheet" href="css/common.css">
  8. <link rel="stylesheet" href="css/blog.css">
  9. <link rel="stylesheet" href="css/blog_detail.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. <!-- 导航栏 -->
  19. <div class="nav">
  20. <!-- logo图片 -->
  21. <img src="image/logo.jpg" alt="" width="50px">
  22. <span class="title">我的博客系统</span>
  23. <span class="spacer"></span>
  24. <!-- 导航栏 -->
  25. <a href="blog_list.html">主页</a>
  26. <a href="blog_edit.html">写博客</a>
  27. <a href="logout">注销</a><!-- a会直接向对应路径发起get请求-->
  28. <div class="dete"></div>
  29. <!-- 删除博客-->
  30. </div>
  31. <!-- 页面主体 -->
  32. <div class="container">
  33. <!-- 左侧个人信息 -->
  34. <div class="container-left">
  35. <div class="card">
  36. <img src="image/蕾姆.jpg" alt="">
  37. <h2>墨轩111</h2>
  38. <a href="#">github链接</a>
  39. <div class="counter">
  40. <span>文章</span>
  41. <span>分类</span>
  42. </div>
  43. <div class="counter">
  44. <span>2</span>
  45. <span>3</span>
  46. </div>
  47. </div>
  48. </div>
  49. <!-- 右侧个人信息 -->
  50. <!-- <div class="container-right">-->
  51. <!-- </div>-->
  52. <div class="container-right">
  53. <!-- 这个 div 里来放博客的内容 -->
  54. <div class="blog-content">
  55. </div>
  56. </div>
  57. </div>
  58. <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
  59. <script src="js/app.js"></script>
  60. <script>
  61. function getBlogs() {
  62. //构造ajax
  63. $.ajax({
  64. type: 'get',
  65. //博客列表传来的
  66. url: 'blog' + location.search,
  67. success: function (body) {
  68. let container = document.querySelector('.container-right');
  69. //后端返回的是json数据
  70. //如果Content-Type是application/json,jquery ajax会把body转成js对象
  71. for (let blog of body) {
  72. //构造最外层的div
  73. let blogDiv = document.createElement('div');
  74. blogDiv.className = 'blog';
  75. //创建博客标题
  76. let titleDiv = document.createElement('div');
  77. titleDiv.className = 'title';
  78. //把后端传来的json,被jackson解析成blog对象,对象内的标题属性赋值
  79. titleDiv.innerHTML = blog.title;
  80. //把titleDiv添加在blogDiv内
  81. blogDiv.appendChild(titleDiv);
  82. //创建日期
  83. let dateDiv = document.createElement('div');
  84. dateDiv.className = 'date';
  85. //把后端传来的json,被jackson解析成blog对象 对象内的时间属性赋值
  86. dateDiv.innerHTML = blog.postTime;
  87. //把dateDiv添加到blogDiv内
  88. blogDiv.appendChild(dateDiv);
  89. //创建内容
  90. let descDiv = document.createElement('div');
  91. descDiv.className = 'desc';
  92. //把把后端传来的json,被jackson解析成blog对象 对象内的内容属性赋值
  93. descDiv.innerHTML = blog.content;
  94. //把descDiv添加到blogDiv内
  95. blogDiv.appendChild(descDiv);
  96. //把blogDiv添加到container内
  97. container.appendChild(blogDiv);
  98. }
  99. }
  100. });
  101. }
  102. getBlogs();
  103. checkLogin();
  104. function GetUser(){
  105. $.ajax({
  106. type: 'get',
  107. url:'userInfo'+location.search,//加个博客ID 让后端查找这篇博客
  108. success:function (body){
  109. //将这篇作者的用户名替换上去
  110. let user=document.querySelector('.card h2');
  111. user.innerHTML=body.username;
  112. //当这篇博客是当前用户的 那么就显示删除按钮
  113. if(body.isYourBlog){
  114. let delet=document.createElement('a');
  115. delet.className="delete";
  116. delet.innerHTML="删除博客"
  117. delet.href='blogdelete'+location.search;
  118. let de=document.querySelector('.dete');
  119. de.appendChild(delet);
  120. }
  121. }
  122. });
  123. }
  124. GetUser();
  125. </script>
  126. </body>
  127. </html>

注销登录

与博客列表一致这里不再赘述

查询博客

  1. 构造ajax的get方法,url是博客列表传来的博客ID,传给后端,后端才能根据这个ID查询博客
  2. 后端传来了数据,只要是json格式(application/json;charset=utf8)那么ajax就会把body转成js的对象。
  3. 创建div,分别把博客的标题、时间、内容写入
  1. <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
  2. <script src="js/app.js"></script>
  3. <script>
  4. function getBlogs() {
  5. //构造ajax
  6. $.ajax({
  7. type: 'get',
  8. //博客列表传来的
  9. url: 'blog' + location.search,
  10. success: function (body) {
  11. let container = document.querySelector('.container-right');
  12. //后端返回的是json数据
  13. //如果Content-Type是application/json,jquery ajax会把body转成js对象
  14. for (let blog of body) {
  15. //构造最外层的div
  16. let blogDiv = document.createElement('div');
  17. blogDiv.className = 'blog';
  18. //创建博客标题
  19. let titleDiv = document.createElement('div');
  20. titleDiv.className = 'title';
  21. //把后端传来的json,被jackson解析成blog对象,对象内的标题属性赋值
  22. titleDiv.innerHTML = blog.title;
  23. //把titleDiv添加在blogDiv内
  24. blogDiv.appendChild(titleDiv);
  25. //创建日期
  26. let dateDiv = document.createElement('div');
  27. dateDiv.className = 'date';
  28. //把后端传来的json,被jackson解析成blog对象 对象内的时间属性赋值
  29. dateDiv.innerHTML = blog.postTime;
  30. //把dateDiv添加到blogDiv内
  31. blogDiv.appendChild(dateDiv);
  32. //创建内容
  33. let descDiv = document.createElement('div');
  34. descDiv.className = 'desc';
  35. //把把后端传来的json,被jackson解析成blog对象 对象内的内容属性赋值
  36. descDiv.innerHTML = blog.content;
  37. //把descDiv添加到blogDiv内
  38. blogDiv.appendChild(descDiv);
  39. //把blogDiv添加到container内
  40. container.appendChild(blogDiv);
  41. }
  42. }
  43. });
  44. }
  45. getBlogs();

判断用户是否登录

这个与博客列表页一样,这里不再赘述

将博客详情页昵称替换为当前博客作者昵称/是否显示删除博客

  1. 构造ajax的get方法,url传入博客列表传来的博客ID
  2. 获取数据后,将后端的数据写入昵称
  3. 判断isYourBlog是否为1 (1是说明当前登录用户的ID与博客ID相同(此篇博客是当前用户写的),说明当前用户有支配此篇博客的权利,显示删除博客 0说明当前登录用户的ID与博客ID不同(此篇博客不是当前用户写的,没有支配全,不显示删除博客)
  4. 为1时,创建a标签,命名为删除博客,链接到删除博客的后端,并且传入博客ID
  5. 再放入原先的div
  1. function GetUser(){
  2. $.ajax({
  3. type: 'get',
  4. url:'userInfo'+location.search,//加个博客ID 让后端查找这篇博客
  5. success:function (body){
  6. //将这篇作者的用户名替换上去
  7. let user=document.querySelector('.card h2');
  8. user.innerHTML=body.username;
  9. //当这篇博客是当前用户的 那么就显示删除按钮
  10. if(body.isYourBlog){
  11. let delet=document.createElement('a');
  12. delet.className="delete";
  13. delet.innerHTML="删除博客"
  14. delet.href='blogdelete'+location.search;
  15. let de=document.querySelector('.dete');
  16. de.appendChild(delet);
  17. }
  18. }
  19. });
  20. }
  21. GetUser();

后端

处理注销登录 LogoutServlet/doGet

这里与博客列表一致,不再赘述

处理查询博客 BlogServlet/doGet

  1. resp.setContentTyoe设置响应格式 (application/json;charset=utf8)
  2. 创建操作博客类
  3. req.getParameter获取前端传来的博客ID
  4. 这里是查询单个博客,所以是不为空的
  5. 将博客ID转为int 并且从数据库内查询
  6. 将博客放入List(这里最好不用放入List,因为只是单个博客,不需要迭代,我只是演示)
  7. objectMapper.writeVlueAsString构造成JSON格式
  8. 响应数据
  1. else{
  2. resp.setContentType("application/json;charset=utf8");
  3. //如果获取到博客ID时,说明时获取博客详情页
  4. //使用数据库查找这个博客ID
  5. String blogId=req.getParameter("blogId");
  6. Blog blog=blogDao.selectOne(Integer.parseInt(blogId));
  7. //记住,传json格式,如果你要用for循环 那么你的对象一定要是可迭代的对象
  8. //如果你单构造个类过去,你用for是肯定循环不了的,你必须使用List这种可以迭代的对象,才能使用这个迭代循环
  9. List<Blog> blogs=new ArrayList<>();
  10. blogs.add(blog);
  11. //你也可以单传个对象 到前端那不用循环直接使用也可以
  12. // List<Blog> blogs=new ArrayList<>();
  13. // String jsonString=objectMapper.writeValueAsString(blog);
  14. //转为json格式
  15. String jsonString=objectMapper.writeValueAsString(blogs);
  16. //响应
  17. resp.getWriter().write(jsonString);
  18. }

处理判断用户是否登录 LoginServlet/doGet

这里是与博客列表是一样的,就不再赘述

处理将博客详情页昵称替换为当前博客作者昵称/是否显示删除博客 UserinfoServlet/doGet

  1. 创建要构造JSON的类
  2. resp.getParameter获取blogId
  3. req.GetSession查询是否有session
  4. session.getAttribute获取session是否有该用户
  5. 数据库中查询此篇博客
  6. 数据中查询用户类是否有此篇博客的作者
  7. 当都有时,判断当前session的用户ID与此篇博客的ID是否相同(相同时,用户类的isyourblog设置1反之设置0)
  8. 响应时,把用户密码设置为0不要名为显示,不修改数据库的数据
  9. resp.setContentType设置响应格式
  10. objectMapper.writeValueAsString构造为JSON格式
  11. 响应
  1. //想要构造json 就要创建这个类
  2. ObjectMapper objectMapper=new ObjectMapper();
  3. String blogid=req.getParameter("blogId");
  4. //直接取查找是否有cookie
  5. HttpSession session=req.getSession(false);
  6. if(session==null){
  7. //后端查询失败时,发送状态码为403 403不会触发回调函数
  8. resp.setStatus(403);
  9. resp.setContentType("text/html;charset=utf8");
  10. resp.getWriter().write("没有该用户");
  11. return;
  12. }
  13. //获取当前登录用户
  14. User user= (User) session.getAttribute("user");
  15. if(user==null){
  16. resp.setStatus(403);
  17. resp.setContentType("text/html;charset=utf8");
  18. resp.getWriter().write("没有该用户");
  19. return;
  20. }
  21. else{
  22. //查询这篇博客的作者
  23. //如果有blogId时,说明是博客详情页发来的请求
  24. BlogDao blogDao=new BlogDao();
  25. Blog blog=blogDao.selectOne(Integer.parseInt(blogid));
  26. if(blog==null){
  27. resp.setStatus(403);
  28. resp.setContentType("text/html;charset=utf8");
  29. resp.getWriter().write("没有该用户");
  30. return;
  31. }
  32. UserDao userDao=new UserDao();
  33. //用博客类里的用户id 去用户类去查询 查询用户是否有这个博客作者
  34. User author=userDao.selectById(blog.getUserId());
  35. if(author==null){
  36. resp.setStatus(403);
  37. resp.setContentType("text/html;charset=utf8");
  38. resp.getWriter().write("没有该用户");
  39. return;
  40. }
  41. if(author.getUserId()== user.getUserId()){
  42. author.setIsYourBlog(1);
  43. }else {
  44. author.setIsYourBlog(0);
  45. }
  46. //不用让密码在body中明文显示
  47. user.setPassword("");
  48. resp.setContentType("application/json;charset=utf8");
  49. String jsonString=objectMapper.writeValueAsString(author);
  50. //返回这篇博客的作者
  51. resp.getWriter().write(jsonString);
  52. }

博客编辑页

前端

通过from表单提交标题,内容

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>博客编辑页</title>
  7. <link rel="stylesheet" href="css/common.css">
  8. <link rel="stylesheet" href="css/blog-edit-container.css">
  9. <!-- 引入 editor.md 的依赖 -->
  10. <link rel="stylesheet" href="editor.md/css/editormd.min.css" />
  11. <script src="js/jquery.min.js"></script>
  12. <script src="editor.md/lib/marked.min.js"></script>
  13. <script src="editor.md/lib/prettify.min.js"></script>
  14. <script src="editor.md/editormd.js"></script>
  15. </head>
  16. <body>
  17. <!-- 导航栏 -->
  18. <div class="nav">
  19. <!-- logo图片 -->
  20. <img src="image/logo.jpg" alt="" width="50px">
  21. <span class="title">我的博客系统</span>
  22. <span class="spacer"></span>
  23. <!-- 导航栏 -->
  24. <a href="blog_list.html">主页</a>
  25. <a href="blog_edit.html">写博客</a>
  26. <a href="logout">注销</a><!-- a会直接向对应路径发起get请求-->
  27. </div>
  28. <div class="blog-edit-container">
  29. <form action="blog" method="post" style="height: 100%">
  30. <!-- 标题编辑区 -->
  31. <div class="title">
  32. <input type="text" id="title" placeholder="请输入文章标题" name="title">
  33. <input type="submit" id="submit" value="发布文章">
  34. </div>
  35. <!-- 博客编辑器标签 -->
  36. <div id="editor">
  37. <!-- 需要在这里加上一个隐藏的 textarea -->
  38. <!-- 属于 editor.md 这个库要求的. -->
  39. <textarea name="content" style="display: none;" ></textarea>
  40. </div>
  41. </form>
  42. </div>
  43. <script>
  44. // 初始化编辑器
  45. var editor = editormd("editor", {
  46. // 这里的尺寸必须在这里设置. 设置样式会被 editormd 自动覆盖掉.
  47. width: "100%",
  48. // 设定编辑器高度
  49. height: "calc(100% - 50px)",
  50. // 编辑器中的初始内容
  51. markdown: "# 在这里写下一篇博客",
  52. // 指定 editor.md 依赖的插件路径
  53. path: "editor.md/lib/",
  54. // 加上这个属性, 效果就是把编辑器里的内容给自动保存到 textarea 里.
  55. saveHTMLToTextArea: true,
  56. });
  57. </script>
  58. </body>
  59. </html>

后端 BlogServlet/doPost

  1. req.setCharacterEncoding设置后端读取的格式
  2. req.getSession判断session是否存在
  3. session.getAttribute判断用户是否在session内
  4. 使用req.getParameter获取标题、内容
  5. 如果标题内容为空或者为空串,则响应400状态码
  6. 创建一个博客类
  7. 将数据写入博客类中
  8. 博客的作者ID就是当前登录用户的ID
  9. 最后将这个类写入数据库(实际就是将类中的数据写入)
  10. 写入后,resp.sendRedirect跳转到博客列表
  1. //提交博客
  2. @Override
  3. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. req.setCharacterEncoding("utf8");
  5. //判断会话是否存在和会话中的用户是否存在
  6. HttpSession session=req.getSession(false);
  7. if (session == null) {
  8. resp.setStatus(400);
  9. return;
  10. }
  11. User user= (User) session.getAttribute("user");
  12. // System.out.println(user.getUsername());
  13. // System.out.println(user.getUserId());
  14. if(user==null){
  15. resp.setStatus(400);
  16. return;
  17. }
  18. //2.获取博客的标题和正文
  19. String title=req.getParameter("title");
  20. String content=req.getParameter("content");
  21. // System.out.println(title);
  22. // System.out.println(content);
  23. if(title==null||content==null||title.equals("")||content.equals("")){
  24. resp.setStatus(400);
  25. resp.setContentType("text/html;charset=utf8");
  26. resp.getWriter().write("标题或正文不符合");
  27. return;
  28. }
  29. //把数据写入一个对象
  30. Blog blog=new Blog();
  31. blog.setTitle(title);
  32. blog.setContent(content);
  33. //博客作者的ID就是当前登录用户的ID 所以直接从session拿出当前用户 再拿出当前用户的id
  34. blog.setUserId(user.getUserId());
  35. //创建博客写入数据库的对象
  36. BlogDao blogDao=new BlogDao();
  37. //把这个博客对象写入数据库
  38. blogDao.insert(blog);
  39. //响应
  40. resp.sendRedirect("blog_list.html");
  41. }

部署

准备工作

均在Linux系统下

下载jdk

yum install java-1.8.0-openjdk-devel.x86_64

下载tomcat

把window下的tomcat8.0拖拽到linux上

解压 

unzip apache-tomcat-8.5.100.zip

加权限

cd到tomcat的bin目录下

给所有.sh加上权限

chmod +x *.sh

./即可启动

  1. startup.sh是linux启动脚本
  2. startup.bat是window启动脚本

但是大概率启动不了,因为tomcat8080端口,服务器是默认不开放的,所有要进入你的服务器控制台开放端口

安装mysql

之后把db.sql里的sql语句复制到数据库内,重新建库建表

使用maven打包

记得改包格式和包名

把打好的包从window拖拽到Linux的Tomcat的webappsxia

访问

你服务器的地址:端口:包名:你也访问的页面

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/467730
推荐阅读
相关标签
  

闽ICP备14008679号