SpringBoot 实战 (十二) | 整合 thymeleaf

2024-04-27 12:48

本文主要是介绍SpringBoot 实战 (十二) | 整合 thymeleaf,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微信公众号:一个优秀的废人
如有问题或建议,请后台留言,我会尽力解决你的问题。

前言

如题,今天介绍 Thymeleaf ,并整合 Thymeleaf 开发一个简陋版的学生信息管理系统。

SpringBoot 提供了大量模板引擎,包含 Freemarker、Groovy、Thymeleaf、Velocity 以及 Mustache,SpringBoot 中推荐使用 Thymeleaf 作为模板引擎,因为 Thymeleaf 提供了完美的 SpringMVC 支持。Thymeleaf 是新一代 Java 模板引擎,在 Spring 4 后推荐使用。

什么是模板引擎?

Thymeleaf 是一种模板语言。那模板语言或模板引擎是什么?常见的模板语言都包含以下几个概念:数据(Data)、模板(Template)、模板引擎(Template Engine)和结果文档(Result Documents)。

  • 数据
    数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等。数据和信息是不可分离的,数据是信息的表达,信息是数据的内涵。数据本身没有意义,数据只有对实体行为产生影响时才成为信息。
  • 模板
    模板,是一个蓝图,即一个与类型无关的类。编译器在使用模板时,会根据模板实参对模板进行实例化,得到一个与类型相关的类。
  • 模板引擎
    模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
  • 结果文档
    一种特定格式的文档,比如用于网站的模板引擎就会生成一个标准的HTML文档。

模板语言用途广泛,常见的用途如下:

  • 页面渲染
  • 文档生成
  • 代码生成
  • 所有 “数据+模板=文本” 的应用场景
Thymeleaf 简介

Thymeleaf 是一个 Java 类库,它是一个 xml/xhtml/html5 的模板引擎,可以作为 MVC 的 web 应用的 View 层。

Thymeleaf 还提供了额外的模块与 SpringMVC 集成,所以我们可以使用 Thymeleaf 完全替代 JSP 。

Thymeleaf 语法

博客资料:http://www.cnblogs.com/nuoyiamy/p/5591559.html
官方文档:http://www.thymeleaf.org/documentation.html

SpringBoot 整合 Thymeleaf

下面使用 SpringBoot 整合 Thymeleaf 开发一个简陋版的学生信息管理系统。

1、准备工作

  • IDEA
  • JDK1.8
  • SpringBoot2.1.3

2、pom.xml 主要依赖

<dependencies><!-- JPA 数据访问 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- thymeleaf 模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- web 启动类 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mysql 数据库连接类 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
</dependencies>

3、application.yaml 文件配置

spring:# 数据库相关datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=trueusername: rootpassword: 123456# jpa 相关jpa:hibernate:ddl-auto: update   # ddl-auto: 第一次启动项目设为 create 表示每次都重新建表,之后设置为 updateshow-sql: true

4、实体类

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Student {@Id@GeneratedValue/*** 主键*/private Long id;/*** 主键*/private Long studentId;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 专业*/private String major;/*** 宿舍*/private String dormitory;/*** 籍贯*/private String city;/*@Temporal(TemporalType.TIMESTAMP)//将时间戳,转换成年月日时分秒的日期格式@Column(name = "create_time",insertable = false, updatable=false, columnDefinition = "timestamp default current_timestamp comment '注册时间'")private Date createDate;@Temporal(TemporalType.TIMESTAMP)//将时间戳,转换成年月日时分秒的日期格式@Column(name = "update_time",insertable = false, updatable=true, columnDefinition = "timestamp default current_timestamp comment '修改时间'")private Date updateDate;*/}

5、dao 层

@Repository
public interface StudentRepository extends JpaRepository<Student, Long> {
}

6、service 层

public interface StudentService {List<Student> findStudentList();Student findStudentById(Long id);Student saveStudent(Student student);Student updateStudent(Student student);void deleteStudentById(Long id);}

实现类:

@Service
public class StudentServiceImpl implements StudentService {@Autowiredprivate StudentRepository studentRepository;/*** 查询所有学生信息列表* @return*/@Overridepublic List<Student> findStudentList() {Sort sort = new Sort(Direction.ASC,"id");return studentRepository.findAll(sort);}/*** 根据 id 查询单个学生信息* @param id* @return*/@Overridepublic Student findStudentById(Long id) {return studentRepository.findById(id).get();}/*** 保存学生信息* @param student* @return*/@Overridepublic Student saveStudent(Student student) {return studentRepository.save(student);}/*** 更新学生信息* @param student* @return*/@Overridepublic Student updateStudent(Student student) {return studentRepository.save(student);}/*** 根据 id 删除学生信息* @param id* @return*/@Overridepublic void deleteStudentById(Long id) {studentRepository.deleteById(id);}
}

