博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Thymeleaf的使用
阅读量:6629 次
发布时间:2019-06-25

本文共 6671 字,大约阅读时间需要 22 分钟。

前言:

最近听说thymeleaf好像也挺流行的,还说是spring官方推荐使用,那thymeleaf究竟是什么呢?spring为什么推荐用它呢?怎么用呢?本文将为你揭秘!

一、thymeleaf简介:

thymeleaf是一种Java模板引擎,那何为模板引擎呢?模板引擎就是为了使用户页面和业务数据相互分离而出现的,将从后台返回的数据生成特定的格式的文档,这里说的特定格式一般都指HTML文档。它能够处理html、xml、js、css甚至纯文本,类似于freemarker。它的优点是语法优雅易懂、原型即页面、遵从web标准。原型即页面是它的特色,所谓原型即页面,就是你写的html,静态的去访问是什么样,动态的去访问还是这样,只不过动态的时候会把数据填充进去。

二、thymeleaf标准方言:

1、变量表达式:${...}

例如前端接收一个user,想取出user的name属性,就可以用变量表达式:

2、消息表达式:#{...}

也称为文本外部化、国际化或i18n.

...

3、选择表达式:*{...}

与变量表达式的区别:选择表达式是在当前选择的对象上执行而不是整个上下文。

这里id就用了选择表达式,在此处*{id}${userModel.user.id}效果一样。

4、链接表达式:@{...}

url可以是相对的,也可以是绝对的。

......

5、分段表达式:th:insert 、th:replace 、th:include

就相当插入。这三个的区别:
现有一个片段如下:

Hello Thymeleaf

#号分别代表insert、replace、include进行操作:

th:insert 的结果:

Hello Thymeleaf

把footer标签插入到了div标签中。

th:replace的结果:

Hello Thymeleaf

把div标签换成了footer标签。

th:include的结果:

Hello Thymeleaf

把div标签里面的内容换成了footer标签里面的内容。3.X版本后不再推荐使用。

6、字面量:

字面量可以是文本、数字、布尔null等类型。

7、算术操作:+、-、*、/、%

例如:

8、其他运算符:

比较: >、<、>=、<= (gt、lt、ge、le)
等价: ==、!= (eq、ne)
三目运算符:

 

9、迭代器:th:each

相当于Java的foreach.

                  

这样就是遍历userList集合。

迭代器的状态变量有:
index、count、size、current、even/odd、first、last

10、条件语句:th:if、th:unless、switch

User is admin

User is guest

11、模板布局:th:fragment

比如定义一个公用的页头:

Thymeleaf in action

首页

在其他页面直接这样引用就行:

12、表达式基本对象:

表达式基本对象有:param、session、application、request、servletContext

三、thymeleaf与springboot集成案例:

本案例使用gradle构建,未涉及数据库,数据保存在ConcurrentMap中。未曾了解gradle的老铁可以参考一下。点下载本案例源码。

项目结构如下:

img_e7449fe0598e1732f328a9b2bb849299.png
image.png

1、添加依赖:

