Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springboot 整合 thymeleaf(上手即用)

springboot 整合 thymeleaf(上手即用)

作者头像
用户5546570
发布于 2020-07-08 02:45:34
发布于 2020-07-08 02:45:34
69600
代码可运行
举报
运行总次数:0
代码可运行

引言

springboot 整合thymeleaf 其实用的不是很多,因为现在很多公司都是前后端分离的项目,通过接口交互了。但是我们后端人员,对前端不是很了解,但是又想做些东西看看效果。所以就可以整合 thymeleaf ,掌握一些基本的语法,就可以很好的操作啦。

使用

首先引入依赖,这样我们在项目中才能使用到。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

在html 文件中想要使用 ,需要引入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html lang="en" xmlns:th="http://www.thymeleaf.org">

接下来就可以使用啦。

在用之前我们先来看看这些基础语法。

标签
标准表达式
变量表达式:${...}

主要获取上下文的参数变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p th:text="${title}">默认值</p>

同时,Thymeleaf 提供了内置对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # ctx:上下文对象
 # vars:上下文变量
 # locale:上下文区域设置
 # request:HttpServletRequest 对象
 # response:HttpServletResponse对象
 # session:HttpSession对象
 # servletContext:ServletContext 对象

eg:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
The locale country is: <span th:text="${#locale.country}">US</span>.
选择变量表达式:*{...}

一般从被选定的对象中获取属性值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div th:object="${book}">
 <p>titile: <span th:text="*{title}">ຽ᷌</span>.</p>
</div>
消息表达式#{...}

消息表达式主要用于Thymeleaf 模版页面国际化内容的动态替换和展示板。

链接表达式@{...}

一般用于页面的跳转或者资源的引入。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<a th:href="@{http://localhost:8080/order/details(orderId=${o.id})}">view</a> <a th:href="@{/order/details(orderId=${o.id})}">view</a>

严格按照:

@{路径(参数名=参数值,参数名=参数值...)}的形式编写

片段表达式~{...}

用来标记一个片段模版并且根据需要移动或者传递给其他模版

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div th:insert="~{thymeleafDemo::title}"></div>

这里有一个login.html 的页面,就是整合了thymeleaf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1,shrink-to-fit=no">
    <title>用户登录界面</title>
    <link th:href="@{/login/css/bootstrap.min.css}" rel="stylesheet">
    <link th:href="@{/login/css/signin.css}" rel="stylesheet">
