项目体验地址(账号:123,密码:123)http://120.53.20.213:8080/blog_system/login.html
项目码云Gitee地址:https://gitee.com/GoodManSS/project/tree/master/blog_system
(一)准备工作
因为是一个简单的博客系统,所以软件开发的基本流程这里我们就简要一些,主要分为 需求分析,数据库设计
需求分析
① 实现博客列表的展示功能
② 实现博客详情的展示功能
③ 登录功能
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文件内容
④ 最终目录截图

(二)写后端代码
连接数据库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);
}
}
}
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("上传文件成功");
}
}
(三)其他
文件说明:
