博客管理系统--项目说明

news2025/7/22 15:15:28
  • 项目体验地址(账号:123,密码:123)http://120.53.20.213:8080/blog_system/login.html

  • 项目码云Gitee地址:https://gitee.com/GoodManSS/project/tree/master/blog_system

(一)准备工作

因为是一个简单的博客系统,所以软件开发的基本流程这里我们就简要一些,主要分为 需求分析,数据库设计
  1. 需求分析

① 实现博客列表的展示功能

② 实现博客详情的展示功能

③ 登录功能

  • login登录页面

  • 注册页面

④ 限制用户权限(强制要求用户登录)

⑤ 显示用户的信息

  • 文章详情页显示信息

  • 用户能够修改个人资料,如头像,昵称,Gitee地址

⑥ 实现注销(退出账号功能)

⑦ 发布博客

⑧ 删除博客

2.数据库设计

① 博客表blog

  • blogId(Id)自增主键

  • title(文章标题)

  • content(文章内容) 类型:text 最大64k

  • postTime(发布时间)

  • userId(文章所属用户)

② 用户表user

  • useId(ID/账号)

  • passWord(登录密码)

  • userName(昵称)

  • head(头像) 这里采用保存头像路径的方式

  • Gitee地址

③ 代码

// 1.创建一个库
create database if not exists blog_system;
use blog_system;
// 2.创建blog表
drop table if exists blog;
create table blog(
    blogId int primary key auto_increment,
    title varchar(256),
    content text,
    postTime datetime,
    userId varchar(50)
);
// 3.创建user表
drop table if exists user;
create table user(
    userId varchar(50) primary key,
    userName varchar(50),
    passWord varchar(50),
    gitDress varchar(50),
    head varchar(100)
);

3.引入依赖

博客管理系统,必不可获取的有Servlet,mysql,Jackson,还有编辑页要使用到Markdown语法
<dependencies>

    <!-- mysql的依赖 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

    <!-- servlet的依赖 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- Jackson的依赖 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.1</version>
    </dependency>
</dependencies>

4.引入前端代码

① 在main目录下新建一个webapp文件夹。

② 把前段的代码复制粘贴到这个目录

③ 加入WEB-INF\web.xml文件内容

④ 最终目录截图

(二)写后端代码

  1. 连接数据库DBUtil

连接数据库 使用单例模式的 懒汉模式实现
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBUtil {
    private static volatile DataSource dataSource = null;

    public static DataSource getDataSource() {
        if (dataSource == null) {
            synchronized (DBUtil.class) {
                if (dataSource == null) {
                    dataSource = new MysqlDataSource();
                    ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/blog_system?characterEncoding=utf8&useSSL=false");
                    ((MysqlDataSource) dataSource).setUser("root");
                    ((MysqlDataSource) dataSource).setPassword("SHANhaonan521");
                }
            }
        }
        return dataSource;
    }

    //与数据库进行连接
    public static Connection getConnection() throws SQLException {
        return getDataSource().getConnection();
    }

    //关闭连接
    public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {

        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }


        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }


        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

}

2.Blog和User类

两个类对应数据库的两个表

① Blog类

不仅要有get set方法,还要有一个compareTo,用来对文章进行排序 (按照发布时间)
import java.sql.Timestamp;
import java.text.SimpleDateFormat;

public class Blog implements Comparable<Blog> {
    private int blogId;
    private String title;
    private String content;
    private Timestamp postTime;
    private String userId;

    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 String getPostTime() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
        return simpleDateFormat.format(postTime);
    }

    public void setPostTime(Timestamp postTime) {
        this.postTime = postTime;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }
    //这是一个排序方法
    @Override
    public int compareTo(Blog o) {
        return this.getPostTime().compareTo(o.getPostTime());
    }
}

② User类

public class User {
    private String userId;
    private String userName;
    private String passWord;
    private String gitDress;
    private String head;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String 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;
    }

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public String getGitDress() {
        return gitDress;
    }

    public void setGitDress(String gitDress) {
        this.gitDress = gitDress;
    }
}

③ BlogAndUserVO

在博客详情页,不仅要显示博客的相关信息,还要有一些作者的信息,加入一个VO类来实现这一功能
public class BlogAndUserVO {
    private int blogId;
    private String title;
    private String content;
    private String postTime;
    private String userId;
    private String userName;
    private String head;

    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 String getPostTime() {
        return postTime;
    }

