【JavaEE】前后端综合项目-博客系统(下)

【JavaEE】前后端综合项目-博客系统(下)

在这里插入图片描述

【JavaEE】前后端综合项目-博客系统(下)

紧接上文:【JavaEE】前后端综合项目-博客系统(上)_s:103的博客-CSDN博客

1. 博客登录页

1.1 用户名密码校验

在这里插入图片描述

1.1.1 约定前后端交互接口

请求:POST

向谁请求:/login

响应:302(重定向)location:博客列表页

请求的正文格式:application/x-www-from-urlencoded

  • query string格式一样
  • ?username=xxx&password=xxx
  • 这里我们前端代码就是通过from表单提交的,所以就简单的用这个也可以~
1.1.2 后端代码

在这里插入图片描述

  1. 获得的是form格式的请求,那么后端要以utf8去理解
  2. 用getParameter方法去获取参数
  3. 在数据库中去查找核对
  4. 核对成功再重定向
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf8");
    resp.setContentType("text/html;charset=utf8");
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    if(username == null || username.replaceAll(" ", "").equals("") 
       || password == null || password.replaceAll(" ", "").equals("")) {
        String html = "<h3>登录失败</h3>";
        resp.getWriter().write(html);
        return;
    }
    UserDao userDao = new UserDao();
    User user = userDao.selectUserByName(username);
    if(user == null) {
        String html = "<h3>登录失败</h3>";
        resp.getWriter().write(html);
    }else {
        if(user.getPassword().equals(password)) {
            HttpSession httpSession = req.getSession(true);
            httpSession.setAttribute("user", user);
            resp.sendRedirect("博客列表页.html");
        }else {
            String html = "<h3>登录失败</h3>";
            resp.getWriter().write(html);
        }
    }
}
  • 没有重定向,from表单跳转到/login,也就是响应的内容

重定向中有中文会导致重定向失败:
在这里插入图片描述

将html文件的名字改文英文,并且其他关联代码都需要更改!

resp.sendRedirect("blog_list.html");
1.1.3 前端代码

在这里插入图片描述

在这里插入图片描述

1.2 登录信息记忆功能

要求:

  1. 登录页在有登录信息的时候,核对成功后自动登录
  2. 其他页面在没有登录信息的时候,强制退出登录
1.2.1 约定前后端交互接口

请求:GET

向谁请求:/login

响应:成功:200,失败:403

  • 前端可以通过success接受2开头的响应信息,error接受其他响应信息
1.2.2 后端代码
  • 由于无更改密码的操作,所以在会话中,只有登录成功才有记录,所以只需要判断有没有对应的映射就行了
ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    HttpSession session = req.getSession(false);
    if(session == null) {
        resp.setStatus(403);
        return;
    }
    User user = (User) session.getAttribute("user");
    if(user == null) {
        resp.setStatus(403);
        return;
    }
    resp.setStatus(200);
    resp.setContentType("application/json; charset=utf8");
    String ret = objectMapper.writeValueAsString(user);
    resp.getWriter().write(ret);
}
1.2.3 前端代码
  • 只需要在访问对应html的时候发送请求即可

其他三个页面

jQuery.ajax({
    type:"get",
    url:"login",
    error: function(body) {
        location.href = "blog_login.html";
    }
});

登录页

jQuery.ajax({
    type: "get",
    url: "login",
    success: function(body) {
        location.href = "blog_list.html";
        alert("欢迎" + body.username + "!");
    }
});

在这里插入图片描述

1.3 显示用户/作者信息功能

要求:

  1. 列表页左侧栏显示的是登录的用户信息
  2. 详情页左侧栏显示的是博客作者的信息

对于列表页,复用一下刚才的后端代码即可,因为成功的时候,会返回用户信息user的json字符串

  • 只需要前端对success的情况进行处理即可
    在这里插入图片描述

在这里插入图片描述

而对于详情页,则需要多一段逻辑:通过博客id,确定用户id

1.3.1 约定前后端交互接口

请求:GET

向谁请求:/user&blogId=xxx

响应:这篇博客作者的用户信息(json)

1.3.2 后端代码

