博客系统后端设计(四) - 实现获取博客详情页功能

news2025/2/26 14:15:01

文章目录

  • 实现获取博客详情页功能
    • 约定前后端接口
    • 实现后端代码
    • 实现前端代码

实现获取博客详情页功能


在 博客列表页 点击 “查看全文” 按钮,就能跳转到博客详情页中。
跳转过去之后,在博客详情页中发起一个 ajax,从服务器获取到当前博客的具体内容。



通过 blog.detail.html 再去发一个 ajax 请求,从服务器获取到博客的详情数据。

约定前后端接口

此时约定请求是 GET,路径是 /blog?blogId=1
响应也是一个 json 格式的,但是不是一个数组了,HTTP/1.1 200 OK



因为在博客详情页只需要展示一篇博客,因此不需要一个数组,只包含一篇博客即可。
而且因为此处展示的是一篇博客的详情页,因此,不需要像列表页一样对文章进行截断。

此处的路径可以和博客列表页相同也可以不相同。
如果相同,就直接在 BlogServlet(在实现博客列表页功能中)类中修改代码即可。
如果是不同的路径,重新创建一个类,在新的类中实现功能即可。

之前的博客列表,请求里没有 query string,此处的博客详情是带有 query string
如果存在,就返回指定博客的详情页;如果不存在,就返回把博客列表页。

实现后端代码


此处我们采用与博客列表页相同的路径,此时在 BlogServlet 类中修改代码即可。

@WebServlet("/blog")
public class BlogServlet extends HttpServlet {
    private ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 尝试获取 queryString 里的 blogId 字段
        BlogDao blogDao = new BlogDao();
        String blogId = req.getParameter("blogId");
        if (blogId == null) {
            // queryString 不存在,转化为符合要求的字符串
            List<Blog> blogs = blogDao.selectAll(); // 调用方法直接查询出全部的博客列表
            // 使用 ObjectMapper 将 blogs 转成符合要求的 json 格式的字符串
            String respJson = objectMapper.writeValueAsString(blogs);
            resp.setContentType("application/json; charset=utf8");
            resp.getWriter().write(respJson);
        } else {
            // queryString 存在,此时请求获取的是指定 id 的博客
            Blog blog = blogDao.selectById(Integer.parseInt(blogId));
            String respJson = objectMapper.writeValueAsString(blog);
            resp.setContentType("application/json; charset=utf8");
            resp.getWriter().write(respJson);
        }
    }
}

如果 queryString 不存在,要显示出来的是所有的博客,因此,调用的方法是 selectAll
如果 queryString 存在,要显示的是具体的某一篇博客,因此,调用的方法是 selectById
也就是根据博客 id 来查找具体是哪一篇博客。

String blogId = req.getParameter("blogId");

以上这条语句中的 blogId 看起来是一个整数,但是实际上 getParameter返回的是一个字符串。
只能在后续使用的时候,手动转成 int。

 Blog blog = blogDao.selectById(Integer.parseInt(blogId));

通过以上代码中的 Integer.parseInt(blogId),将 blogId 转为 int,再通过 selectById 查找。

实现前端代码




选择上面的 blog.detail.html 以 vscode 打开。


将博客的正文、标题、发布时间部分删除。


(1) 在一个 script 标签里引入 jQuery。




(2) 使用一个新的 script 标签来发起请求。



这和之前约定好的是一样的,请求的类型是 get。

location.search 会获取到当前页面的 query string。

打开开发者工具控制台,键入 location.search,就可以得到以下的路径。





而这个路径就是具体的博客详情页的路径。


(3) 更新博客标题




(4) 更新发布时间




(5) 更新正文

首先将 类选择器 更改为 id 选择器。



当前写的博客,是使用 markdown 格式来组织的。

比如博客的内容是



当前的内容是带有一些 markdown 的符号的,但是最终显示到网页上的是经过渲染之后效果。



以上就是一个 markdown 渲染前的情况。



以上就是一个渲染后的效果,也就是最终显示在页面上的效果。

此时可以使用 editor.md 对 markdown 内容进行转换。

具体转换的方式是, editor.md 提供了一个方法,editormd.markdownToHTML。
这个方法把 markdown 字符串转成了 html 字符串。

接下来是引入 editor.md 依赖



打开 blog.edit.html 文件,在这个文件里之前引入过 editor.md 依赖。

<link rel="stylesheet" href="editor.md/css/editormd.min.css" />
<script src="editor.md/lib/marked.min.js"></script>
<script src="editor.md/lib/prettify.min.js"></script>
<script src="editor.md/editormd.js"></script>