    public void setPostTime(String postTime) {
        this.postTime = postTime;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }
}

3.BlogDao和UserDao

BlogDao 和 UserDao主要功能就是和数据库建立连接,实现对数据库的增删查改。

① BLogDao

实现了增加博客,删除博客,查找博客,查找所有博客四个方法
    import java.sql.*;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;

    public class BlogDao {

        // 1.增
        public void insert(Blog blog) {
            Connection connection = null;
            PreparedStatement statement = null;
            try {
                connection = DBUtil.getConnection();
                String sql = "insert into blog values(null,?,?,now(),?)";
                statement = connection.prepareStatement(sql);
                statement.setString(1, blog.getTitle());
                statement.setString(2, blog.getContent());
                statement.setString(3, blog.getUserId());
                int n = statement.executeUpdate();
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
                if (n == 1) {
                    System.out.println(simpleDateFormat.format(System.currentTimeMillis()));
                    System.out.println("新增博客成功  title:"+blog.getTitle());
                } else {
                    System.out.println(simpleDateFormat.format(System.currentTimeMillis()));
                    System.out.println("新增博客失败");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DBUtil.close(connection, statement, null);
            }
        }

        // 2.删---通过主键blogId删除
        public void deleteOneByBlogId(int blogId) {
            Connection connection = null;
            PreparedStatement statement = null;
            try {
                connection = DBUtil.getConnection();
                String sql = "delete from blog where blogId = ?";
                statement = connection.prepareStatement(sql);
                statement.setInt(1, blogId);
                int n = statement.executeUpdate();
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
                System.out.println(simpleDateFormat.format(System.currentTimeMillis()));
                if (n == 1) {
                    System.out.println("删除博客成功  blogId:"+blogId);
                } else {
                    System.out.println("删除博客失败");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DBUtil.close(connection, statement, null);
            }
        }
        // 3.查--通过BlogId查询博客
        public Blog selectOneByBlogId(int blogId) {
            Blog blog = new Blog();
            Connection connection = null;
            PreparedStatement statement = null;
            ResultSet resultSet = null;
            try {
                connection = DBUtil.getConnection();
                String sql = "select * from blog where blogId = ?";
                statement = connection.prepareStatement(sql);
                statement.setInt(1, blogId);
                resultSet = statement.executeQuery();
                if (resultSet.next()) {
                    blog.setBlogId(resultSet.getInt("blogId"));
                    blog.setTitle(resultSet.getString("title"));
                    blog.setContent(resultSet.getString("content"));
                    blog.setPostTime(Timestamp.valueOf(resultSet.getString("postTime")));
                    blog.setUserId(resultSet.getString("userId"));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DBUtil.close(connection, statement, resultSet);
            }
            return blog;
        }

        //3. 查找所有的博客--排序好的主要是为了显示主页面
        public List<Blog> selectAllBlog() {
            Connection connection = null;
            PreparedStatement statement = null;
            ResultSet resultSet = null;

            List<Blog> list = new ArrayList<>();
            try {
                connection = DBUtil.getConnection();
                String sql = "select * from blog";
                statement = connection.prepareStatement(sql);
                resultSet = statement.executeQuery();
                while (resultSet.next()) {
                    Blog blog = new Blog();
                    blog.setBlogId(resultSet.getInt("blogId"));
                    blog.setTitle(resultSet.getString("title"));
                    blog.setContent(resultSet.getString("content"));
                    blog.setPostTime(Timestamp.valueOf(resultSet.getString("postTime")));
                    blog.setUserId(resultSet.getString("userId"));
                    list.add(blog);
                }
                //进行时间排序
                list.sort(new Comparator<Blog>() {
                    @Override
                    public int compare(Blog o1, Blog o2) {
                        return o1.getPostTime().compareTo(o2.getPostTime());
                    }
                });
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DBUtil.close(connection, statement, resultSet);
            }
            return list;
        }
    }

② UserDao

四个方法,分别是增删查改
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;

public class UserDao {
    // 1.增
    public void insert(User user) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            connection = DBUtil.getConnection();
            String sql = "insert into user values(?,?,?,?,?)";
            statement = connection.prepareStatement(sql);
            statement.setString(1, user.getUserId());
            statement.setString(2, user.getUserName());
            statement.setString(3, user.getPassWord());
            statement.setString(4, user.getHead());
            statement.setString(5, user.getGitDress());
            int n = statement.executeUpdate();
            if (n == 1) {
                System.out.println("新增数据成功!");
            } else {
                System.out.println("新增失败!");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(connection, statement, null);
        }
    }

    // 2.删
    public void deleteOne(User user) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            connection = DBUtil.getConnection();
            String sql = "delete from user where userId = ?";
            statement = connection.prepareStatement(sql);
            statement.setString(1, user.getUserId());
            int n = statement.executeUpdate();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
            System.out.println(simpleDateFormat.format(System.currentTimeMillis()));
            if (n == 1) {
                System.out.println("注销成功  user:" + user.getUserName());
            } else {
                System.out.println("注销失败");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DBUtil.close(connection, statement, null);
        }
    }

    // 3.查--根据UserId
    public User selectOneByUserId(String userId) {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        User user = null;
        try {
            connection = DBUtil.getConnection();
            String sql = "select * from user where userId = ?";
            statement = connection.prepareStatement(sql);
            statement.setString(1, userId);
            resultSet = statement.executeQuery();
            user = new User();
            if (resultSet.next()) {
                user.setUserId(resultSet.getString("userId"));
                user.setUserName(resultSet.getString("userName"));
                user.setPassWord(resultSet.getString("passWord"));
                user.setHead(resultSet.getString("header"));
                user.setGitDress(resultSet.getString("gitee"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(connection, statement, resultSet);
        }
        return user;
    }


    // 4.改--个人资料修改
    public void update(User user) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            connection = DBUtil.getConnection();
            String sql = "update user set gitee=?,userName=? where userId=?";
            statement = connection.prepareStatement(sql);
            statement.setString(1, user.getGitDress());
            statement.setString(2, user.getUserName());
            statement.setString(3, user.getUserId());
            int n = statement.executeUpdate();
            if (n == 1) {
                System.out.println("update 成功");
            } else {
                System.out.println("update 失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(connection, statement, null);
        }
    }
}

  1. Servlet类

Servlet类主要就是通过@ WebServlet注解来实现前后端信息的交互,前端发送请求后,都端实现对数据库的增删查改功能

① "blog"显示/增加博客

doGet:get实现两个功能,当传入blogId的时候显示博客详情页,当没有的时候显示博客列表页。
doPost:增加一个新博客
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;


@WebServlet("/blog")
public class ServletBlog extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("application/json;charset=utf8");
        String blogId = req.getParameter("blogId");
        BlogDao blogDao = new BlogDao();
        UserDao userDao = new UserDao();
        ObjectMapper objectMapper = new ObjectMapper();

        if (blogId == null) {
            //返回博客列表
            List<Blog> list = blogDao.selectAllBlog();
            for (Blog blog : list) {
                if (blog.getContent().length() > 100) {
                    blog.setContent(blog.getContent().substring(0, 145));
                }
            }
            resp.getWriter().write(objectMapper.writeValueAsString(list));
        } else {
            //返回博客详情  使用VO类
            //1.把 blog的内容加入到这个类中
            Blog blog = blogDao.selectOneByBlogId(Integer.parseInt(blogId));
            BlogAndUserVO blogAndUserVO = new BlogAndUserVO();
            blogAndUserVO.setBlogId(blog.getBlogId());
            blogAndUserVO.setPostTime(blog.getPostTime());
            blogAndUserVO.setTitle(blog.getTitle());
            blogAndUserVO.setContent(blog.getContent());
            //把user的内容加入到这个类
            User user = userDao.selectOneByUserId(blog.getUserId());
            blogAndUserVO.setUserName(user.getUserName());
            blogAndUserVO.setUserId(user.getUserId());
            blogAndUserVO.setHead(user.getHead());
            //返回VO类
            resp.getWriter().write(objectMapper.writeValueAsString(blogAndUserVO));
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setContentType("text/html;charset=utf8");
        // 1.要先检查一下用户的登录状态
        HttpSession session = req.getSession();
        if (session == null) {
            resp.setStatus(403);
            resp.getWriter().write("当前未登录");
            return;
        }
        User user = (User) session.getAttribute("user");
        if (user == null) {
            resp.setStatus(403);
            resp.getWriter().write("当前未登录");
            return;
        }
        // 2.获取请求的参数
        String title = req.getParameter("title");
        String content = req.getParameter("content");
        // 3.构造一个blog对象
        Blog blog = new Blog();
        blog.setTitle(title);
        blog.setContent(content);
        blog.setUserId(user.getUserId());
        // 4.插入到数据库
        BlogDao blogDao = new BlogDao();
        blogDao.insert(blog);
        // 5.构造重定向  返回到这个博客的详情页
        resp.sendRedirect("blog_list.html");
    }
}

② "blogDelete'删除博客

只有一个doGet方法,实现了博客的删除。没有登录或者不是自己的博客的时候是无法删除的。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/blog_delete")
public class ServletBlogDelete extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 先判定用户的登陆状态
        HttpSession session = req.getSession(false);
        if (session == null) {
            resp.setStatus(403);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("您当前未登录, 不能删除!");
            return;
        }
        User user = (User) session.getAttribute("user");
        if (user == null) {
            resp.setStatus(403);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("您当前未登录, 不能删除!");
            return;
        }
        // 2. 获取到 blogId
        String blogId = req.getParameter("blogId");
        if (blogId == null) {
            // 这个 blogId 参数不存在, 无法删除
            resp.setStatus(404);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("您当前删除的 blogId 有误");
            return;
        }
        // 3. 查询出这个 blogId 对应的 Blog 对象
        BlogDao blogDao = new BlogDao();
        Blog blog = blogDao.selectOneByBlogId(Integer.parseInt(blogId));
        if (blog == null) {
            // 这个 blogId 参数不存在, 无法删除
            resp.setStatus(404);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("您当前删除的 博客 不存在! blogId=" + blogId);
            return;
        }
        // 4. 判定登陆用户是否就是文章作者
        if (!blog.getUserId().equals(user.getUserId())) {
            // blog.getUserId() 文章的作者
            // user.getUserId() 从 session 里拿的登陆的用户是谁.
            // 不一样, 说明在删别人的文章.
            // 直接返回 403
            System.out.println(user.getUserId());
            resp.setStatus(403);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("当前您不能删除别人的博客!");
            return;
        }
        // 5. 真正执行删除操作.
        blogDao.deleteOneByBlogId(Integer.parseInt(blogId));
        // 6. 返回 302 重定向
        resp.sendRedirect("blog_list.html");
    }
}

③ "login"登录状态/注册

doGet:主要是获取登录状态,对应前端 getLoginStatus方法
doPost:对应前端login页面,实现用户登录逻辑
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.dnd.MouseDragGestureRecognizer;
import java.io.IOException;

@WebServlet("/login")
public class ServletLogin extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 从请求中获取到用户名和密码
        req.setCharacterEncoding("utf-8");
        String userId = req.getParameter("userid");
        String passWord = req.getParameter("password");
        if (userId == null || userId.equals("") || passWord == null || passWord.equals("")) {
            // 用户名密码为空. 直接返回登陆失败
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("用户名或密码为空! 登陆失败!");
            return;
        }

        // 2. 查询数据库, 验证用户名密码是否正确
        UserDao userDao = new UserDao();
        User user = userDao.selectOneByUserId(userId);
        if (user == null || !user.getPassWord().equals(passWord)) {
            // 用户名不存在, 或者密码不相同, 返回登陆失败
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("用户名或密码错误! 登陆失败!");
            return;
        }

        // 3. 如果正确, 创建一个会话对象
        HttpSession session = req.getSession(true);
        // 在会话中保存一下 user, 以备后面使用. 后续访问其他页面, 就可以直接通过会话拿到当前是哪个用户在访问了.
        session.setAttribute("user", user);

        // 4. 构造 302 响应报文
        resp.sendRedirect("blog_list.html");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 使用这个方法来针对当前登陆状态进行判定
        // 1. 获取一下当前的会话.
        HttpSession session = req.getSession(false);
        if (session == null) {
            // 没有会话, 当前是未登录状态
            resp.setStatus(403);
            return;
        }
        // 这里的 user 对象是否存在, 还是要判定的.
        // 是否会出现, session 存在, user 不存在的情况呢? 是的!!
        // 当下没有这个情况, 后面写到 "退出登陆" (注销), 就会涉及到这个情况
        User user = (User) session.getAttribute("user");
        if (user == null) {
            // 虽然有会话, 但是里面没有 user 对象, 也认为是未登录状态
            resp.setStatus(403);
            return;
        }

        // 2. 返回 200 这样的响应即可
        //    不写这个代码也行. 默认状态码就是 200
        resp.setStatus(200);
    }
}

