[SpringBoot——Web开发(使用Thymeleaf模板引擎)]
【文字只能描述片段信息,具体细节参考代码】
https://github.com/HCJ-shadow/SpringBootPlus

引入POM依赖
 <properties>
        <java.version>1.8</java.version>
        <thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
        <thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>
</properties>
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
记坑thymeleaf无法跳转:https://blog.csdn.net/qq_40754146/article/details/95411413
将html页面放于classpath:template/下,thymeleaf就可自动渲染。

启动:
注:如果static下有index.html文件,系统会优先访问static下的index.html。

设置Thymeleaf页面跳转
新建一个controller

在templates下新建一个thymeleaf.html

访问:http://localhost:8080/thymeleaf

Thymeleaf CRUD测试
基础环境准备:
- 引入数据库相关pom依赖
  <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
- 引入Bootstrap依赖
 <!--引入bootstrap-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.0.0</version>
        </dependency>
  页面引用:
   <link  th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.css}" rel="stylesheet">
- 引入pageshelper插件
 <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>
配置yaml
pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  pageSizeZero: false #pageSize=0
1.创建数据库表

2.创建bean适配数据表

package zkkrun.top.web.bean;
import java.io.Serializable;
public class UserInfo implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String email;
    public UserInfo() {
    }
    public UserInfo(Integer id, String username, String password, Integer age, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.email = email;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "UserInfo{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
}
3.yaml配置数据源
spring:
  datasource:
    #   数据源基本配置
    username: noneplus1
    password: Noneplus564925080!1
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://47.113.6.247:3306/user?serverTimezone=UTC
4.创建Mapper接口,使用注解版Mybatis
package zkrun.top.web.mapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
import zkrun.top.web.bean.UserInfo;
@Repository
public interface UserInfoMapper {
    @Select("SELECT * FROM user_info WHERE id = #{id}")
    public UserInfo getUserById(Integer id);
    @Update("UPDATE user_info SET username=#{username},password=#{password},age=#{age},email=#{email} WHERE id=#{id}")
    public void updateUser(UserInfo userInfo);
    @Delete("DELETE FROM user_info WHERE id=#{id}")
    public void deleteUserById(Integer id);
    @Insert("INSERT INTO user_info(username,password,age,email) VALUES(#{username},#{password},#{age},#{email})")
    public void insertUser(UserInfo userInfo);
}
使用MapperScan扫描mapper接口所在包
@MapperScan("zkrun.top.web.mapper")
5.测试数据库
批量插入数据
package zkrun.top.web;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import zkrun.top.web.bean.UserInfo;
import zkrun.top.web.mapper.UserInfoMapper;
import java.util.UUID;
@RunWith(SpringRunner.class)
@SpringBootTest
public class WebApplicationTests {
    @Autowired
    UserInfoMapper userInfoMapper;
    @Test
    public void contextLoads() {
        UserInfo userInfo = userInfoMapper.getUserById(1);
        System.out.println(userInfo);
    }
    @Test
    public void insertDatas() {
        for(int i =0;i<1000;i++)
        {
            UserInfo userInfo = new UserInfo(i+2,UUID.randomUUID().toString().substring(0,8),"123456789",(Integer) (i+50)/3,"@sina.com");
            userInfoMapper.insertUser(userInfo);
        }
        System.out.println("插入成功!");
    }
}

显示信息列表
取消thymeleaf缓存
spring:
  thymeleaf:
    cache: false
ctrl+shift+F9刷新
1.UserInfoMapper增加SQL查询,获取所有信息

@Select("SELECT * FROM user_info")
    public List<UserInfo> getUsers();
2.创建CRUDController,使用PageHelper插件分页