7、controller 层 (Thymeleaf) 使用

controller 层将 view 指向 Thymeleaf:

@Controller
@RequestMapping("/student")
public class StudentController {@Autowiredprivate StudentService studentService;/*** 获取学生信息列表* @param map* @return*/@GetMapping("/list")public String findStudentList(ModelMap map) {map.addAttribute("studentList",studentService.findStudentList());return "studentList";}/*** 获取保存 student 表单*/@GetMapping(value = "/create")public String createStudentForm(ModelMap map) {map.addAttribute("student", new Student());map.addAttribute("action", "create");return "studentForm";}/*** 保存学生信息* @param student* @return*/@PostMapping(value = "/create")public String saveStudent(@ModelAttribute Student student) {studentService.saveStudent(student);return "redirect:/student/list";}/*** 根据 id 获取 student 表单,编辑后提交更新* @param id* @param map* @return*/@GetMapping(value = "/update/{id}")public String edit(@PathVariable Long id, ModelMap map) {map.addAttribute("student", studentService.findStudentById(id));map.addAttribute("action", "update");return "studentForm";}/*** 更新学生信息* @param student* @return*/@PostMapping(value = "/update")public String updateStudent(@ModelAttribute Student student) {studentService.updateStudent(student);return "redirect:/student/list";}/*** 删除学生信息* @param id* @return*/@GetMapping(value = "/delete/{id}")public String deleteStudentById(@PathVariable Long id) {studentService.deleteStudentById(id);return "redirect:/student/list";}
}

简单说下,ModelMap 对象来进行数据绑定到视图。return 字符串,该字符串对应的目录在 resources/templates 下的模板名字。 @ModelAttribute 注解是用来获取页面 Form 表单提交的数据,并绑定到 Student 数据对象。

8、studentForm 表单

定义了一个 Form 表单用于注册或修改学生信息。

<form th:action="@{/student/{action}(action=${action})}" method="post" class="form-horizontal"><div class="form-group"><label for="student_Id" class="col-sm-2 control-label">学号:</label><div class="col-xs-4"><input type="text" class="form-control" id="student_Id" name="name" th:value="${student.studentId}"th:field="*{student.studentId}"/></div></div><div class="form-group"><label for="student_name" class="col-sm-2 control-label">姓名:</label><div class="col-xs-4"><input type="text" class="form-control" id="student_name" name="name" th:value="${student.name}"th:field="*{student.name}"/></div></div><div class="form-group"><label for="student_age" class="col-sm-2 control-label">年龄:</label><div class="col-xs-4"><input type="text" class="form-control" id="student_age" name="name" th:value="${student.age}"th:field="*{student.age}"/></div></div><div class="form-group"><label for="student_major" class="col-sm-2 control-label">专业:</label><div class="col-xs-4"><input type="text" class="form-control" id="student_major" name="name" th:value="${student.major}"th:field="*{student.major}"/></div></div><div class="form-group"><label for="student_dormitory" class="col-sm-2 control-label">宿舍:</label><div class="col-xs-4"><input type="text" class="form-control" id="student_dormitory" name="name" th:value="${student.dormitory}"th:field="*{student.dormitory}"/></div></div><div class="form-group"><label for="student_city" class="col-sm-2 control-label">籍贯:</label><div class="col-xs-4"><input type="text" class="form-control" id="student_city" name="writer" th:value="${student.city}"th:field="*{student.city}"/></div></div><div class="form-group"><div class="col-sm-offset-3 col-sm-10"><input class="btn btn-primary" type="submit" value="提交"/>&nbsp;&nbsp;<input class="btn" type="button" value="返回" onclick="history.back()"/></div></div></form>

9、studentList 学生列表

用于展示学生信息:

<table class="table table-hover table-condensed"><legend><strong>学生信息列表</strong></legend><thead><tr><th>学号</th><th>姓名</th><th>年龄</th><th>专业</th><th>宿舍</th><th>籍贯</th><th>管理</th></tr></thead><tbody><tr th:each="student : ${studentList}"><th scope="row" th:text="${student.studentId}"></th><td><a th:href="@{/student/update/{studentId}(studentId=${student.id})}" th:text="${student.name}"></a></td><td th:text="${student.age}"></td><td th:text="${student.major}"></td><td th:text="${student.dormitory}"></td><td th:text="${student.city}"></td><td><a class="btn btn-danger" th:href="@{/student/delete/{studentId}(studentId=${student.id})}">删除</a></td></tr></tbody></table>
页面效果