④ "logout"注销退出账号

doGet:实现了用户登录注销功能,主要就是删除浏览器的session,然后返回登录页面
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/logout")
public class ServletLogout extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession(false);
        if (session == null) {
            resp.setStatus(403);
            return;
        }
        // 直接把 session 中之前的 user 对象给删掉即可!!
        session.removeAttribute("user");
        // 不要忘记重定向到登陆页面!
        resp.sendRedirect("login.html");
    }
}

⑤ "userInfo"获取登录信息

doGet:在博客列表页 和 博客详情页,的左侧会有用户信息的展示,而获取用户信息就是通过get方法请求"userInfo"来实现的
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/userInfo")
public class ServletUserInfo extends HttpServlet {
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取用户信息
        String blogId = req.getParameter("blogId");
        if (blogId == null) {
            // 列表页, 获取当前登陆用户的信息
            // 直接从 session 中获取即可~~
            getUserInfoFromSession(req, resp);
        } else {
            // 详情页, 获取文章作者的信息
            // 查询数据库
            getUserInfoFromDB(req, resp, Integer.parseInt(blogId));
        }
    }

    private void getUserInfoFromDB(HttpServletRequest req, HttpServletResponse resp, int blogId) throws IOException {
        // 1. 先根据 blogId 查询 Blog 对象, 获取到 userId (作者是谁)
        BlogDao blogDao = new BlogDao();
        Blog blog = blogDao.selectOneByBlogId(blogId);
        if (blog == null) {
            // 如果参数传来的这个 blogId 是随便瞎写的. 数据库里没有.
            resp.setStatus(404);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("blogId 不存在");
            return;
        }
        // 2. 根据 userId 查询对应的 User 对象即可
        UserDao userDao = new UserDao();
        User user = userDao.selectOneByUserId(blog.getUserId());
        if (user == null) {
            resp.setStatus(404);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("blogId 不存在");
            return;
        }
        // 3. 把 user 对象返回给浏览器了
        user.setPassWord("");
        resp.setContentType("application/json;charset=utf8");
        resp.getWriter().write(objectMapper.writeValueAsString(user));
    }

    private void getUserInfoFromSession(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        HttpSession session = req.getSession(false);
        if (session == null) {
            resp.setStatus(403);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("当前未登录");
            return;
        }
        User user = (User) session.getAttribute("user");
        if (user == null) {
            resp.setStatus(403);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("当前未登录");
            return;
        }
        // user 获取到了, 把 user 中的 password 给干掉, 然后返回.
        user.setPassWord("");

        resp.setContentType("application/json; charset=utf8");
        resp.getWriter().write(objectMapper.writeValueAsString(user));
    }
}