</head>
<body class="text-center">
<!--  用户登录form表单 -->
<form class="form-signin">
    <img class="mb-4" th:src="@{/login/img/login.jpg}" width="72" height="72">
    <h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">请登录</h1>
    <input type="text" class="form-control"
           th:placeholder="#{login.username}" required="" autofocus="">
    <input type="password" class="form-control"
           th:placeholder="#{login.password}" required="">
    <div class="checkbox mb-3">
        <label>
            <input type="checkbox" value="remember-me"> [[#{login.rememberme}]]
        </label>
    </div>
    <button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.button}">登录</button>
    <p class="mt-5 mb-3 text-muted">© <span th:text="${currentYear}">2019</span>-<span th:text="${currentYear}+1">2020</span></p>
    <a class="btn btn-sm" th:href="@{/toLoginPage(l='zh_CN')}">中文</a>
    <a class="btn btn-sm" th:href="@{/toLoginPage(l='en_US')}">English</a>

</form>
</body>
</html>

最终显示的效果如下:

搭建个人博客界面

下面我们就搭建一个demo 吧,整合mybatis ,将文章列表显示在界面上,实现整合pageHelper 实现分页效果。在界面上显示上一页下一页。

1、创建表。sql 如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create DATABASE blog_system
DROP TABLE IF EXISTS t_article;
CREATE TABLE t_article (
  id int(11) NOT NULL AUTO_INCREMENT,
  title varchar(50) NOT NULL COMMENT '文章标题',
  content longtext COMMENT '文章具体内容',
  created date NOT NULL COMMENT '发表时间',
  modified date DEFAULT NULL COMMENT '修改时间',
  categories varchar(200) DEFAULT '默认分类' COMMENT '文章分类',
  tags varchar(200) DEFAULT NULL COMMENT '文章标签',
  allow_comment tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许评论',
  thumbnail varchar(200) DEFAULT NULL COMMENT '文章缩略图',
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_article
-- ----------------------------
INSERT INTO t_article VALUES ('1', '2019新版Java学习路线图','Java学习路线图具体内容具体内容具体内容具体内容具体内容具体内容具体内容','2019-10-10', null, '默认分类', '‘2019,Java,学习路线图', '1', null);
INSERT INTO t_article VALUES ('2', '2019新版Python学习线路图','据悉,Python已经入驻小学生教材,未来不学Python不仅知识会脱节,可能与小朋友都没有了共同话题~~所以,从今天起不要再找借口,不要再说想学Python却没有资源,赶快行动起来,Python等你来探索' ,'2019-10-10', null, '默认分类', '‘2019,Java,学习路线图', '1', null);
INSERT INTO t_article VALUES ('3', 'JDK 8——Lambda表达式介绍',' Lambda表达式是JDK 8中一个重要的新特性,它使用一个清晰简洁的表达式来表达一个接口,同时Lambda表达式也简化了对集合以及数组数据的遍历、过滤和提取等操作。下面,本篇文章就对Lambda表达式进行简要介绍,并进行演示说明' ,'2019-10-10', null, '默认分类', '‘2019,Java,学习路线图', '1', null);
INSERT INTO t_article VALUES ('4', '函数式接口','虽然Lambda表达式可以实现匿名内部类的功能,但在使用时却有一个局限,即接口中有且只有一个抽象方法时才能使用Lamdba表达式代替匿名内部类。这是因为Lamdba表达式是基于函数式接口实现的,所谓函数式接口是指有且仅有一个抽象方法的接口,Lambda表达式就是Java中函数式编程的体现,只有确保接口中有且仅有一个抽象方法,Lambda表达式才能顺利地推导出所实现的这个接口中的方法' ,'2019-10-10', null, '默认分类', '‘2019,Java,学习路线图', '1', null);
INSERT INTO t_article VALUES ('5', '虚拟化容器技术——Docker运行机制介绍','Docker是一个开源的应用容器引擎,它基于go语言开发,并遵从Apache2.0开源协议。使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意的Linux机器上,也可以实现虚拟化。Docker容器完全使用沙箱机制,相互之间不会有任何接口,这保证了容器之间的安全性' ,'2019-10-10', null, '默认分类', '‘2019,Java,学习路线图', '1', null);

2、创建springboot 项目,引入依赖如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>2.1.3</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--分页助手-->
<!--导入pagehelper相关依赖-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-autoconfigure</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.3</version>
</dependency>

3、创建实体类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Article {

    private Integer id;
    private String title;
    private String content;
    private Date created;
    private Date modified;
    private String categories;
    private String tags;
    private Integer allowComment;
    private String thumbnail;
    getter()/setter()
}

5、创建mapper 接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapper
public interface ArticleMapper {

    List<Article> selectList();
}

6、创建mapper 对应的xml 文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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="cn.quellanan.springboothomework.mapper.ArticleMapper">

    <select id="selectList" resultType="article">
        select * from tb_article
    </select>
</mapper>

7、创建service 以及实现类。使用 PageHelper 实现分页

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface ArticleService {
    List<Article> selectList(int index,int size);
}

@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleMapper articleMapper;

    @Override
    public List<Article> selectList(int index,int size) {
        PageHelper.startPage(index,size);
        List<Article> articles = articleMapper.selectList();
        return articles;
    }
}

8、创建controller 层接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @RequestMapping("/")
    public String list(Model model, @RequestParam(required = false)Integer index, @RequestParam(required = false)Integer size){
        if(index==null ||size==null){
            index=1;
            size=2;
        }
        List<Article> articles = articleService.selectList(index,size);
        PageInfo<Article> pageInfo=new PageInfo<>(articles);
        model.addAttribute("articles", articles);
        model.addAttribute("pageInfo", pageInfo);
        return "client/index";
    }
}

9、配置文件中增加配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Mysql数据库连接配置 : com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

#开启驼峰命名匹配映射mapper
mybatis.configuration.map-underscore-to-camel-case=true

