一、Thymeleaf语法详解
1.变量输出和字符串操作:
- th:text
在页面中输出值。
<span th:text="hello"></span>
<span th:text="${msg}"></span>
- th:value
可以将一个值放入到 input 标签的 value 中。
<input type="text" name="username" th:value="${msg}" />
2.Thymeleaf的内置对象:
Thymeleaf中有许多内置对象,可以在模板中实现各种功能。
语法:
(1)调用内置对象一定要用#;
(2)大部分的内置对象都以 s 结尾 strings、numbers、dates;
- strings :
(1)判断字符串是否为空,如果为空返回 true,否则返回 false;
${#strings.isEmpty(key)}
(2)判断字符串是否包含指定的子串,如果包含返回 true,否则返回 false
${#strings.contains(msg,'T')}
(3)判断当前字符串是否以子串开头,如果是返回 true,否则返回 false
${#strings.startsWith(msg,'a')}
(4)判断当前字符串是否以子串结尾,如果是返回 true,否则返回 false
${#strings.endsWith(msg,'a')}
(5)返回字符串的长度
${#strings.length(msg)}
(6)查找子串的位置,并返回该子串的下标,如果没找到则返回-1
${#strings.indexOf(msg,'h')}
(7)截取子串,用户与 jdkString 类下 SubString 方法相同
${#strings.substring(msg,13)}
${#strings.substring(msg,13,15)}
(8)字符串转大小写。
${#strings.toUpperCase(msg)}
${#strings.toLowerCase(msg)}
- dates日期格式化:
(1)格式化日期,默认的以浏览器默认语言为格式化标准
${#dates.format(key)}
(2)按照自定义的格式做日期转换
${#dates.format(key,'yyy/MM/dd')}
(3)取年、月、日:
${#dates.year(key)}
${#dates.month(key)}
${#dates.day(key)}
- 测试:
<body>
<span th:text="hello"></span>
<span th:text="${msg}"></span>
<hr />
<input type="text" name="username" th:value="${msg}" />
<hr />
<span style="color: red">判断字符串是否为空:</span>
<span th:text="${#strings.isEmpty(msg)}"></span>
<hr />
<span style="color: red">判断字符串是否包含指定的子串:</span>
<span th:text="${#strings.contains(msg,'T')}"></span>
<hr />
<span style="color: red">判断当前字符串是否以子串开头:</span>
<span th:text="${#strings.startsWith(msg,'a')}"></span>
<br />
<span style="color: red">判断当前字符串是否以子串结尾:</span>
<span th:text="${#strings.endsWith(msg,'a')}"></span>
<hr />
<span style="color: red">返回字符串的长度:</span>
<span th:text="${#strings.length(msg)}"></span>
<hr />
<span style="color: red">查找子串的位置,并返回该子串的下标:</span>
<span th:text="${#strings.indexOf(msg,'a')}"></span>
<hr />
<span style="color: red">截取子串:</span>
<span th:text="${#strings.substring(msg,7)}"></span>
<span th:text="${#strings.substring(msg,7,9)}"></span>
<hr />
<span style="color: red">字符串转大小写:</span>
<br />
<span th:text="${#strings.toUpperCase(msg)}"></span>
<br />
<span th:text="${#strings.toLowerCase(msg)}"></span>
<hr />
<span style="color: red">格式化日期:</span>
<span th:text="${#dates.format(key)}"></span>
<hr />
<span style="color: red">按照自定义的格式做日期转换:</span>
<span th:text="${#dates.format(key,'yyyy/mm/dd')}"></span>
<hr />
<span style="color: red">取年,月,日</span>
<span th:text="${#dates.year(key)}"></span>
<span th:text="${#dates.month(key)}"></span>
<span th:text="${#dates.day(key)}"></span>
</body>

3.条件判断
- th:if
<span th:if="${sex} == ' 男 '"> 性别:男 </span>
<span th:if="${sex} == ' 女 '"> 性别:女 </span>
- th:switch
<div th:switch="${id}">
<span th:case="1">ID 为 1</span>
<span th:case="2">ID 为 2</span>
<span th:case="3">ID 为 3</span>
</div>
4.迭代遍历:
- th:each
<table border="1px" align="center">
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<tr th:each="u:${list}">
<td th:text="${u.userid}"></td>
<td th:text="${u.username}"></td>
<td th:text="${u.userage}"></td>
</tr>
</table>
</body>
- 状态变量:
(1)index:当前迭代器的索引 从 0 开始 ;
(2)count:当前迭代对象的计数 从 1 开始;
(3)size:被迭代对象的长度;
(4)even/odd:布尔值,当前循环是否是偶数/奇数 从 0 开始 ;
(5)first:布尔值,当前循环的是否是第一条,如果是返回 true 否则返回 false;
(6)last:布尔值,当前循环的是否是最后一条,如果是则返回 true 否则返回 false;
<table border="1px" align="center">
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>索引</th>
<th>计数</th>
<th>长度</th>
<th>偶数</th>
<th>奇数</th>
<th>第一条</th>
<th>最后一条</th>
</tr>
<tr th:each="u,var:${list}">
<td th:text="${u.userid}"></td>
<td th:text="${u.username}"></td>
<td th:text="${u.userage}"></td>
<td th:text="${var.index}"></td>
<td th:text="${var.count}"></td>
<td th:text="${var.size}"></td>
<td th:text="${var.even}"></td>
<td th:text="${var.odd}"></td>
<td th:text="${var.first}"></td>
<td th:text="${var.last}"></td>
</tr>
</table>

- th:each迭代Map
<table border="1px">
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<tr th:each="map:${map}">
<td th:text="${map.value.userid}"></td>
<td th:text="${map.value.username}"></td>
<td th:text="${map.value.userage}"></td>
</tr>
</table>

5.域对象:
- HttpServletRequest:
th:text="${#httpServletRequest.getAttribute('req')}"
- HttpSession:
th:text="${session.sess}"
- ServletContext:
th:text="${application.app}"
6.URL表达式:
基本语法:@{}
- 绝对路径:
th:href="@{http://www.baidu.com}"
- 相对路径:
th:href="@{路径}"
- 在 url 中实现参数传递
th:href="@{/show(key=vlaue)
二、Spring Boot整合SpringMVC+MyBatis
1.需求:
通过使用 SpringBoot+SpringMVC+MyBatis 整合实现一 个对数据库中的 users 表的 CRUD 的操作。
2.搭建架构:
2.1修改POM文件:
<properties>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<!-- springBoot 的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- web 启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency> <!-- Mybatis 启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency> <!-- mysql 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> <!-- druid 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
</dependencies>
2.2添加 application.properties 全局配置文件:
#配置数据源
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ssm
spring.datasource.username=root
spring.datasource.password=root
#配置数据库连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#配置MyBatis的包别名
mybatis.type-aliases-package=com.zlw.entity
2.3数据库:
CREATE TABLE `users` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) DEFAULT NULL,
`userage` int(5) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
3.3项目结构:

3.实现业务:
3.1创建实体类:
public class Users {
private Integer userid;
private String username;
private Integer userage;
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getUserage() {
return userage;
}
public void setUserage(Integer userage) {
this.userage = userage;
}
}
3.2实现业务
- mapper接口和配置文件:
public interface UserMapper {
//添加操作
void insertUser(Users users);
//查询所有
List<Users> selectUser();
//查询指定用户
Users findById(int userid);
//修改操作
void updateUser(Users users);
//删除操作
void deleteUser(int userid);
}
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zlw.mapper.UserMapper">
<insert id="insertUser" parameterType="Users">
insert into users(username,userage) values(#{username},#{userage})
</insert>
<select id="selectUser" resultType="Users">
select *from users
</select>
<select id="findById" resultType="Users">
select *from users where userid=#{userid}
</select>
<update id="updateUser" parameterType="Users">
update users set username=#{username},userage=#{userage} where userid=#{userid}
</update>
<delete id="deleteUser" parameterType="Users">
delete from users where userid=#{userid}
</delete>
</mapper>
- Service业务层:
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public void addUser(Users users) {
userMapper.insertUser(users);
}
@Override
public List<Users> findAll() {
return userMapper.selectUser();
}
@Override
public void updateUser(Users users) {
userMapper.updateUser(users);
}
@Override
public void deleteUser(int userid) {
userMapper.deleteUser(userid);
}
@Override
public Users findById(int userid) {
Users users = userMapper.findById(userid);
return users;
}
}
- Controller:
@Controller
public class ShowPage {
@RequestMapping("/{page}")
public String showPage(@PathVariable String page) {
return page;
}
}
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/addUser")
public String addUser(Users users) {
userService.addUser(users);
return "redirect:/user/findAll";
}
@RequestMapping("/findAll")
public String findAll(Model model) {
List<Users> list = userService.findAll();
model.addAttribute("list", list);
return "list";
}
@RequestMapping("/update")
public String update(Users users) {
System.out.println(users.getUsername());
System.out.println(users.getUserage());
userService.updateUser(users);
return "redirect:/user/findAll";
}
@RequestMapping("/delete")
public String delete(Integer id) {
userService.deleteUser(id);
return "redirect:/user/findAll";
}
@RequestMapping("findById")
public String findById(Integer id,Model model) {
Users user = userService.findById(id);
model.addAttribute("user",user);
return "update";
}
}
- 编写页面:
(1)添加页面:
<body>
<form th:action="@{/user/addUser}" method="post">
<p>
用户名:<input type="text" name="username" />
</p>
<p>
年龄<input type="text" name="userage" />
</p>
<p>
<input type="submit" name="" value="添加" />
</p>
</form>
</body>
(2)数据展示:
<body>
<table border="1px" align="center" width="600px">
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>操作</th>
</tr>
<tr th:each="user:${list}">
<td th:text="${user.userid}"></td>
<td th:text="${user.username}"></td>
<td th:text="${user.userage}"></td>
<td>
<a th:href="@{/user/findById(id=${user.userid})}">修改</a>
<a th:href="@{/user/delete(id=${user.userid})}">删除</a>
</td>
</tr>
</table>
</body>
(3)修改用户:
<body>
<form th:action="@{/user/update}" method="post">
<p>
<input type="hidden" name="userid" th:value="${user.userid}" />
</p>
<p>
用户名:<input type="text" name="username" th:value="${user.username}" />
</p>
<p>
年龄<input type="text" name="userage" th:value="${user.userage}" />
</p>
<p>
<input type="submit" value="修改" />
</p>
</form>
</body>
-
实现效果:
数据展示
添加页面
修改
网友评论