⑥ "userRegister"注册

实现用户的注册功能,通过接受发来的信息,然后再修改数据库内容即可
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/register")
public class ServletUserRegister extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setContentType("text/html;charset=utf8");
        // 1.获取请求的参数
        String userId = req.getParameter("username");
        String passWord = req.getParameter("password");
        String userName = req.getParameter("name");
        // 3.构造一个User对象
        User user = new User();
        user.setUserId(userId);
        user.setUserName(userName);
        user.setPassWord(passWord);
        // 4.插入到数据库
        UserDao userDao = new UserDao();
        userDao.insert(user);
        // 5.构造重定向  返回到这个博客的详情页
        resp.sendRedirect("login.html");
    }
}

⑦ "userUpdate"头像更新

实现了用户头像的上传和数据库内容更新
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.File;
import java.io.IOException;
@MultipartConfig
@WebServlet("/userUpdate")
public class ServletUserUpdate extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setContentType("text/html;charset=utf8");
        // 1.上传文件
        Part part = req.getPart("file");
        //获取HTTP头信息headerInfo=(form-data; name="file" filename="文件名")
        String headerInfo = part.getHeader("content-disposition");
        //从HTTP头信息中获取文件名fileName=(文件名)
        String fileName = headerInfo.substring(headerInfo.lastIndexOf("=") + 2, headerInfo.length() - 1);
        //获得存储上传文件的文件夹路径
        String fileSavingFolder = this.getServletContext().getRealPath("/head");
        //获得存储上传文件的完整路径(文件夹路径+文件名)
        //文件夹位置固定,文件夹采用与上传文件的原始名字相同
        String fileSavingPath = fileSavingFolder + File.separator + fileName;
        //如果存储上传文件的文件夹不存在,则创建文件夹
        File f = new File(fileSavingFolder + File.separator);
        if(!f.exists()){
            f.mkdirs();
        }
        //将上传的文件内容写入服务器文件中
        part.write(fileSavingPath);
        //2.修改用户信息
        HttpSession session = req.getSession(false);
        if (session == null) {
            // 没有会话, 当前是未登录状态
            System.out.println("session为空");
            resp.setStatus(403);
            return;
        }
        User user = (User) session.getAttribute("user");
        user.setHead("./head/"+fileName);
        //3.修改数据库内容
        UserDao userDao = new UserDao();
        userDao.update(user);
        //4.完成后,重定位到博客列表页
        resp.sendRedirect("blog_list.html");
        System.out.println("上传文件成功");
    }
}