直接将以上代码复制到以下位置。

<link rel="stylesheet" href="editor.md/css/editormd.min.css" />


如下图以上这条语句可以放在最顶端。





第一个参数描述的是 有哪个标签相关联,第二个参数描述 针对哪个内容进行格式化转换

editormd 里面有一个 api ,能把 markdown 格式的字符串转成 HTML
输出到 #content 这个标签内部了。

现在前后端的代码就写完了,接下来启动服务器看看什么效果。

完整代码

<script>
    $.ajax({
        type: 'get',
        url: 'blog' + location.search,
        success: function(body) {

            // 处理此处的响应结果,此处的 body 表示的就是一个博客 js 对象
            // 1.更新标题
            let titleDiv = document.querySelector('.container-right .title');
            titleDiv.innerHTML = body.title;
            // 2.更新日期
            let dateDiv = document.querySelector('.date');
            dateDiv.innerHTML = body.postTime;
            // 3.更新博客正文
            // 此处不应该直接把博客正文填充到这个标签里
            // 而是应该渲染后再填充
            editormd.markdownToHTML('contet', {markdown: body.content});
        }
    })
</script>

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

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

相关文章

【AI大模型】讯飞版大模型来了,现场发布四大行业应用成果

文章目录 前言SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写亲自体验写在最后前言 5月6日,讯飞星火认知大模型成果发布会在安徽合肥举行。科大讯飞董事长刘庆峰、研究院院长刘聪发布讯飞星火认知大模型,现场实测大模型七大核心能力,并…

和众视野加入飞桨技术伙伴计划,共同推动纺织行业智能化转型

近日&#xff0c;北京和众视野科技有限公司正式加入飞桨技术伙伴计划&#xff0c;双方将共同努力开发AI视觉检测技术和机器人流程自动化相结合的系统解决方案。 北京和众视野科技有限公司 北京和众视野是一家实验室检测仪器及解决方案供应商&#xff0c;一直专注于视觉检测和检…

我们在追求什么?以及我们将通往何方?记录AIGC共建者大会的一次演讲

‍‍ ​ 下一秒&#xff1a; 这个世界真如我们所见那样吗&#xff1f; 大家好&#xff0c;我是shadow。在特赞主办的AIGC创建者大会上&#xff0c;我分享了作为多重职业身份所从事的一些有意思的事情&#xff1a; 作为创作者&#xff0c;生成式人工智能展示了TA的才华&#xff…

【Fluent】XYplot中导出随着XYZ单一坐标变化的物理量规律

一、问题背景 之前我写的博客里&#xff0c;讲了如何导出区域内所有节点/单元格中心的XYZ三坐标&#xff0c;及其这个节点/单元格中心上存储的物理量信息。 但是有时候&#xff0c;我们有一个需求——只需要X、Y、Z坐标中的一个。 例如我们需要导出在某一条线上随X坐标变化的…

AICG,人工智能自动生成内容——根据文本生成图像,视频,音频

文章目录 1、什么是AICG&#xff1f;2、Text2Video3、Text2Image4、Text2Audio5、AICG的发展趋势 1、什么是AICG&#xff1f; 什么是AICG&#xff1f; AICG是指人工智能自动生成内容。通过算法模型&#xff0c;将文本转化为图像、音频、视频等多种形式。在数字时代&#xff0…

R语言 | 数据分析——统计绘图

目录 一、分类数据的图形描述 1.1 条形图barplot()函数 1.2 饼图pie()函数 二、量化数据的图形描述 2.1 点图与dotchart()函数 2.2 绘图函数plot() 2.2.1 绘制时间数列对象 ​2.2.2 向量数据与plot()函数 2.2.3 数据框数据与plot()函数 2.2.4 因子型数据与plot()函数 …

YARN 监控管理以资源管理

YARN的监控管理和资源管理 YARN WebUI V1服务JobHistoryServer服务配置 TimelineServer服务 YARN操作维护命令USER用户命令applicationjarapplicationattemptcontainerlogsqueuenodeversion Admin 管理命令resourcemanager | nodemanagerproxyserverdaemonlogrmadmintimelinese…

jenkins+springboot+gitee自动化部署项目

1、新建 maven项目我取名first 2、点击项目进行配置 3、源码管理配置 4、新建 stop.sh脚本 4、vim 编辑stop.sh脚本,build前停止jar #!/bin/bash # 获取jar包的pid pidps -ef | grep java | grep projectmonitor | awk {printf $2} if [ ! -z $pid ]; then kill -9 $pid …

