SpringBoot博客开发日常记录-博客浏览界面

本文记录了使用SpringBoot结合Thymeleaf构建博客浏览界面的过程。从编写ArticleController、实现ArticleService的getArticleById功能,到配置Mybatis的ArticleMapper和数据库操作,再到创建模板showArticle.html,最后讨论了@Controller与@RestController的区别以及在实际应用中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前是用markdown语法写博客,现在需要将博客展示
这里引入了thymeleaf模板

1. 编写ArticleController

@Autowired
    ArticleService articleService;
    @GetMapping("/article/showArticle/{articleId}")
    public String showArticle(@PathVariable("articleId") int articleId,
                              HttpServletResponse response,
                              Model model,
                              HttpServletRequest request){
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //articleService.getArticleById()
        Article article=articleService.getArticleById(articleId);
        if(article!=null&&article.getTitle()!=null){
            model.addAttribute("article",article);
        }
        response.setHeader("articleId",articleId+"");
        return "showArticle";
    }

2. 在ArticleService中实现了getArticleById函数

import java.util.List;

public interface ArticleService {
    public List<Article> findAllArticle();
    public List<Article> findUserArticle(int userid);
    public Article getArticleById(int id);
    public int createNewArticle(Article article);
    public List<Article> getArticleList();
}

ArticleServerImpl.class是ArticleService的实现类

import com.nevergetme.nevergetmeweb.bean.Article;
import com.nevergetme.nevergetmeweb.mapper.ArticleMapper;
import com.nevergetme.nevergetmeweb.service.ArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ArticleServerImpl implements ArticleService {
    @Autowired
    private ArticleMapper articleMapper;
    @Override
    public List<Article> findAllArticle() {
        List<Article> articles=articleMapper.getAllArticle();
        return articles;
    }

    @Override
    public List<Article> findUserArticle(int userid) {
        return articleMapper.getUserArticle(userid);
    }

    @Override
    public Article getArticleById(int id) {
        return articleMapper.getArticleById(id);
    }

    @Override
    public int createNewArticle(Article article) {
        return articleMapper.createNewArticle(article);
    }

    @Override
    public List<Article> getArticleList() {
        return articleMapper.getArticleList();
    }
}

3. ArticleMapper是mybatis映射

import com.nevergetme.nevergetmeweb.bean.Article;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;

@Mapper
public interface ArticleMapper {
    public List<Article> getAllArticle();
    public List<Article> getUserArticle(int userId);
    public Article getArticleById(int id);
    public int createNewArticle(Article article);
    public List<Article> getArticleList();
}

4. 在ArticlesMapper.xml中有具体的数据库操作

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.nevergetme.nevergetmeweb.mapper.ArticleMapper">
    <resultMap id="articleResultMap" type="com.nevergetme.nevergetmeweb.bean.Article">
        <id column="id" property="id"/>
        <result column="title" property="title"/>
        <result column="content" property="content"/>
        <result column="publishDate" property="publishDate"/>
        <result column="updateDate" property="updateDate"/>
        <result column="likes" property="likes"/>
        <association property="author" javaType="com.nevergetme.nevergetmeweb.bean.User">
            <id property="id" column="user_id"/>
            <result property="username" column="username"/>
        </association>
    </resultMap>
    <select id="getArticleById" parameterType="java.lang.Integer" resultMap="articleResultMap">
        select article.id,article.title,article.content,
               DATE_FORMAT(article.publishDate,'%Y-%m-%d %H:%i:%s') publishDate,
               DATE_FORMAT(article.updateDate,'%Y-%m-%d %H:%i:%s') updateDate,article.likes,
               user.id as user_id,user.username
               from article left join user on article.authorId=user.id where article.id=#{id}
    </select>
</mapper>

5. 编写模板

在template地下新建showArticle.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>ReadArticle</title>
    <link rel="stylesheet" href="/plug/editor.md-master/css/editormd.css"/>
    <script src="/js/jquery.min.js"></script>
    <script src="/plug/editor.md-master/lib/marked.min.js"></script>
    <script src="/plug/editor.md-master/lib/prettify.min.js"></script>
    <script src="/plug/editor.md-master/lib/raphael.min.js"></script>
    <script src="/plug/editor.md-master/lib/underscore.min.js"></script>
    <script src="/plug/editor.md-master/lib/sequence-diagram.min.js"></script>
    <script src="/plug/editor.md-master/lib/flowchart.min.js"></script>
    <script src="/plug/editor.md-master/editormd.min.js"></script>
    <script src="/js/bootstrap.min.js"></script>
    <script src="/js/popper.min.js"></script>
    <link href="/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">

    <div class="card">
        <div class="card-header">
            <h1 id="articleTitle" th:text="${article.title}"></h1>
        </div>
        <div class="card-body">
            <div id="layout" class="editor">
                <div id="test-editormd">
                    <textarea></textarea>
                </div>
            </div>
        </div>
    </div>
</div>
<script th:inline="javascript">
    var showText=[[${article.content}]];
</script>
<script>
    $(document).ready(function (){
        var testEditor = editormd.markdownToHTML("test-editormd", {
            markdown:showText ,
            htmlDecode: "style,script,iframe",  // you can filter tags decode
        });
    });
</script>
</body>
</html>

6. 运行结果

在这里插入图片描述

7.注意事项

  • thymeleaf在h5和js中的使用问题
  • @Controller和@RestController的区别
  1. 如果只是使用@RestController注解,Controller中的方法无法返回html,视图配置器不起作用
  2. 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
  3. @RestController注解相当于@ResponseBody + @Controller合在一起的作用。

8.项目地址

项目地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值