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

news/2024/4/25 16:10:12/文章来源:https://blog.csdn.net/qq_52328493/article/details/129160398
  • 项目体验地址(账号: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;}//这是一个排序方法@Overridepublic 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>() {@Overridepublic 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.查--根据UserIdpublic 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 {@Overrideprotected 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));}}@Overrideprotected 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 {@Overrideprotected 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. 获取到 blogIdString 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 里拿的登陆的用户是谁.// 不一样, 说明在删别人的文章.// 直接返回 403System.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 {@Overrideprotected 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");}@Overrideprotected 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 这样的响应即可//    不写这个代码也行. 默认状态码就是 200resp.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 {@Overrideprotected 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();@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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.luyixian.cn/news_show_73694.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见前端基础面试题(HTML,CSS,JS)(三)

JS 中如何进行数据类型的转换&#xff1f; 类型转换可以分为两种&#xff0c;隐性转换和显性转换 显性转换 主要分为三大类&#xff1a;数值类型、字符串类型、布尔类型 三大类的原始类型值的转换规则我就不一一列举了 数值类型&#xff08;引用类型转换&#xff09; Numbe…

什么是SSL端口?HTTPS配置技术指南

安全套接字层&#xff08;SSL&#xff09;是负责互联网连接的数据身份验证和加密的技术。它加密在两个系统之间&#xff08;通常在服务器和客户端之间&#xff09;之间通过互联网发送的数据&#xff0c;使其保持私密。随着在线隐私的重要性日益增加&#xff0c;您应该熟悉SSL端…

「RISC-V Arch」SBI 规范解读(上)

术语 SBI&#xff0c;Supervisor Binary Interface&#xff0c;管理二进制接口 U-Mode&#xff0c;User mode&#xff0c;用户模式 S-Mode&#xff0c;Supervisor mode&#xff0c;监督模式 VS-Mode&#xff0c;Virtualization Supervisor mode&#xff0c;虚拟机监督模式 …

电商共享购模式,消费增值返利,app开发

在当今以市场需求为主导的数字经济时代&#xff0c;消费者需求呈现出精细化管理和多元化的特性&#xff0c;目标市场日渐完善&#xff0c;另外在大数据技术迅速进步和运用的驱动下&#xff0c;总体行业的发展节奏感也在不断加速。因而&#xff0c;企业需要建立一套灵活多变的经…

HyperGBM用Adversarial Validation解决数据漂移问题

本文作者&#xff1a;杨健&#xff0c;九章云极 DataCanvas 主任架构师 数据漂移问题近年在机器学习领域来越来越得到关注&#xff0c;成为机器学习模型在实际投产中面对的一个主要挑战。当数据的分布随着时间推移逐渐发生变化&#xff0c;需要预测的数据和用于训练的数据分布…

格雷码的实现

格雷码&#xff1a;任意两个相邻的二进制数之间只有一位不同 想必通信专业的学生应该都接触过格雷码&#xff0c;它出现在数电、通信原理等课程里。 如下图所示一个四位格雷码是什么样子的&#xff1a; 格雷码的特点&#xff1a; 其最大的特点是任意上下相邻的两个码值间&am…

线性数据结构:数组 Array

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

内网渗透(五十六)之域控安全和跨域攻击-非约束委派攻击

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

Linux下java服务占用cpu过高如何处理

Linux下java服务占用cpu过高如何处理 top命令查看进程信息 top按下shiftp,按cpu使用率排行,可见进程1932占用最高,并且是一个java服务 使用jps命令确认java服务 [rootVM-16-16-centos ~]# jps 1011 Jps 9462 yuan_back-0.0.1-SNAPSHOT.jar 1932 spigot-1.18.jar查找异常进程中…

利用关联来发现复杂攻击模式

日志是网络活动的重要依据&#xff0c;包含了关于您网络上所有用户和系统活动的详尽信息。基本日志分析可帮助您轻松地对数百万个日志进行分类&#xff0c;并挑选出可以表明存在可疑活动的日志&#xff0c;识别与正常网络活动不符的异常日志。通常&#xff0c;单独查看某个日志…

GCC:从源文件到可执行文件

GCC&#xff1a;从源文件到可执行文件 假设我们有hello.c 文件 #include <stdio.h> int main(){printf("hello world!\n");return 0; }怎么在linux上利用GCC命令生产可执行文件&#xff08;单文件编译&#xff09;呢&#xff1f; 一、流程 C文件从源文件到…

5.35 综合案例2.0 -称重数据上传云端

综合案例2.0 - 称重数据上传云端案例说明连线功能实现1.阿里云平台连接代码应用开发3.1新建‘普通项目’3.2关联产品和设备3.3新建‘移动应用’3.4添加组件3.5配置组件信息3.6保存预览案例说明 使用hx711串口模块称重,结合IOT studio制作手机APP远程控制并采集物体重量。 hx7…

称重传感器差分输入信号隔离转换直流放大变送器0-±10mV/0-±20mV转0-10V/4-20mA

主要特性DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源&#xff0c;向输入端和输出…

Oracle——物化视图

文章目录含义物化视图的语法物化视图的创建1、自动刷新的物化事务 ON COMMIT2、非自动刷新的物化视图 ON demand关于手动刷新物化视图的删除资料参考含义 什么是物化视图&#xff1f; 物化视图&#xff0c;通俗点说就是物理化的视图。 什么叫物理化&#xff1f; 将视图以表结构…

可怕,chatGPT用3小时教会我数据分析

chatGPT这玩意真的是我的救星,用它作为我的Python教练,我用三个小时学会了数据处理(Pandas)和绘图(matplotlib)。 这两个库的学习,在之前已经困扰了我7个月。之前卡壳的原因,是我一直没有耐心从零开始,按照教材设置的教程去学习Python——我擅长在项目中学习,一点一点…

SpringMVC框架知识详解(入门版)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

「RISC-V Arch」SBI 规范解读(下)

第六章 定时器扩展&#xff08;EID #0x54494D45"TIME"&#xff09; 这个定时器扩展取代了遗留定时器扩展&#xff08;EID #0x00&#xff09;&#xff0c;并遵循 v0.2 中定义的调用规约。 6.1 函数&#xff1a;设置定时器&#xff08;FID #0&#xff09; struct sbi…

TensorFlow-Keras - FM、WideAndDeep、DeepFM、DeepFwFM、DeepFmFM 理论与实战

目录 一.引言 二.浅层模型概述 1.LR 2.FM 3.FMM 4.FwFM 5.FmFM 三.常用推荐算法实现 Pre.数据准备 1.FM 2.WideAndDeep 3.DeepFM 4.DeepFwFM 5.DeepFmFM 四.总结 1.函数测试 2.函数效果与复杂度对比[来自FmFM论文] 3.More 一.引言 推荐系统中常见的 CTR 模型…

梯度下降优化器:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam -> AdamW

目录 1 前言 2 梯度概念 3 一般梯度下降法 4 BGD 5 SGD 6 MBGD 7 Momentum 8 SGDM&#xff08;SGD with momentum&#xff09; 9 NAG(Nesterov Accelerated Gradient) 10 AdaGrad 11 RMSProp 12 Adadelta 13 Adam 13 Nadam 14 AdamW 15 Lion&#xff08;EvoLve…

【C++进阶】一些小知识点

const限定符 用const给字面常量起个名字&#xff08;标识符&#xff09;&#xff0c;这个标识符就称为标识符常量&#xff1b;因为标识符常量的声明和使用形式很像变量&#xff0c;所以也称常变量。声明方式&#xff1a; const int a 77; const float PI 3.14159f&#xff…