Java面向对象三大特性封装和private关键字

目录 友情提醒一、Java面向对象的三大特性之封装1&#xff09;概念和好处2&#xff09;封装案例①访问权限修饰符&#xff08;private&#xff09;②构造方法与gette&setter方法③具体的封装案例 友情提醒 先看文章目录&#xff0c;大致了解知识点结构&#xff0c;直接点击…

苹果mac清理软件CleanMyMac X v4.13兼容13系统,堪称Mac最好的系统清理工具

CleanMyMac X for mac是MacOS上一款Mac清理优化工具&#xff0c;不仅包含各种清理功能&#xff0c;更是具有卸载器、维护、扩展、碎纸机这些实用功能&#xff0c;可以同时代替很多工具。它可以清理&#xff0c;优化&#xff0c;保养和监测您的电脑&#xff0c;确保您的Mac运行…

cleanmymac x 4.13新功能介绍,cleanmymac x怎么取消订阅

CleanMyMac X4.13版是一款运行在macOS系统中的专业清理软件&#xff0c;以安装方便、使用简易、功能完善等特点而闻名。CleanMyMac X在功能方面可以说是做到了极致&#xff0c;下面让我们看一下CleanMyMac X都包含有哪些功能。 CleanMyMac X是一款专业的Mac清理软件&#xff0c…

文件批量改名#批量修改文件名称中有特殊符号

在日常工作中&#xff0c;相信大家都会碰到&#xff0c;需要有修改文件名或文件夹名称等&#xff0c;修改方法也是很多种&#xff0c;如果遇到文件名有特殊符号&#xff0c;要如何把特殊符号删除或替换成自己需要的文字或其他表情符号呢。一般大家都是手动去修改&#xff0c;如…

安装和使用分布式HDFS系统在CentOS 8上进行文件上传操作

文章目录 实验目的和背景实验目的实验背景 实验过程步骤1&#xff1a;安装Java步骤2&#xff1a;下载hadoop-3.3.1.tar.gz步骤3&#xff1a;创建一个普通用户来运行Hadoop Hadoop 概念Hadoop 整体设计HDFSHDFS 的节点命名节点 (NameNode)数据节点 (DataNode)副命名节点 (Second…

语义分割学习笔记(四)膨胀卷积

推荐课程&#xff1a; 1.膨胀卷积_哔哩哔哩_bilibili&#xff08;膨胀卷积原理讲的很清楚&#xff09; 2.膨胀卷积(Dilated convolution)详解&#xff08;gradding effect问题和解决方法讲的很清楚&#xff09; 感谢博主霹雳吧啦Wz / 太阳花的小绿豆和Enzo_Mi提供视频讲解和源…

C++ OpenCV编译安装教程

文章目录 环境说明Cmake编译配置编译前配置编译选项开始正式编译安装 编写代码测试参考文章 环境说明 win10 MinGW64 Cmake 下载mingw64 (版本&#xff1a;12.1.0 posix-seh) 下载Cmake (版本3.17.5) 注&#xff1a;mingw64和cmake下载安装完成后记得把bin目录添加到【环境…

Video Grounding

一些工作能够检测包含特定动作的视频片段&#xff0c;一般称 为动作检测&#xff08;action detection&#xff09;或视频中的时序动作定位&#xff08;Temporal Action Grounding in Videos&#xff0c;TAGV&#xff09; 然而&#xff0c; TAGV 受限于预先定义的动作类别集合…

基于html+css的图展示57

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

母亲节:向世界上最伟大的母爱致敬

在这世间众多的亲情关系中&#xff0c;有一种关系无与伦比&#xff0c;毫不费力地凌驾于其他任何已知的地球关系之上。这种非凡的关系就是母亲与子女之间的关系。 母亲对家庭无尽的爱、奉献和忠诚使这份感情无价。为了向全球所有母亲表示敬意&#xff0c;母亲节在世界46个国家庆…

如何用ChatGPT拆解爆款内容(文章/脚本)、提出修改意见,再根据修改意见,最终成稿?

该场景对应的关键词库&#xff08;11个&#xff09;&#xff1a; 示例内容、爆款库、内容类型、拆解角度、亮点、不足、修改建议、文案、风格、文章、脚本 提问模板&#xff08;4个&#xff09;&#xff1a; 第一步&#xff1a;建立自己的爆款库&#xff0c;并选择其中1个爆款…

路径规划算法:基于鲸鱼优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于鲸鱼优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于鲸鱼优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法鲸鱼…