dependencies {    compile('org.springframework.boot:spring-boot-starter-web')    testCompile('org.springframework.boot:spring-boot-starter-test')    //thymeleaf的依赖    compile('org.springframework.boot:spring-boot-starter-thymeleaf')}

2、application.properties:

#thymeleaf相关配置spring.thymeleaf.encoding=UTF-8spring.thymeleaf.cache=falsespring.thymeleaf.mode=HTML5

3、entity层:

public class User {    private Long id;    private String name;    private String email;}

4、dao层:

import java.util.ArrayList;import java.util.List;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import java.util.concurrent.atomic.AtomicLong;import org.springframework.stereotype.Repository;import com.zhu.test.dao.UserDao;import com.zhu.test.entity.User;/** * user dao层实现 * @author zhu * */@Repositorypublic class UserDaoImpl implements UserDao {    //用来计数的    private static AtomicLong counter = new AtomicLong();    // 用来保存user的map    private final ConcurrentMap
userMap = new ConcurrentHashMap<>(); @Override public User saveOrUpdateUser(User user) { Long id = user.getId(); if(id == null) {//save id = counter.incrementAndGet(); user.setId(id); } this.userMap.put(id, user); return user; } @Override public void deleteUser(Long id) { this.userMap.remove(id); } @Override public User getUserById(Long id) { return this.userMap.get(id); } @Override public List
listUsers() { return new ArrayList
(this.userMap.values()); }}

将user保存在ConcurrentMap中,crud操作其实都是对这个map进行操作。

5、controller层:

@RestController@RequestMapping("/users")public class UserController {    @Autowired    private UserDao userDao;    /**     * 查询所有用户     *      * @param model     * @return     */    @GetMapping    public ModelAndView list(Model model) {        model.addAttribute("userList", userDao.listUsers());        model.addAttribute("title", "用户管理");        return new ModelAndView("user/list", "userModel", model);    }    /**     * 根据id查询用户     *      * @param id     * @param model     * @return     */    @GetMapping("{id}")    public ModelAndView view(@PathVariable("id") Long id, Model model) {        User user = userDao.getUserById(id);        model.addAttribute("user", user);        model.addAttribute("title", "查看用户");        return new ModelAndView("user/view", "userModel", model);    }    /**     * 获取创建表单页面     *      * @param model     * @return     */    @GetMapping("/form")    public ModelAndView createForm(Model model) {        model.addAttribute("user", new User());        model.addAttribute("title", "创建用户");        return new ModelAndView("user/form", "userModel", model);    }    /**     * 保存或更新用户     *      * @param user     * @return     */    @PostMapping    public ModelAndView saveOrUpdateUser(User user) {        user = userDao.saveOrUpdateUser(user);        return new ModelAndView("redirect:/users");    }    /**     * 删除用户     *      * @param id     * @return     */    @GetMapping("/delete/{id}")    public ModelAndView delete(@PathVariable("id") Long id) {        userDao.deleteUser(id);        return new ModelAndView("redirect:/users");// 重定向到list页面    }    /**     * 获取修改用户的界面     *      * @param id     * @param model     * @return     */    @GetMapping("/modify/{id}")    public ModelAndView modify(@PathVariable("id") Long id, Model model) {        User user = userDao.getUserById(id);        model.addAttribute("user", user);        model.addAttribute("title", "修改用户");        return new ModelAndView("user/form", "userModel", model);    }}

6、前端页面:

注意:要使用thymeleaf,需要在html标签中加上

xmlns:th="http://www.thymeleaf.org"      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"

如下页面:

页头:header.html

thymeleaf in action

Thymeleaf in action

首页

页脚:footer.html

thymeleaf in action

form.html:

thymeleaf in action

test

名称:
邮箱:

list.html:

thymeleaf in action

ID Email Name
没有用户信息

view.html:

thymeleaf in action

test

ID:

Name:

Email:

以上页面就涉及到了thymeleaf的常用标签,通过这几个页面,理解thymeleaf的用法。

7、测试效果:

img_1c73e609007d8713597c724d5402a101.png
image.png

点击“创建用户”:

img_f2b1eb08f02dfcf87f2b286f31aa51ed.png
image.png

点击“提交”后:

img_607ce4614f5b6f9558c093a27bf290f8.png
image.png

点击name栏可以进入view页面:

img_59dbdc42192525ef61831b0c69d5596f.png
image.png

这个页面还可以进行删除和修改,这里不再截图。

总结:

thymeleaf标签看起来很多,其实常用的也不多,且很好理解。主要别忘了在html标签中需要加上xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"。如果eclipse写thymeleaf标签时没有提示,安装一下thymeleaf插件重启eclipse即可,点击help --> install new software,地址为:http://www.thymeleaf.org/eclipse-plugin-update-site/.

img_7277fc809ac091e21076d6fe9e2e860a.png
image.png

以上内容属于个人笔记整理,如有错误,欢迎批评指正!

转载地址:http://rlqpo.baihongyu.com/

你可能感兴趣的文章
qhfl-2 ContentType组件
查看>>
XMPP系列(四)---发送和接收文字消息,获取历史消息功能
查看>>
对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
查看>>
万元大奖邀您参与阿里云数加 MaxCompute最佳实践征文大赛
查看>>
action带参
查看>>
一个简单的语法制导翻译器
查看>>
ARC100D Equal Cut
查看>>
android 自定义控件View在Activity中使用findByViewId得到结果为null
查看>>
js图片预览(一张图片预览)
查看>>
wp 的手势Gestures: flick, pan, and stretch
查看>>
RESTful API 设计规范
查看>>
JAVA实现Base64编码的三种方式
查看>>
最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)
查看>>
java操作Excel处理数字类型的精度损失问题验证
查看>>
linux - ln 命令最佳实践
查看>>
python 转换为json时候 汉字编码有关问题
查看>>
wireshark安装
查看>>
netty入门02
查看>>
阿里云域名解析问题【原创】
查看>>
[javaSE] 网络编程(TCP,UDP,Socket特点)
查看>>