@Controller
public class CRUDController {
    @Autowired
    UserInfoMapper userInfoMapper;
    @RequestMapping("/crud")
    public String crud(@RequestParam(defaultValue = "1") int pageNum,
                       @RequestParam(defaultValue = "10") int pageSize,
                       Model model)
    {
        //默认查询所有信息
        PageHelper.startPage(pageNum,pageSize);
        PageInfo<UserInfo> pageInfo = new PageInfo<UserInfo>(userInfoMapper.getUsers());
        model.addAttribute("pageInfo",pageInfo);
        return "crud";
    }
}
- pageNum,pageSize表示起始页和每页显示的数据量,通过@RequestParam参数将默认值设为1和10,方便设置下一页和上一页跳转。
 - PageHelper.startPage(pageNum,pageSize);设置起始页和每页显示的数据量
 - PageInfo pageInfo = new PageInfo(userInfoMapper.getUsers());将查询到的数据赋给pageInfo对象
 - model.addAttribute("pageInfo",pageInfo);将pageInfo传输进页面
 
3.Thymeleaf通过表达式适配数据
<table class="table">
    <tr>
        <th>id</th>
        <th>username</th>
        <th>password</th>
        <th>age</th>
        <th>email</th>
    </tr>
    <tr th:each="user:${pageInfo.list}">
        <td th:text="${user.id}"></td>
        <td th:text="${user.username}"></td>
        <td th:text="${user.password}"></td>
        <td th:text="${user.age}"></td>
        <td th:text="${user.email}"></td>
    </tr>
</table>
<ul class="pagination" style="margin-left: 50%">
    <li class="page-item"><a class="page-link"><span th:text="第+${pageInfo.pageNum}+页"></span></a></li>
    <li class="page-item"><a class="page-link" th:href="@{/crud}">首页</a></li>
    <li class="page-item"><a class="page-link" th:href="@{/crud(pageNum=${pageInfo.pages})}">尾页</a></li>
    <li class="page-item"><a class="page-link" th:href="@{/crud(pageNum=${pageInfo.prePage})}">Last</a></li>
    <li class="page-item"><a class="page-link" th:href="@{/crud(pageNum=${pageInfo.getNextPage()})}">Next</a></li>
</ul>
访问http://localhost:8080/crud

删除信息
Controller
//删除
    @RequestMapping("/delete")
    public String delete(int id) {
        userInfoMapper.deleteUserById(id);
        return "redirect:/user";
    }
UserInfoMapper
 @Delete("DELETE FROM user_info WHERE id=#{id}")
    public void deleteUserById(Integer id);
在页面添加一个按钮
   <button type="button" class="btn btn-danger"><a style="color: aliceblue" th:href="@{/delete(id=${user.id})}">删除</a></button>
修改和添加信息
先跳转到修改或者添加页面,再进行表单提交
修改
//点击修改按钮,跳转到修改页面,回显信息
    @RequestMapping("/modify")
    public String modify(int id ,Model model) {
        model.addAttribute("OneInfo",userInfoMapper.getUserById(id));
        return "modify";
    }
    //提交修改信息
    @RequestMapping("/modifyCommit")
    public String modify(UserInfo userInfo) {
        System.out.println(userInfo);
        userInfoMapper.updateUser(userInfo);
        System.out.println("修改提交.");
        return "redirect:/user";
    }
主页添加一个修改按钮
 <button type="button" class="btn btn-primary"><a style="color: aliceblue" th:href="@{/modify(id=${user.id})}">修改</a></button>
响应上述第一个请求,跳转到modify页面
modify页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>modify</title>
    <link  th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.css}" rel="stylesheet">
</head>
<body>
<div style="width: 50%;margin-left: 25%;margin-top: 5%">
    <h1>修改</h1>
    <form class="form-horizontal" th:action="@{/modifyCommit}">
        <input name="id" class="form-control"  th:value="${OneInfo.getId()}" style="display: none">
        <div class="form-group">
            <label  class="col-sm-2 control-label">Username</label>
            <div class="col-sm-10">
                <input name="username" class="form-control" id="Username" placeholder="Username" th:value="${OneInfo.getUsername()}">
            </div>
        </div>
        <div class="form-group">
            <label  class="col-sm-2 control-label">Password</label>
            <div class="col-sm-10">
                <input name="password" class="form-control" id="inputPassword3" placeholder="Password" th:value="${OneInfo.getPassword()}">
            </div>
        </div>
        <div class="form-group">
            <label  class="col-sm-2 control-label">age</label>
            <div class="col-sm-10">
                <input name="age" class="form-control" id="age" placeholder="Age" th:value="${OneInfo.getAge()}">
            </div>
        </div>
        <div class="form-group">
            <label  class="col-sm-2 control-label">Email</label>
            <div class="col-sm-10">
                <input name="email" class="form-control" id="inputEmail3" placeholder="Email" th:value="${OneInfo.getEmail()}">
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-primary">提交</button>
            </div>
        </div>
    </form>