(三)其他

文件说明:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ArcGIS Pro二次开发】(7):地图(Map)的基本操作

地图是ArcGIS Pro中的基础起点&#xff0c;也是大多数工程的基础。主要用于显示表示空间数据的图层。 一、地图(Map)的基本操作示例 1、获取当前地图 var map MapView.Active.Map; 2、获取一级图层 var lys map.Layers; 用于获取地图中的单一图层&#xff0c;以及图层组…

【正点原子FPGA连载】第十六章DP彩条显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十六章DP彩条显…

什么是路由?

什么是路由&#xff1f; 介绍 **路由是指路由器从一个接口上收到数据包&#xff0c;根据数据包的目的地址进行定向并转发到另一个接口的过程。**路由发生在OSI网络参考模型中的第三层即网络层。 路由引导分组转送&#xff0c;经过一些中间的节点后&#xff0c;到它们最后的目…

六【 SpringMVC框架】

一 SpringMVC框架 目录一 SpringMVC框架1.什么是MVC2.SpringMVC概述3.SpringMVC常见开发方式4.SpringMVC执行流程5.SpringMVC核心组件介绍6.快速构建Spring MVC程序✅作者简介&#xff1a;Java-小白后端开发者 &#x1f96d;公认外号&#xff1a;球场上的黑曼巴 &#x1f34e;个…

