博客系统的后端设计(八) - 实现发布博客功能

news/2024/11/8 15:05:25/

文章目录

  • 发布博客
    • 1. 约定前后端交互接口
    • 2. 服务器代码
    • 3. 客户端代码
    • 4. 出现的问题

发布博客


在原来的编辑页面点击发布文章按钮,是不会有什么效果的。
这是因为此时还不能实现前后端的交互。

1. 约定前后端交互接口

请求使用 POST,路径是 /blog
title=这是标题&content=这是正文

请求中要有 body,按照 form 表单的方式添加进去。

响应使用 HTTP/1.1 302
跳转到列表页:Location: blog.list.html

在一篇博客当中,它有 blogId、title、content、userId、postTime 属性。
只有 title 和 content 是需要自己获取的,blogId 是自增主键,数据库会自己生成;
userId 是作者信息,看提交博客的用户是谁,直接从会话中拿即可;
postTime 是当前的时间。

2. 服务器代码


在之前实现好的 BlogServlet 类中重写一个 doPost 方法。

 @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 发布博客// 读取请求,构造 Blog 对象,插入数据库即可HttpSession httpSession = req.getSession(false);if (httpSession == null) {// 未登录resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前未登录,无法发布博客!!!");return;}User user = (User) httpSession.getAttribute("user");if (user == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前未登录,无法发布博客!!!");return;}// 确定登陆之后,就可以把作者给拿到了// 获取博客标题和正文String title = req.getParameter("title");String content = req.getParameter("content");if (title == null || "".equals(title) || content == null || "".equals(content)) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前提交的数据有误,标题或正文为空!!!");return;}// 构造 Blog 对象Blog blog = new Blog();blog.setTitle(title);blog.setContent(content);blog.setUserId(user.getUserId());// 发布时间在 java 中生成/数据库都可以blog.setPostTime(new Timestamp(System.currentTimeMillis()));// 插入数据库BlogDao blogDao = new BlogDao();blogDao.add(blog);// 跳转到博客列表页resp.sendRedirect("blog.list.html");}

3. 客户端代码


将之前的写的编辑区容器代码改为以下代码。

<!-- 编辑区容器 -->
<div class="blog-edit-container"><form action="blog" method="post"><!-- 博客标题编辑区 --><div class="title"><input type="text" id="title" placeholder="请输入文章标题" name="title"><input type="submit" id="submit" value="发布文章"></div><!-- 博客编辑器 是为了和 markdrow 编辑器对接而设置的--><div id="editor"><textarea name="content" style="display: none"></textarea></div></form>
</div>

4. 出现的问题


接下来启动服务器,在用户登录后发布一个博客。此时可以看到虽然自动跳转到了列表页,但是出现乱码了。



发布博客后发现乱码了,此时考虑乱码是提交的时候乱的,还是获取的时候乱的。

如果是提交的时候乱的,只需要看一下数据库是不是乱的;此处应该是提交的的时候乱的,
因为提交功能是新写的,还没有测试过,获取博客已经测试过了。


查看数据库后可以看到此时的数据库是乱的。


解决:

先将乱码的记录删除,之后在指定字符集。





此时文章发布成功。


http://www.ppmy.cn/news/83234.html

相关文章

大数据治理入门系列:数据血缘关系

血缘关系在人类社会中扮演着重要角色。大多数家庭是基于血缘关系形成的&#xff0c;而家庭作为社会的基本单元&#xff0c;对维系社会稳定发挥着重要关系。其实&#xff0c;数据之间也存在类似的血缘关系。数据从产生、加工、流转&#xff0c;一直到消亡&#xff0c;每个环节必…

【SpringMVC】| SpringMVC拦截器

目录 一&#xff1a;SpringMVC拦截器 1. 拦截器介绍 2. HandlerInterceptor接口分析 3. 自定义拦截器实现权限验证 一&#xff1a;SpringMVC拦截器 SpringMVC 中的 Interceptor 拦截器&#xff0c;它的主要作用是拦截指定的用户请求&#xff0c;并进行相应的预处理与后处理…

Spring Security 如何实现身份认证和授权?

Spring Security 是一个开源的安全框架&#xff0c;提供了基于权限的访问控制、身份认证、安全性事件发布等功能。在 Spring Boot 应用中使用 Spring Security 可以非常方便地实现用户身份认证和授权。 Spring Security 实现身份认证的主要方式是使用认证过滤器链&#xff0c;…

MySQL数据库中,在读已提交和可重复读这两个不同事务隔离级别下幻读的区别

目 录 1. 前 言1.1 并发事务存在的问题1.2 事务的隔离级别1.3 快照读和当前读 2. 不同事务隔离级别下幻读的区别2.1 读已提交下的幻读2.2 可重复读下的幻读2.2.1 情况一&#xff0c;无幻读2.2.2 情况二&#xff0c;有幻读2.2.3 情况三&#xff0c;有幻读 3. 小 结 1. 前 言 在…

基于 Prometheus 的 SLO告警实战

Prometheus是一个流行的开源监控系统&#xff0c;它可以帮助我们收集、存储和查询应用程序或系统的时间序列数据。在使用Prometheus进行监控时&#xff0c;通常需要根据服务水平指标&#xff08;Service Level Objectives&#xff0c;简称SLO&#xff09;来设置告警规则。 SLO…

linux学习[11]磁盘与文件系统(2):lsblkblkidpartedfdiskgdiskmkfs

文章目录 前言&#xff1a;1. 磁盘容量1.1 lsblk1.2 blkid1.3 parted 2. 磁盘分区2.1 fdisk/gdisk2.2 磁盘分区实例参考&#xff1a; 3. 磁盘格式化3.1 mkfs.xfs3.2 mkfs.ext43.3 mkfs.vfat 总结&#xff1a; 前言&#xff1a; 写了VMware的磁盘扩容之后&#xff0c;磁盘分区格…

标签派单系统架构设计

需求描述 项目背景 根据员工历史成单情况&#xff0c;计算员工对不同类型工单的转化能力。根据员工和工单标签匹配进行派单。 业务流程图 规则描述 每10分钟&#xff0c;分城进行一次派单&#xff0c;派单规则可能会动态删减&#xff0c;需要支持动态配置 工单标签说明 一…

Nginx Web页面缓存 Rsync远程同步

Nginx Web页面缓存 在http块中加配置&#xff1a; proxy_cache_path /data/nginx/cache levels1:2 keys_zonemy_cache:10m max_size10g inactive60m use_temp_pathoff ##################################### path&#xff1a;强制参数&#xff0c;指定缓存文件的存放路径 …