</div>
</body>
</html>
其中modify表的action响应修改表的提交操作
添加
同理,跳转到添加页面,再进行表单提交
controller
    //添加:1.跳转到添加页面
    @RequestMapping("/add1")
    public String add1() {
        return "add";
    }
    //添加 : 2.提交信息
    @RequestMapping("/add2")
    public String add2(UserInfo userInfo) {
        System.out.println(userInfo);
        userInfoMapper.insertUser(userInfo);
        return "redirect:/user";
    }
添加一个按钮
<button style="margin-left: 75%" type="button" class="btn btn-primary"><a style="color: aliceblue" th:href="@{/add1}">新增</a></button>
添加页面(对比修改页面不需要回显)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>add</title>
    <link  th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.css}" rel="stylesheet">
</head>
<body>
<div style="width: 50%;margin-left: 25%;margin-top: 5%">
<h1>添加</h1>
<form class="form-horizontal" th:action="@{/add2}">
    <div class="form-group">
        <label  class="col-sm-2 control-label">Username</label>
        <div class="col-sm-10">
            <input name="username" class="form-control" id="Username" placeholder="Username">
        </div>
    </div>
    <div class="form-group">
        <label  class="col-sm-2 control-label">Password</label>
        <div class="col-sm-10">
            <input name="password" class="form-control" id="inputPassword3" placeholder="Password">
        </div>
    </div>
    <div class="form-group">
        <label  class="col-sm-2 control-label">age</label>
        <div class="col-sm-10">
            <input name="age" class="form-control" id="age" placeholder="Age">
        </div>
    </div>
    <div class="form-group">
        <label  class="col-sm-2 control-label">Email</label>
        <div class="col-sm-10">
            <input name="email" class="form-control" id="inputEmail3" placeholder="Email">
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <button type="submit" class="btn btn-primary">提交</button>
        </div>
    </div>
</form>
</div>
</body>
</html>
测试
插入500条测试数据
 @Test
    public void insertDatas() {
        System.out.println("开始插入...");
        for(int i =1;i<500;i++)
        {
            UserInfo userInfo = new UserInfo(i,UUID.randomUUID().toString().substring(0,8),"123456789",(Integer) (i+50)/3,"@sina.com");
            userInfoMapper.insertUser(userInfo);
        }
        System.out.println("插入成功!");
    }


显示信息列表

修改


添加


[SpringBoot——Web开发(使用Thymeleaf模板引擎)]的更多相关文章
- SpringBoot Web开发(4) Thymeleaf模板与freemaker
		
SpringBoot Web开发(4) Thymeleaf模板与freemaker 一.模板引擎 常用得模板引擎有JSP.Velocity.Freemarker.Thymeleaf SpringBoo ...
 - Spring Boot Web开发与thymeleaf模板引擎
		
简介: 使用Springboot应用,选中需要的模块, Spring已经默认将场景配置好了,只需在配置文件中少量配置就可以运行起来 自己编写业务代码 自动配置原理 这个场景Springboot帮我们配 ...
 - Spring Boot Web开发中Thymeleaf模板引擎的使用
		
这里使用的是idea 1.新建Spring Boot项目 File-->New-->Project...,然后选择左边的Spring Initializr-->Next,可根据自己的 ...
 - SpringBoot入门篇--使用Thymeleaf模板引擎进行页面的渲染
		
在做WEB开发的时候,我们不可避免的就是在前端页面之间进行跳转,中间进行数据的查询等等操作.我们在使用SpringBoot之前包括我在内其实大部分都是用的是JSP页面,可以说使用的已经很熟悉.但是我们 ...
 - JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎
		