工业三防平板可应用于各种复杂苛刻的工作环境

伴随着工业互联网技术的快速发展&#xff0c;生产制造自然环境繁杂&#xff0c;机器设备规定比较严苛。普通平板在工业场景户外场景等都比较容易出现磕碰或者出现其它因素如进水、进灰尘而引发设备故障。三防平板之所以在建筑工程的应用较为广泛&#xff0c;这与其独特的性能是…

线性数据结构:数组 Array

一、前言数组是数据结构还是数据类型&#xff1f;数组只是个名称&#xff0c;它可以描述一组操作&#xff0c;也可以命名这组操作。数组的数据操作&#xff0c;是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数组&#xff0c;而是说&#xff0c…

scratch和平使者 电子学会图形化编程scratch等级考试一级真题和答案解析2022年12月

目录 scratch和平使者 一、题目要求 1、准备工作 2、功能实现 二、案例分析

视图、游标、慢查询日志

Java知识点总结&#xff1a;想看的可以从这里进入 目录2.7、视图、游标2.7.1、视图2.7.2、游标2.7、慢查询日志2.7、视图、游标 2.7.1、视图 视图是一种虚拟存在的表&#xff0c;同真实表一样&#xff0c;视图也由列和行构成&#xff0c;它不存在于数据库中&#xff0c;是我们…

【红黑树】红黑树插入操作相关的细节和疑难拆解分析

本文就红黑树的插入操作进行细致到每一个小步骤的解析。1&#xff0c;成员变量本红黑树使用了三叉链结构&#xff0c;使用的时候尤其要记得处理指向父亲的指针。为何在节点的构造函数中&#xff0c;默认节点的颜色为红色&#xff1f;因为考虑到红黑树的性质&#xff08;对于每个…

汇编语言 标志位总结