#配置mybatis的xml映射配置文件路径
mybatis.mapper-locations=classpath:mapper/*.xml
#配置mybatis映射配置文件中实体类别名
mybatis.type-aliases-package=cn.quellanan.springboothomework.pojo

# thymeleaf页面缓存设置
spring.thymeleaf.cache=false

# 配置pagehelper参数
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql

10、引入静态文件资源。

11、编辑index.html 文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<!-- 载入文章头部页面,位置在/client文件夹下的header模板页面,模板名称th:fragment为header -->
<div th:replace="/client/header::header(null,null)" />
<body>
<div class="am-g am-g-fixed blog-fixed index-page">
    <div class="am-u-md-8 am-u-sm-12">

        <!-- 文章遍历并分页展示 : 需要同学们手动完成,基本样式已经给出,请使用th标签及表达式完成页面展示 -->
        <div th:each="article,stat:${articles}" th:value="article">
            <article class="am-g blog-entry-article">

                <div class="am-u-lg-6 am-u-md-12 am-u-sm-12 blog-entry-text">
                    <!-- 文章分类 -->
                    <span class="blog-color"style="font-size: 15px;"><a>默认分类</a></span>
                    <span>   </span>
                    <!-- 发布时间 -->
                    <span style="font-size: 15px;" th:text="'发布于 '+ ${article.created}" />
                    <h2>
                        <!-- 文章标题 -->
                        <div><a style="color: #0f9ae0;font-size: 20px;" th:text="${article.title}" />
                        </div>
                    </h2>
                    <!-- 文章内容-->
                    <div style="font-size: 16px;" th:text="${article.content}" />
                </div>
            </article>
        </div>
        <div>
            <a class="btn btn-sm" th:href="@{/(index=1,size=2)}">首页</a>

            <a class="btn btn-sm" th:href="@{/(index=${pageInfo.getPageNum()-1},size=2)}">上一页</a>
            <a class="btn btn-sm" th:href="@{/(index=${pageInfo.getPageNum()}+1,size=2)}">下一页</a>
            <a class="btn btn-sm" th:href="@{/(index=${pageInfo.getPages()},size=2)}">尾页</a>
        </div>

    </div>
    <!-- 博主信息描述 -->
    <div class="am-u-md-4 am-u-sm-12 blog-sidebar">
        <div class="blog-sidebar-widget blog-bor">
            <h2 class="blog-text-center blog-title"><span>子慕</span></h2>
            <img th:src="@{/assets/img/me.jpg}" alt="about me" class="blog-entry-img"/>
            <p>
                Java后台开发
            </p>
            <p>个人博客小站,主要发表关于Java、Spring、Docker等相关文章</p>
        </div>
        <div class="blog-sidebar-widget blog-bor">
            <h2 class="blog-text-center blog-title"><span>联系我</span></h2>
            <p>
                <a><span class="am-icon-github am-icon-fw blog-icon"></span></a>
                <a><span class="am-icon-weibo am-icon-fw blog-icon"></span></a>
            </p>
        </div>
    </div>

</div>
</body>
<!-- 载入文章尾部页面,位置在/client文件夹下的footer模板页面,模板名称th:fragment为footer -->
<div th:replace="/client/footer::footer" />
</html>

12、测试

启动项目,访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://localhost:8080/

GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master 来源:https://www.tuicool.com/articles/YNnaya3

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何为Nginx创建自签名SSL证书
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。 TLS与SSL在传输层对网络连接进行加密。
尘埃
2018/07/20
12.5K0
如何在Ubuntu 16.04中为Apache创建自签名SSL证书
TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。
藕丝空间
2018/09/28
2.3K0
为Apache创建自签名SSL证书
TLS/SSL是用于将正常流量包装在受保护的加密包装中的Web协议。得益于此技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部各方拦截。证书系统还可以帮助用户验证他们正在连接的站点的身份。
编程男孩
2018/07/26
7K0
为Apache创建自签名SSL证书
使用腾讯云SSL证书保护你的Nginx服务器
腾讯云SSL是一个新的证书颁发机构(CA),它提供了一种获取和安装免费TLS /SSL证书的简便方法,从而在Web服务器上启用加密的HTTPS。您可以在腾讯云Web页面轻松获取免费的SSL证书,无论您选择哪种Web服务器软件。
你在哪里
2018/07/30
6.5K0
使用腾讯云SSL证书保护你的Nginx服务器
如何在Ubuntu上使用SSL来保护Nginx
腾讯云SSL是腾讯云的证书颁发服务,SSL证书(SSL Certificates)提供了安全套接层(SSL)证书的一站式服务,包括证书申请、管理及部署功能,与顶级的数字证书授权(CA)机构和代理商合作,为您的网站、移动应用提供 HTTPS 解决方案。 在本教程中,您将使用腾讯云SSL证书,在Nginx上安装免费SSL证书。
尘埃
2018/08/03
3.3K0
如何在Ubuntu上使用SSL来保护Nginx
如何在Ubuntu 16.04上部署支持HTTP/2的Nginx
NGINX 是一个快速可靠的开源Web服务器。由于其内存占用空间小,可扩展性高,易于配置,并支持绝大多数协议,因此受到欢迎。 本教程将帮助您部署一个支持HTTP / 2 的快速,安全的 Nginx 服务器。
疯狂的技术宅
2019/03/27
1.2K0
如何在Ubuntu 16.04上部署支持HTTP/2的Nginx
Ubuntu 下配置 Nginx 服务器的 SSL 证书
首先,让我们在/etc/nginx/snippets目录中创建一个新的Nginx配置代码段。
星哥玩云
2022/07/25
1.9K0
如何在Debian 9上使用Let加密来保护Nginx
我们的加密是一个证书颁发机构(CA),它提供了一种获取和安装免费TLS / SSL证书的简便方法,可以在Web服务器上启用加密的HTTPS。它通过提供软件客户端Certbot简化了流程,该客户端尝试自动化大多数(如果不是全部)所需步骤。目前,获取和安装证书的整个过程在Apache和Nginx上都是完全自动化的。
无敌小笼包
2018/11/05
1.2K0
给Buildbot加上SSL,使用Nginx做反向代理
Buildbot是一个基于Python的持续集成系统,用于自动化软件构建,测试和发布。Buildbot自带内置的Web服务器并使用8010端口,为了使用SSL保护Web界面,我们需要用Nginx配置反向代理。
木纸鸢
2018/07/27
1.5K0
给Buildbot加上SSL,使用Nginx做反向代理
轻松让你的nginx服务器支持HTTP2协议
nginx是一个高效的web服务器,因为其独特的响应处理机制和低内存消耗,深得大家的喜爱,并且nginx可和多种协议配合使用,而HTTP2协议又是一个非常优秀的协议,如果将两者结合起来会产生意想不到的效果,今天我们将会讲解如何在nginx中配置HTTP2协议。
程序那些事
2021/08/28
2K0
在 Ubuntu 18.04 上使用 Let’s Encrypt 来保护 Nginx
Let's Encrypt 是由 Internet Security Research Group(ISRG)开发的免费开放证书颁发机构。 今天几乎所有浏览器都信任 Let's Encrypt 颁发的证书。
星哥玩云
2022/07/28
9990
如何在Nginx上为Debian 8创建ECC证书
本文介绍如何为Nginx创建椭圆曲线加密(ECC)SSL证书。在本教程结束时,您将有一个更快的加密机制供生产使用。
无敌小笼包
2018/09/25
1.4K0
nginx配置 ssl证书详细说明以及案例
打开Nginx配置文件(通常位于/etc/nginx/nginx.conf或/etc/nginx/sites-available/default),在服务器块(server block)中添加SSL配置。
西里网
2025/03/25
1.7K0
如何在CVM上安装Matrix Synapse
Matrix是分散通信的开放标准。它使用标准化API实时同步的在线消息传递到其他服务器。
苏子晨
2018/07/19
4K1
在Ubuntu 18.04上使用Let’s Encrypt保护Nginx
Let's Encrypt是由互联网安全研究组(ISRG)开发的免费开放认证机构。 Let's Encrypt颁发的证书现在几乎所有浏览器都信任。
星哥玩云
2022/07/13
1.6K0
在Ubuntu 18.04上使用Let’s Encrypt保护Nginx
如何在CVM上安装Nginx
Nginx是世界上最受欢迎的网络服务器之一,负责托管互联网上一些规模最大,流量最高的网站。在大多数情况下,它比Apache更具资源友好,可以用作Web服务器或反向代理。没有服务器的同学,我建议您使用腾讯云免费的开发者专属在线实验平台进行试验。
编程男孩
2018/07/20
3.2K0
如何在Ubuntu 18.04上使用HTTP / 2支持设置Nginx
Nginx是一个快速可靠的开源Web服务器。由于其低内存占用,高可扩展性,易于配置以及对各种协议的支持,它获得了普及。
司徒永哥
2018/10/25
2.6K0
Zabbix服务器安全基础加固
这里的用户涉及到Zabbix前端用户、Zabbix 服务器和 Zabbix 代理之间进程用户(默认的zabbix用户),在前端用户的设置根据"权限最小化原则"进行设定。
冬夜读书示子聿
2022/01/04
2.1K0
如何在Ubuntu 18.04上使用Nginx反向代理配置Jenkins SSL
默认情况下,Jenkins自带内置的Winstone Web服务器监听端口8080方便入门。但是,使用SSL保护Jenkins以保护通过Web界面传输的密码和敏感数据也是一个好方法。
灬半痴
2018/09/21
3.5K0
在Ubuntu 16.04上安装Seafile并配置Nginx
Seafile是一个跨平台的文件托管工具,包含了适用于Linux和Windows的服务器应用程序,以及适用于Android,iOS,Linux,OS X和Windows的GUI客户端。它支持文件版本控制和快照,双重身份验证,WebDAV(Web-based Distributed Authoring and Versioning),并且可以配合Nginx和Apache使用以启用HTTPS。
Techeek
2018/09/06
4.4K0
推荐阅读
相关推荐
如何为Nginx创建自签名SSL证书
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验