列表页面:点击按钮可注册学生信息

初始页面

注册/修改学生信息页面:点提交保存学生信息到数据库并返回列表页面

注册/修改学生信息页面

有数据的列表页面:点击名字跳到注册/修改页面可修改学生信息,点击删除可删除学生信息

列表页面

后语

如果本文对你哪怕有一丁点帮助,请帮忙点好看。你的好看是我坚持写作的动力。

另外,关注之后在发送 1024 可领取免费学习资料。资料内容详情请看这篇旧文:Python、C++、Java、Linux、Go、前端、算法资料分享

这篇关于SpringBoot 实战 (十二) | 整合 thymeleaf的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940547

相关文章

Python实战开发及案例分析(12)—— 模拟退火算法

模拟退火算法(Simulated Annealing)是一种概率搜索算法,源自于金属退火过程。在金属退火中,通过缓慢降低温度,金属内部的原子能够从高能态逐步达到较低能态。模拟退火算法利用类似的原理,通过随机搜索和概率接受策略来找到近似最优解。 模拟退火算法的原理 目标:寻找最小化或最大化目标函数的近似最优解。温度:从高温逐渐降到低温。状态变换:通过随机变换产生邻域解。接受概率:

个人收集javascript面试题,你值得拥有。

一、字符串反转,如将 '12345678' 变成 '87654321' ? 1 2 3 4 //大牛做法; //思路:先将字符串转换为数组 split(),利用数组的反序函数 reverse()颠倒数组,再利用 jion() 转换为字符串 var  str =  '12345678' ; str = str.split( '' ).reverse().joi

Javascript程序员常见面试题

1.在Javascript中如何声明一个类? 在javascript中没有像Java中类class,我们调用一个函数实际上是在模拟类的行为。在JavaScript中有很多灵活的方法可以创建一个类,下面3种方式: (1)使用函数作为类: function Person(name) { this.name = name; } // Creating an object var person =

汤姆大叔的6道javascript编程题题解

看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试。 1、找出数字数组中最大的元素(使用Math.max函数) var a = [1, 2, 3, 6, 5, 4]; var ans = Math.max.apply(null, a); console.log(ans);  // 6  这题很巧妙地用了apply,如果不是数组,是很多数字求最

JavaScript 面试题汇总(一)

JavaScript 面试题集锦(一) 一 选择题   1.关于XHTML 1.0规定的级别声明,下面选项中属于严格类型的是():   A.Strict B.Trasitional C.Frameset D.Mobile   答案:A。XHTML1.0有三种文档类型:Strict严格类型,Trasitional过渡类型,Frameset框架类型。   2.下面HTML标签中

2015年十大热点javascript笔试题你都会么?

第一次输出10应该没有问题。我们知道取对象属于除了点操作符还可以用中括号,所以第二次执行时相当于arguments调用方法,this指向arguments,而这里传了两个参数,故输出arguments长度为2。 AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载! 1、考察this  var length = 10; function fn() {

最新JavaScript笔试题(含答案)

1 判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母、数字、下划线,总长度为5-20var reg = ^[a-zA-Z][a-zA-Z_0-9]{4,19}$ ;reg test("a1a__a1a__a1a__a1a__");复制代码2 截取字符串abcde width="500" height="60" src="http://pos.baidu.com/acom?ad

【全开源】Java洗鞋上门预约小程序预约下单系统源码

核心功能: 预约服务:用户可以轻松预约洗鞋服务,选择鞋子类型、数量和服务要求,并预约合适的时间。订单管理:用户可以随时查看和管理自己的订单,包括订单状态、费用明细等。支付方式:提供多种支付方式,方便用户进行支付。地址管理:用户可以方便地添加或管理收货地址,享受送货上门或到店取件服务。实时跟踪:用户可以实时跟踪订单状态,从下单到完成,一切尽在指尖。反馈评价:完成订单后,用户可进行评价和反馈,帮助商

使用js/java合并3dtiles

目录 前言: 需合并的json目录 aa/tileset.json bb/tileset.json cc/tileset.json dd/tileset.json ee/tileset.json js源码: 运行命令: 生成结果: java源码: Matrix.java ThreeDTilesJoin2.java pom文件 运行程序: 生成合成文件 遇到的问题:

Jenkins +git +web(vue) centos8.5 实战打包部署 运维系列二

1新建一个工程           #cat  qy.sh #!/bin/bashcd /data/.jenkins/workspace/webrm -rf dist/rm -rf qysupweb.tar.gznpm run buildtar -czvf qysupweb.tar.gz dist/         #点击构建