缩写原意: Overflow of = OV NV [No Overflow] Direction df = DN (decrement) UP (increment) Interrupt if = EI (enabled) DI (disabled) Sign sf = NG (negative) PL (positive) Zero zf = ZR [zero] NZ [ Not zero] Auxiliary Carry af = AC NA [ No AC ] Parity pf = PE…

计网个人作业05

R1 链路层可以提供如下服务 链路层服务IP能否提供&#xff1f;TCP能否提供&#xff1f;流量控制✔差错检测✔✔差错纠正全双工、半双工✔ R2 不冗余 IP层有丢包的情况⼀个⻓的 TCP 报⽂段会被分⽚成多个 IP 数据报形成不同的帧&#xff0c;不同的帧可能会被不同链路传输。同…

二.线性表之顺序表

文章目录前言一.顺序表的概念及结构二.顺序表的接口实现1.顺序表的动态存储2.顺序表的初始化3.顺序表尾插#封装&#xff1a;扩容函数4.顺序表尾删5.顺序表头插6.顺序表头删7.顺序表查找8.顺序表在pos位置插入x9.顺序表删除pos位置的值10.顺序表销毁11.顺序表打印三.源1.Seqlist…

3000字,聊一聊学习低代码和学习编程到底有什么区别?

作者介绍胡艳平&#xff0c;万应低代码联合创始人、CTO&#xff0c;中国信通院低代码/无代码推进中心技术专家&#xff0c;全国信标委《低代码开发平台能力要求》起草人之一。曾有科技公司CTO问我&#xff1a;低代码是不是一种不用敲代码的编程语言&#xff1f;在不确定低代码能…

机器人学习的坚持与收获-2023

所有的机会都需要自己努力去争取&#xff0c;毕竟天会下雨下雪&#xff0c;但是不会掉馅饼。之前写过关于毕业生的一些博文。机器人工程ROS方向应用型本科毕业设计重点课题学生验收成果&#xff08;暂缓通过&#xff09;机器人工程ROS方向应用型本科毕业设计重点课题学生验收成…

如何让人机对话更自然?

来源&#xff1a;投稿 作者&#xff1a;顾相欢 编辑&#xff1a;学姐 AAAI-2022|定制对话的人设和知识背景 原文标题&#xff1a; Call for Customized Conversation: Customized Conversation Grounding Persona and Knowledge 原文链接&#xff1a; https://arxiv.org/ab…

分类预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆网络数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆网络数据分类预测 目录分类预测 | MATLAB实现WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆网络数据分类预测分类效果基本描述程序设计参考资料分类效果 基本描述 1.Matlab实现WOA-CNN-BiLSTM鲸鱼算法优化卷…

Ubuntu下gcc多版本管理

Ubuntu下多gcc版本的管理 开发过程中&#xff0c;在编译一个开源项目时&#xff0c;由于代码使用的c版本过高&#xff0c;而系统内置的gcc版本过低时&#xff0c;这个时候我们就需要升级gcc版本&#xff0c;但是为了避免兼容性问题&#xff0c;安装多个版本的gcc&#xff0c;然…

uniapp中调用.net6 webapi

使用uniapp开发程序时&#xff0c;不管是小程序&#xff0c;还是H5界面&#xff0c;它们只是一个显示界面&#xff0c;也就是只充当前台界面&#xff0c;那么我们后台使用.net6 webapi写业务逻辑&#xff0c;然后前端访问后端&#xff0c;即可实现前后端分离开发软件的模式。 …

连不上虚拟机我谁都怀疑了!唯独没怀疑VirtualBox这个浓眉大眼的家伙!

这里写自定义目录标题一、问题和现象环境二、思考和尝试三、问题原因VirtualBox NAT模式的坑四、解决办法1、双网卡2、配置转发端口一、问题和现象 fileZilla连接不上虚拟机&#xff08;Linux/centOS&#xff09;。 ping不通虚拟机。 ssh连接不上虚拟机。 环境 Win10主机使用…

上岸16K,薪资翻倍,在华为外包做测试是一种什么样的体验····

现在回过头看当初的决定&#xff0c;还是正确的&#xff0c;自己转行成功&#xff0c;现在进入了华为外包测试岗&#xff0c;脱离了工厂生活&#xff0c;薪资也翻了一倍不止。 我17年毕业于一个普通二本学校&#xff0c;电子信息工程学院&#xff0c;是一个很不出名的小本科。…