在这里插入图片描述

ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf8");
    String id = req.getParameter("blogId");
    if(id == null) {
        resp.setStatus(404);
        return;
    }
    BlogDao blogDao = new BlogDao();
    Blog blog = blogDao.selectOne(Integer.parseInt(id));
    if(blog == null) {
        resp.setStatus(404);
        return;
    }
    UserDao userDao = new UserDao();
    User user = userDao.selectUserById(blog.getUserId());
    if(user == null) {
        resp.setStatus(404);
        return;
    }
    user.setPassword("");//返回密码有点不安全~
    resp.setContentType("application/json; charset=utf8");
    String ret = objectMapper.writeValueAsString(user);
    resp.getWriter().write(ret);
}
  • 返回404代表不存在,跳转到列表页~
1.3.3 前端代码
jQuery.ajax({
    type:"get",
    url:"user" + location.search,
    success: function(body) {
        jQuery(".card h3").text(body.username);
        jQuery(".card img").attr("src", body.image);
        jQuery(".card a").attr("href", body.git);
    },
    error: function(body) {
        location.href = "blog_list.html";
        alert("error");
    }
});

为了有区分,我们在数据库里添加几个user

insert into user values(null, '小空多尼', '123456', '马铭胜帅照.png', 'https://gitee.com/bitpg/projects');
insert into user values(null, '小空你几哇', '123456', '微信图片_20230225230636.png', 'https://gitee.com/HGtz2222');
insert into user values(null, '小斯密码塞', '123456', 'JavaEE.png', 'https://gitee.com/gaobo1');

在这里插入图片描述

1.4 退出登录功能

要求:

  1. 退出登录(注销登录信息)后,返回到登录页
  2. 并且登录页不会强制登录,并且直接访问其他页面会强制退出登录
1.4.1 前后端交互接口

请求:GET

向谁请求:/logout

响应:重定向到博客登录页

  • 最主要是在期间让session失效
  • 即打断映射关系

而请求只需要让a标签发出即可

1.4.2 后端代码
@WebServlet("/logout")
public class logoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession(false);
        if(session != null) {
            session.removeAttribute("user");
            //session.invalidate();也可以,但是这个是把整个session失效
        }
        resp.sendRedirect("blog_login.html");
    }
}
1.4.3 前端代码
  • 前端代码及其简单
    在这里插入图片描述

在这里插入图片描述

2. 博客编辑页

无非就是将所编辑的博客打包成blog存进数据库呗,其他都好办,除了博客的内容,是在md编辑器里的一个元素的内容,所以要通过一些特殊方法(官方给出的方法)

  1. 构造隐型文本框
  2. 内容同步到文本框
2.1 前后端交互接口

请求:POST

向谁请求:/blog

请求正文:application/x-www-from-urlencoded

  • ?title=xxx&content=xxxxx
  • 用户id,博客id,时间都可以在后端自己获取

响应:非空校验后重定向到主页,否则显示提交失败

2.2 后端代码

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf8");
    HttpSession session = req.getSession(false);
    String content = req.getParameter("content");
    String title = req.getParameter("title");
    if(session == null ||
       title == null || title.replaceAll(" ", "").equals("") ||
       content == null || content.replaceAll(" ", "").equals("")
      ) {
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("<h3>提交失败!</h3>");
        return;
    }
    User user = (User) session.getAttribute("user");
    Blog blog = new Blog();
    blog.setTitle(title);
    blog.setPostTime(new Timestamp(System.currentTimeMillis()));
    blog.setContent(content);
    blog.setUserId(user.getUserId());
    BlogDao blogDao = new BlogDao();
    blogDao.insert(blog);
    resp.sendRedirect("blog_list.html");
}

2.3 前端代码

在这里插入图片描述

  • 隐型输入框

在这里插入图片描述

  • 同步到输入框

补充,导航栏的头像我不更改,那是系统的创作者的头像/logo,所以不更改
在这里插入图片描述


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

后续推出更多功能,敬请期待!

通过这个项目可以很好的提高我们对前后端交互的认知!

本文代码链接:BlogSystem · 游离态/马拉圈2023年7月 - 码云 - 开源中国 (gitee.com)


  • 30
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s:103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值