上篇博客我们聊了<JavaEE开发之SpringBoot工程的创建.运行与配置>,从上篇博客的内容我们不难看出SpringBoot的便捷.本篇博客我们继续在上篇博客的基础上来看一下Spri ...
 - SpringBoot项目的前端+thymeleaf模板引擎
		
SpringBoot项目创建之后,后台的框架是SpringMVC.但前端的resource和template目录都是空的.这个时候需要创建前台页面. 习惯上,我们会创建JSP,但是,SpringBoo ...
 - springboot笔记06——使用Thymeleaf模板引擎
		
前言 Springboot 推荐使用Thymeleaf做视图层.Thymeleaf支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式.浏览器解释 html 时会忽略 ...
 - (二)SpringBoot基础篇- 静态资源的访问及Thymeleaf模板引擎的使用
		
一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...
 - (二)SpringBoot2.0基础篇- 静态资源的访问及Thymeleaf模板引擎的使用
		
一.描述 在应用系统开发的过程中,不可避免的需要使用静态资源(浏览器看的懂,他可以有变量,例:HTML页面,css样式文件,文本,属性文件,图片等): 并且SpringBoot内置了Thymeleaf ...
 - SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图
		
在Web开发过程中,Spring Boot可以通过@RestController来返回json数据,那如何渲染Web页面?Spring Boot提供了多种默认渲染html的模板引擎,主要有以下几种: ...
 
随机推荐
- Java基础及JavaWEB以及SSM框架学习笔记Xmind版
			
Java基础及JavaWEB以及SSM框架学习笔记Xmind版 转行做程序员也1年多了,最近开始整理以前学习过程中记录的笔记,以及一些容易犯错的内容.现在分享给网友们.笔记共三部分. JavaSE 目 ...
 - 消息中间件——RabbitMQ(七)高级特性全在这里!(上)
			
前言 前面我们介绍了RabbitMQ的安装.各大消息中间件的对比.AMQP核心概念.管控台的使用.快速入门RabbitMQ.本章将介绍RabbitMQ的高级特性.分两篇(上/下)进行介绍. 消息如何保 ...
 - d3.js  V5版本在vue里使用  自定义节点图片
			
var width = this.$refs.topInfo.offsetWidth; var height = this.$refs.topInfo.offsetHeight; var img_w ...
 - Docker学习总结(三)--常用命令
			
镜像相关命令 查看镜像 docker images 返回列表字段含义如下: 字段名称 字段含义 REPOSITORY 镜像名称 TAG 镜像标签 IMAGE ID 镜像 ID CREATED 镜像创建 ...
 - 使用VS Code 开发.NET CORE 程序指南
			
1. 前言 近两年来,很多前端的同学都开始将 VSCode 作为前端主力开发工具,其丰富的扩展给程序开发尤其是前端开发带来了很多便利,但是作为微软主力语言的 .NET,却由于有宇宙第一编辑器 Visu ...
 - lua_在C#中执行lua脚本
			
方法一:使用DoString 代码为: Lua lua = new Lua(); lua.DoString("a=13"); lua.D ...
 - 8、kubernetes之存储卷资源
			
一.存储卷的类型 emptyDir:在宿主机上分一块内存空间给pod当做存储空间 hostPath:在宿主机上分一块磁盘空间给pod当做存储空间 网络存储: SAN:iSCSI,FC NAS:nfs, ...
 - 原生js之Ajax
			
1.什么是Ajax? 全称:Asynchronous JavaScript and XML (异步的 JavaScript和 xml),是前后端数据交互的一种技术(前端通过 Ajax 发送http请 ...
 - qt学习笔记(1):qt点击运行没有反应。
			
因为公司的项目需要,今天开始重新学习已经忘干净了的QT, 说起qt之前在学校刚接触的时候就打心底里喜欢这个编辑器, 因为一直使用vs做项目,面对着黑洞洞的窗口总让人不舒服, 自从接触了qt感觉迎来了曙 ...
 - JavaScript String 小球重力弹回
			
JavaScript String 小球重力弹回 <!DOCTYPE html> <html lang="en"> <head> <met ...