操做前建议先参考个人另外一篇博客:玩转 SpringBoot 2 快速整合 | Thymeleaf 篇 查看如何在SpringBoot 中使用 Thymeleaf。还有一点须要注意的是:模版页面中的 html 上须要声明 Thymeleaf 的命名空间,具体代码以下:javascript
<html xmlns:th="http://www.thymeleaf.org">复制代码
接下来就能够开始 Thymeleaf 使用教程了!css
全文介绍 Thymeleaf 是基于 Thymeleaf 3.0.11.RELEASE 版本进行说明的。html
用于文本内容的显示操做。java
代码演示:git
@RequestMapping("/th")
public String th(Model model){
String msg = "<h1>我是h1</h1>";
model.addAttribute("msg",msg);
return "/course/th";
}复制代码
th:text 进行文本替换 不会解析htmlgithub
<p th:text="text标签: + ${msg}"></p>复制代码
结果页面:web
<p>text标签:<h1>我是h1</h1></p>复制代码
游览器访问的效果:spring
th:utext 进行文本替换 会解析html数组
<p th:utext="utext标签: + ${msg}"></p>复制代码
游览器展现效果以下图:使用 + 和 | | 效果是同样的,以下代码所示:springboot
<p th:utext="utext标签: + ${msg}"></p>
<p th:utext="|utext标签: ${msg}|"></p>复制代码
拼接字符串经过 + 或者 | 进行拼接
代码演示:
@RequestMapping("/th")
public String th(Model model){
model.addAttribute("a",1);
model.addAttribute("b",2);
return "/course/th";
}复制代码
模版页面:
<p th:text="${a}+${b}"></p>复制代码
结果页面:
<p>3</p>复制代码
---模版页面:
<p th:text="|${a} ${b}|"></p>复制代码
结果页面:
<p>1 2</p>复制代码
---模版页面:
<p th:text="${a} > ${b}"></p>复制代码
结果是:
<p>false</p> 复制代码
---java代码:
@RequestMapping("/th")
public String th(Model model){
model.addAttribute("flag",true);
return "/course/th";
}复制代码
模版页面:
<p th:text="!${flag}"></p>复制代码
结果页面:
<p>false</p>复制代码
正常状况下 {...} 和 ${...}是同样的,可是 {...} 通常和 th:object 进行一块儿使用来完成对象属性的简写。
代码演示:
@RequestMapping("/th")
public String th(Model model){
User user = new User("ljk",18);
model.addAttribute("user",user);
return "/course/th";
}复制代码
使用 ${...}操做模版代码:
<p th:text="${user.name}"></p>
<p th:text="${user.age}"></p>复制代码
结果页面:
<p>ljk</p><p>18</p>复制代码
使用 *{...}操做模版代码:
<p th:text="*{user.name}"></p>
<p th:text="*{user.age}"></p>复制代码
结果页面:
<p>ljk</p><p>18</p>复制代码
使用 *{...}特有操做模版代码:
<div th:object="${user}" >
<p th:text="*{name}"></p>
<p th:text="*{age}"></p>
</div>复制代码
结果页面:
<p>ljk</p><p>18</p>复制代码
用于国际化message.properties 属性读取定义message.properties 配置文件
定义国际化处理转换处理类
@Configuration
public class LocaleResolverConfig {
@Bean(name="localeResolver")
public LocaleResolver localeResolverBean() {
return new SessionLocaleResolver();
}
}复制代码
定义国际化处理的controller
@Controller
public class ProductController {
@Autowired
private LocaleResolver localeResolver;
private ProductService productService = new ProductService();
@RequestMapping("/")
public String useT(Model model,HttpServletRequest request,HttpServletResponse response) {
//设置访问用户信息到session
request.getSession(true).setAttribute("user", new User("桌前", "明月", "CHINA", null));
localeResolver.setLocale(request,response,Locale.CHINA);
return "productList";
}
}复制代码
若是没有定义 messageenUS.properties 和 messagezhCN.properties 会默认取message.properties中的信息若是 Locale = Locale.CHINA 就取 messagezhCN.properties若是 Locale = Locale.US 就取 messageenUS.properties。
模版代码:
<p th:utext="#{home.welcome(${session.user.name})}">Welcome to our grocery store, Sebastian!</p>复制代码
访问controller的路径的效果:
这个通常和模版布局的语法一块儿使用,具体使用方式请看下面模版布局的教程。
通常和 th:href、th:src进行结合使用,用于显示Web 应用中的URL连接。经过@{...}表达式Thymeleaf 能够帮助咱们拼接上web应用访问的全路径,同时咱们能够经过()进行参数的拼接
代码演示:
模版代码:
<img th:src="@{/images/gtvglogo.png}" />复制代码
结果页面:
<img src="/sbe/images/gtvglogo.png">复制代码
---模版代码:
<a th:href="@{/product/comments(prodId=${prod.id})}" >查看</a>复制代码
结果页面:
<a href="/sbe/product/comments?prodId=2">查看</a>复制代码
---模版代码:
<a th:href="@{/product/comments(prodId=${prod.id},prodId2=${prod.id})}" >查看</a>复制代码
结果页面:
<a href="/sbe/product/comments?prodId=2&prodId2=2">查看</a>复制代码
th:if 当条件为true则显示。th:unless 当条件为false 则显示。
代码演示:
java代码:
@RequestMapping("/thif")
public String thif(Model model){
model.addAttribute("flag",true);
return "/course/thif";
}复制代码
模版页面:
<p th:if="${flag}">if判断</p>复制代码
结果页面:
<p>if判断</p>复制代码
---模版页面:
<p th:unless="!${flag}">unless 判断</p>复制代码
结果页面:
<p>unless 判断</p>复制代码
th:switch 咱们能够经过switch来完成相似的条件表达式的操做。代码演示:java代码:
@RequestMapping("/thswitch")
public String thswitch(Model model){
User user = new User("ljk",23);
model.addAttribute("user",user);
return "/course/thswitch";
}复制代码
模版页面:
<div th:switch="${user.name}">
<p th:case="'ljk'">User is ljk</p>
<p th:case="ljk1">User is ljk1</p>
</div>复制代码
结果页面:
<div><p> User is ljk</p></div>复制代码
th:each 遍历集合
代码演示:java代码:
@RequestMapping("/theach")
public String theach(Model model){
List<User> userList = new ArrayList<User>();
User user1 = new User("ljk",18);
User user2 = new User("ljk2",19);
User user3 = new User("ljk3",20);
User user4 = new User("lj4",21);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
model.addAttribute("userList",userList);
List<String> strList = new ArrayList<String>();
strList.add("ljk");
strList.add("ljk2");
strList.add("ljk3");
strList.add("lj4");
model.addAttribute("strList",strList);
return "/course/theach";
}复制代码
模版页面:
<table>
<thead>
<tr>
<th>用户名称</th>
<th>用户年龄</th>
</tr>
</thead>
<tbody>
<tr th:each="user : ${userList}" th:class="${userStat.odd}? 'odd'">
<td th:text="${user.name}">Onions</td>
<td th:text="${user.age}">2.41</td>
</tr>
</tbody>
</table>
----------------------------------------------------------------------
<table>
<thead>
<tr>
<th>用户名称</th>
</tr>
</thead>
<tbody>
<tr th:each="str : ${strList}" th:class="${strStat.odd}? 'odd'">
<td th:text="${str}">Onions</td>
</tr>
</tbody>
</table>
复制代码
结果页面:
咱们能够经过便利的变量名+Stat 来获取索引 是不是第一个或最后一个等。便利的变量名+Stat称做状态变量,其属性有:
用于声明在a 标签上的href属性的连接 该语法会和@{..} 表达式一块儿使用。
代码演示:java代码:
@RequestMapping("/thhref")
public String thhref(Model model){
return "/course/thhref";
}复制代码
模版代码:
<a href="../home.html" th:href="@{/}">返回首页</a>复制代码
结果页面:
<a href="/sbe/">返回首页</a>复制代码
用于声明在标签上class 属性信息。
代码演示:java代码:
@RequestMapping("/thclass")
public String thclass(Model model){
return "/course/thclass";
}复制代码
模版页面:
<p th:class=" 'even'? 'even' : 'odd'" th:text=" 'even'? 'even' : 'odd'"></p>复制代码
结果页面:
<p class="even">even</p>复制代码
用于声明html中或自定义属性信息。
代码演示:
java代码:
@RequestMapping("/thattr")
public String thattr(Model model){
return "/course/thattr";
}复制代码
模版页面:
<img th:attr="src=@{/images/gtvglogo.png}" />复制代码
结果页面:
<img src="/sbe/images/gtvglogo.png">复制代码
用于声明html中value属性信息。
代码演示:java代码:
@RequestMapping("/thvalue")
public String thvalue(Model model){
model.addAttribute("name", "ljk");
return "/course/thvalue";
}复制代码
模版页面:
<input type="text" th:value="${name}" />复制代码
结果页面:
<input type="text" value="ljk">复制代码
用于声明html from标签中action属性信息。
代码演示:java代码:
@RequestMapping("/thaction")
public String thaction(Model model){
return "/course/thaction";
}复制代码
模版页面:
<form action="subscribe.html" th:action="@{/subscribe}">
<input type="text" name="name" value="abc"/>
</form>复制代码
结果页面:
<form action="/sbe/subscribe">
<input type="text" name="name" value="abc">
</form>复制代码
用于声明htm id属性信息。
代码演示:java代码:
@RequestMapping("/thid")
public String thid(Model model){
model.addAttribute("id", 123);
return "/course/thid";
}复制代码
模版页面:
<p th:id="${id}"></p>复制代码
结果页面:
<p id="123"></p>复制代码
JavaScript内联 操做使用的语法,具体请参考下面内联操做相关介绍
用于声明htm 中的onclick事件。
代码演示:java代码:
@RequestMapping("/thonclick")
public String honclick(Model model){
return "/course/thonclick";
}复制代码
模版页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function showUserInfo(){
alert("i am zhuoqianmingyue!")
}
</script>
</head>
<body>
<p th:onclick="'showUserInfo()'">点我</p>
</body>
</html>复制代码
结果页面:
<p onclick="showUserInfo()">点我</p>复制代码
用于声明htm 中的selected属性信息。
代码演示:java代码:
@RequestMapping("/thselected")
public String thselected(Model model){
model.addAttribute("sex", 1);
return "/course/thselected";
}复制代码
模版页面:
<select>
<option name="sex"></option>
<option th:selected="1 == ${sex}">男</option>
<option th:selected="0 == ${sex}">女</option>
</select>复制代码
结果页面:
<select>
<option name="sex"></option>
<option selected="selected">男</option>
<option>女</option>
</select>复制代码
用于声明htm 中的img中src属性信息。
代码演示:java代码:
@RequestMapping("/thsrc")
public String thsrc(Model model){
return "/course/thsrc";
}复制代码
模版页面:
<img title="GTVG logo" th:src="@{/images/gtvglogo.png}" />复制代码
结果页面:
<img title="GTVG logo" src="/sbe/images/gtvglogo.png">复制代码
用于声明htm中的标签 css的样式信息。
代码演示:java代码:
RequestMapping("/thstyle")
public String thstyle(Model model){
model.addAttribute("isShow", true);
return "/course/thstyle";
}复制代码
模版页面:
<p th:style="'display:' + @{(${isShow} ? 'none' : 'block')} + ''"></p>复制代码
结果页面:
<p style="display:none"></p>复制代码
用于thymeleaf 模版页面中局部变量定义的使用。
代码演示:java代码:
@RequestMapping("/thwith")
public String thwith(Model model){
model.addAttribute("today", new Date());
return "/course/thwith";
}复制代码
模版页面:
<p th:with="df='dd/MMM/yyyy HH:mm'">
Today is: <span th:text="${#dates.format(today,df)}">13 February 2011</span>
</p>复制代码
结果页面:
<span>02/六月/2019 06:52</span>复制代码
---java代码:
@RequestMapping("/thwith")
public String thwith(Model model){
List<User> users = new ArrayList<User>();
users.add(new User("ljk",18));
users.add(new User("ljk2",18));
model.addAttribute("users",users);
return "/course/thwith";
}复制代码
模版页面:
<div th:with="firstEle=${users[0]}">
<p>
第一个用户的名称是: <span th:text="${firstEle.name}"></span>.
</p>
</div>复制代码
结果页面:
<div>
<p>
第一个用户的名称是: <span>ljk</span>.
</p>
</div>复制代码
还有一种用法是在模版布局中带参数的引用片断中使用方式以下:
<div th:replace="::frag" th:with="onevar=${value1},twovar=${value2}">复制代码
具体演示请参考模版布局中的介绍。
Elvis运算能够理解成简单的判断是否为null的三元运算的简写,若是值为nullzhe显示默认值,若是不为null 则显示原有的值。
代码演示:java代码:
@RequestMapping("/elvis")
public String elvis(Model model){
model.addAttribute("age", null);
return "/course/elvis";
}复制代码
模版页面:
<p>Age: <span th:text="${age}?: '年龄为nll'"></span></p>复制代码
结果页面:
<p>Age: <span>年龄为nll</span></p>复制代码
---java代码:
@RequestMapping("/elvis")
public String elvis(Model model){
model.addAttribute("age2", 18);
return "/course/elvis";
}复制代码
模版页面:
<p>Age2: <span th:text="${age2}?: '年龄为nll'"></span></p>复制代码
结果页面:
<p>Age2: <span>18</span></p>复制代码
咱们能够在thymeleaf 的语法中使用三元表达式 具体使用方法是在th:x 中经过 表达式?1选项:2选项。
代码演示:java代码:
@RequestMapping("/threeElementOperation")
public String threeElementOperation(Model model){
return "/course/threeElementOperation";
}复制代码
模版页面:
<p th:class=" 'even'? 'even' : 'odd'" th:text=" 'even'? 'even' : 'odd'"></p>复制代码
结果页面:
<p class="even">even</p>复制代码
---java代码:
@RequestMapping("/threeElementOperation")
public String threeElementOperation(Model model){
model.addAttribute("name", "ljk");
return "/course/threeElementOperation";
}复制代码
模版页面:
<p th:value="${name eq 'ljk' ? '帅哥':'丑男'}" th:text="${name eq 'ljk' ? '帅哥':'丑男'}"></p>复制代码
结果页面:
<p value="帅哥">帅哥</p>复制代码
条件表达式操做字符:
gt:great than(大于)
ge:great equal(大于等于)
eq:equal(等于)
lt:less than(小于)
le:less equal(小于等于)
ne:not equal(不等于)
Elvis运算符 的一种特殊简写操做,当显示的值为null 是就什么都不作。
代码演示:java代码:
@RequestMapping("/noOperation")
public String noOperation(Model model){
model.addAttribute("name", null);
return "/course/noOperation";
}复制代码
模版页面:
<span th:text="${name} ?: _">no user authenticated</span>复制代码
结果页面:
<span>no user authenticated</span>复制代码
标准方言中存在如下固定值布尔属性:
th:async |
th:autofocus |
th:autoplay |
---|---|---|
th:checked |
th:controls |
th:declare |
th:default |
th:defer |
th:disabled |
th:formnovalidate |
th:hidden |
th:ismap |
th:loop |
th:multiple |
th:novalidate |
th:nowrap |
th:open |
th:pubdate |
th:readonly |
th:required |
th:reversed |
th:scoped |
th:seamless |
th:selected |
针对特定的HTML5属性:
th:abbr |
th:accept |
th:accept-charset |
---|---|---|
th:accesskey |
th:action |
th:align |
th:alt |
th:archive |
th:audio |
th:autocomplete |
th:axis |
th:background |
th:bgcolor |
th:border |
th:cellpadding |
th:cellspacing |
th:challenge |
th:charset |
th:cite |
th:class |
th:classid |
th:codebase |
th:codetype |
th:cols |
th:colspan |
th:compact |
th:content |
th:contenteditable |
th:contextmenu |
th:data |
th:datetime |
th:dir |
th:draggable |
th:dropzone |
th:enctype |
th:for |
th:form |
th:formaction |
th:formenctype |
th:formmethod |
th:formtarget |
th:fragment |
th:frame |
th:frameborder |
th:headers |
th:height |
th:high |
th:href |
th:hreflang |
th:hspace |
th:http-equiv |
th:icon |
th:id |
th:inline |
th:keytype |
th:kind |
th:label |
th:lang |
th:list |
th:longdesc |
th:low |
th:manifest |
th:marginheight |
th:marginwidth |
th:max |
th:maxlength |
th:media |
th:method |
th:min |
th:name |
th:onabort |
th:onafterprint |
th:onbeforeprint |
th:onbeforeunload |
th:onblur |
th:oncanplay |
th:oncanplaythrough |
th:onchange |
th:onclick |
th:oncontextmenu |
th:ondblclick |
th:ondrag |
th:ondragend |
th:ondragenter |
th:ondragleave |
th:ondragover |
th:ondragstart |
th:ondrop |
th:ondurationchange |
th:onemptied |
th:onended |
th:onerror |
th:onfocus |
th:onformchange |
th:onforminput |
th:onhashchange |
th:oninput |
th:oninvalid |
th:onkeydown |
th:onkeypress |
th:onkeyup |
th:onload |
th:onloadeddata |
th:onloadedmetadata |
th:onloadstart |
th:onmessage |
th:onmousedown |
th:onmousemove |
th:onmouseout |
th:onmouseover |
th:onmouseup |
th:onmousewheel |
th:onoffline |
th:ononline |
th:onpause |
th:onplay |
th:onplaying |
th:onpopstate |
th:onprogress |
th:onratechange |
th:onreadystatechange |
th:onredo |
th:onreset |
th:onresize |
th:onscroll |
th:onseeked |
th:onseeking |
th:onselect |
th:onshow |
th:onstalled |
th:onstorage |
th:onsubmit |
th:onsuspend |
th:ontimeupdate |
th:onundo |
th:onunload |
th:onvolumechange |
th:onwaiting |
th:optimum |
th:pattern |
th:placeholder |
th:poster |
th:preload |
th:radiogroup |
th:rel |
th:rev |
th:rows |
th:rowspan |
th:rules |
th:sandbox |
th:scheme |
th:scope |
th:scrolling |
th:size |
th:sizes |
th:span |
th:spellcheck |
th:src |
th:srclang |
th:standby |
th:start |
th:step |
th:style |
th:summary |
th:tabindex |
th:target |
th:title |
th:type |
th:usemap |
th:value |
th:valuetype |
th:vspace |
th:width |
th:wrap |
th:xmlbase |
th:xmllang |
th:xmlspace |
咱们能够经过 在父标签声明 th:inline="text" 来开启内联操做。固然若是想整个页面使用能够直接声明在body上便可。具体使用方式以下面代码所示。
模版页面:
<div th:inline="text">
<p>Hello, [[${user.name}]]!</p>
</div>复制代码
结果内容以下:
<div>
<p>Hello,zhuoqianmingyue!</p>
</div>复制代码
这样的操做和使用th:text是等同的。
<div>
<p th:text="Hello,+${user.name}"></p>
</div>复制代码
[[...]]对应于th:text,[(...)]对应于th:utext
这咱们能够经过在父标签或者本标签上声明th:inline="none"来禁用内联的操做,以下面代码所示:模版页面:
<p th:inline="none">A double array looks like this: [[1, 2, 3], [4, 5]]!</p>复制代码
结果页面:
<p>A double array looks like this: [[1, 2, 3], [4, 5]]!</p>复制代码
若是咱们想在JavaScript 中使用内联操做,须要在 script 标签上声明 th:inline="javascript" 而后咱们就能够 script 标签中使用内联操做了。具体使用方式以下面代码所示:模版页面:
<script th:inline="javascript">
var username = [[${user.name}]];
</script>复制代码
结果页面:
<script th:inline="javascript">
var username = "zhuoqianmingyue";
</script>复制代码
咱们能够经过在 style 标签上声明 th:inline="css" 来开启在css中使用内联的操做,具体操做方式以下:
<style th:inline="css">
...
</style>复制代码
例如,假设咱们将两个变量设置为两个不一样的String值:classname = 'main elems'align = 'center'咱们能够像如下同样使用它们:
<style th:inline="css">
.[[${classname}]] {
text-align: [[${align}]];
}
</style>复制代码
结果页面:
<style th:inline="css">
.main\ elems {
text-align: center;
}
</style>复制代码
SpringBoot2.0 使用模版模版布局须要先引入 thymeleaf的 thymeleaf-layout-dialect依赖
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>复制代码
定义footer.html页面 该页面就是咱们的引用片断代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div th:fragment="copy">
© 2011 The Good Thymes Virtual Grocery
</div>
</body>
</html>复制代码
咱们能够经过 th:fragment 来定义引用片断,而后能够在其余页面进行引用。
定义引用页面 index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div th:insert="~{footer :: copy}"></div>
</body>
</html>复制代码
经过 th:insert 和 ~{...}片断引用表达式 进行引入footer.html中定义的片断
定义访问index页面的 controller
@Controller
@RequestMapping("/layout")
public class LayOutController {
@RequestMapping("/index")
public String index(){
return "/layout/index";
}
}复制代码
进行测试http://localhost:8090/sbe/layout/index结果页面:
<div>
<div>
© 2011 The Good Thymes Virtual Grocery
</div>
</div>复制代码
以下面的代码2种方式的写法是一致的。若是你以为~{footer :: copy}写法比较麻烦能够采用简写的方式footer :: copy。
<div th:insert="footer :: copy"></div>
<div th:insert="~{footer :: copy}"></div>复制代码
咱们能够经过 th:fragment 来定义引用片断,可是咱们也能够经过在引用片断代码上声明id属性的方式进行片断的引用,具体操做方式以下:
定义引用片断代码模版页面 footer.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="copy-section" >
© 2011 The Good Thymes Virtual Grocery
</div>
</body>
</html>复制代码
引用引用片断的模版页面:index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div th:insert="~{footer :: #copy-section}"></div>
</body>
</html>复制代码
结果页面:
<div>
<div id="copy-section">
© 2011 The Good Thymes Virtual Grocery
</div>
</div>复制代码
footer :: #copy-section和~{footer :: #copy-section} 结果是一致的。
th:insertjava代码:
@Controller
@RequestMapping("/layout")
public class LayoutController {
@RequestMapping("/index2")
public String index2(Model model) {
return "/layout/index2";
}
}复制代码
声明引用片断模版页面:footer2.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<footer th:fragment="copy">
© 2011 The Good Thymes Virtual Grocery
</footer>
</body>
</html>复制代码
引用片断模版页面:index2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div th:insert="footer2 :: copy"></div>
<div th:replace="footer2 :: copy"></div>
<div th:include="footer2:: copy"></div>
</body>
</html>复制代码
---th:insert 结果:
<div>
<footer>
© 2011 The Good Thymes Virtual Grocery
</footer>
</div>复制代码
---th:replace结果:
<footer>
© 2011 The Good Thymes Virtual Grocery
</footer>复制代码
---th:include结果:
<div>
© 2011 The Good Thymes Virtual Grocery
</div>复制代码
定义引用片断代码模版页面 footer.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div th:fragment="frag (onevar,twovar)">
<p th:text="${onevar} + ' - ' + ${twovar}">...</p>
</div>
</body>
</html>复制代码
引用引用片断的模版页面:index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div th:insert="footer :: frag('a','b')"></div>
</body>
</html>复制代码
结果页面:
<div>
<div>
<p>a - b</p>
</div>
</div>复制代码
th:insert="footer ::frag (onevar='a',twovar='b')" 和th:insert="footer :: frag('a','b')效果是相等的。还有另外一种写法就是使用th:withth:insert="::frag" th:with="onevar='a',twovar='b'"
咱们为了方便经过直接查看下面的页面 productList.html (主要是为了做为原型页面进行查看)咱们须要添加一些模拟数据。
<table>
<tr>
<th>NAME</th>
<th>PRICE</th>
<th>IN STOCK</th>
<th>COMMENTS</th>
</tr>
<tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
<td>
<span th:text="${#lists.size(prod.comments)}">2</span> comment/s
<a href="comments.html"
th:href="@{/product/comments(prodId=${prod.id})}"
th:unless="${#lists.isEmpty(prod.comments)}">view</a>
</td>
</tr>
<tr class="odd">
<td>Blue Lettuce</td>
<td>9.55</td>
<td>no</td>
<td>
<span>0</span> comment/s
</td>
</tr>
<tr>
<td>Mild Cinnamon</td>
<td>1.99</td>
<td>yes</td>
<td>
<span>3</span> comment/s
<a href="comments.html">view</a>
</td>
</tr>
</table>复制代码
在上面的代码中模拟数据的代码,可是咱们经过正常的controller访问该页面的时候会显示出下面的模拟数据。
<tr class="odd">
<td>Blue Lettuce</td>
<td>9.55</td>
<td>no</td>
<td>
<span>0</span> comment/s
</td>
</tr>
<tr>
<td>Mild Cinnamon</td>
<td>1.99</td>
<td>yes</td>
<td>
<span>3</span> comment/s
<a href="comments.html">view</a>
</td>
</tr>复制代码
咱们直接查看该页面的效果以下:
经过url访问查看该页面的效果:
thymeleaf 为咱们提供了 th:remove 帮助咱们解决这个问题:
<tr class="odd" th:remove="all">
<td>Blue Lettuce</td>
<td>9.55</td>
<td>no</td>
<td>
<span>0</span> comment/s
</td>
</tr>
<tr th:remove="all">
<td>Mild Cinnamon</td>
<td>1.99</td>
<td>yes</td>
<td>
<span>3</span> comment/s
<a href="comments.html">view</a>
</td>
</tr>
复制代码
咱们在模拟数据上声明th:remove="all" 后在此经过url访问 没有了咱们以前的模拟数据
直接查看该页面仍是能够查看到咱们的模拟数据的。
all属性中的这个值是什么意思?th:remove能够根据其价值以五种不一样的方式表现:
当咱们知道没有属性的含义后咱们能够经过在 声明一次便可,无需在经过定义多个 th:remove="all"
处理日期数据 生成,转换,获取日期的具体天数 年数。
代码演示:
java代码:
@RequestMapping("/dates")
public String dates(Model model) throws ParseException{
Date date = new Date();
model.addAttribute("date",date);
String dateStr = "2018-05-30";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date2 = sdf.parse(dateStr);
Date[] datesArray = new Date[2];
datesArray[0] = date;
datesArray[1] = date2;
model.addAttribute("datesArray",datesArray);
List<Date> datesList = new ArrayList<Date>();
datesList.add(date);
datesList.add(date2);
model.addAttribute("datesList",datesList);
return "/course/dates";
}复制代码
format操做
java代码:
Date date = new Date();复制代码
模版页面:
<span th:text="${#dates.format(date)}">4564546</span>复制代码
结果页面:
<span>2019年5月30日 上午10时03分24秒 </span>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<span th:text="${#dates.format(date, 'dd/MMM/yyyy HH:mm')}">4564546</span>复制代码
结果页面:
<span>30/五月/2019 10:03 </span>复制代码
---java代码:
Date[] datesArray = new Date[2];
datesArray[0] = date;
datesArray[1] = date2;复制代码
模版页面:
<p th:text="${#dates.format(datesArray, 'yyyy-MM-dd HH:mm')}"></p>复制代码
结果页面:
<p>2019-05-30 10:03</p>复制代码
不知为什么这里只是取出了一个日期数据
---java代码:
List<Date> datesList = new ArrayList<Date>();
datesList.add(date);
datesList.add(date2);
model.addAttribute("datesList",datesList);复制代码
模版页面:
<p th:text="${#dates.listFormat(datesList, 'dd/MMM/yyyy HH:mm')}"></p>复制代码
结果页面:
<p>[30/五月/2019 10:03, 30/五月/2018 00:00]</p>复制代码
获取日期属性操做java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.day(date)} "></p>复制代码
结果页面:
<p>30</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.month(date)}"></p>复制代码
结果页面:
<p>5</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.monthName(date)}"></p>复制代码
结果页面:
<p>五月</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.monthNameShort(date)} "></p> 复制代码
结果页面:
<p>五月</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.year(date)}"></p>复制代码
结果页面:
<p>2019</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.dayOfWeek(date)}"></p> 复制代码
结果页面:
<p>5</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.dayOfWeekName(date)}"></p> 复制代码
结果页面:
<p>星期四</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.dayOfWeekNameShort(date)}"></p>复制代码
结果页面:
<p>星期四</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.hour(date)}"></p>复制代码
结果页面:
<p>10</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.minute(date)}"></p>复制代码
结果页面:
<p>10</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.second(date)}"></p>复制代码
结果页面:
<p>45</p>复制代码
---java代码:
Date date = new Date();复制代码
模版页面:
<p th:text="${#dates.millisecond(date)} "></p>复制代码
结果页面:
<p>853</p>复制代码
生成日期操做
模版页面:
<p th:text="${#dates.createNow()}"></p>复制代码
结果页面:
<p>Thu May 30 10:15:55 CST 2019</p>复制代码
---模版页面:
<p th:text="${#dates.format(#dates.createNow())}"></p>复制代码
结果页面:
<p>2019年5月30日 上午10时15分55秒</p>复制代码
---模版页面:
<p th:text="${#dates.create('2019','05','30')}"></p>复制代码
结果页面:
<p>Thu May 30 00:00:00 CST 2019</p>复制代码
---模版页面:
<p th:text="${#dates.create('2019','05','31','10','18')}"></p>复制代码
结果页面:
<p>Fri May 31 10:18:00 CST 2019</p>复制代码
---模版页面:
<p th:text="${#dates.create('2019','05','30','10','18','34')}"></p>复制代码
结果页面:
<p>Thu May 30 10:18:34 CST 2019</p>复制代码
---模版页面:
<p th:text="${#dates.createToday()}"></p>复制代码
结果页面:
<p>Thu May 30 00:00:00 CST 2019</p>复制代码
处理数字数据的转换。包括:
代码演示:
@RequestMapping("/numbers")
public String numbers(Model model) throws ParseException{
return "/course/numbers";
}复制代码
数字进行补0操做
模板代码:
<p th:text="${#numbers.formatInteger('123',4)}"></p>复制代码
结果页面:
<p>0123</p>复制代码
---模板代码:
<p th:text="${#numbers.formatInteger('123',3)}"></p>复制代码
结果页面:
<p>123</p>复制代码
---模板代码:
<p th:text="${#numbers.formatInteger('123',2)}"></p>复制代码
结果页面:
<p>123</p>复制代码
---Java代码
@RequestMapping("/numbers")
public String numbers(Model model) throws ParseException{
List<Integer> numList = new ArrayList<Integer>();
numList.add(1);
numList.add(12);
numList.add(13);
model.addAttribute("numList",numList);
return "/course/numbers";
}复制代码
模板代码:
<p th:text="${#numbers.listFormatInteger(numList,3)}"></p>复制代码
结果页面:
<p>[001, 012, 013]</p>复制代码
千位分隔符操做模板代码:
<p th:text="${#numbers.formatInteger('1000',2,'POINT')}"></p>复制代码
结果页面:
<p>1.000</p>复制代码
---模板代码:
<p th:text="${#numbers.formatInteger('1000',6,'POINT')}"></p>复制代码
结果页面:
<p>001.000</p>复制代码
---模板代码:
<p th:text="${#numbers.formatInteger('1000',7,'POINT')}"></p>复制代码
结果页面:
<p>0.001.000</p>复制代码
---模板代码:
<p th:text="${#numbers.formatInteger('1000',2,'COMMA')}"></p>复制代码
结果页面:
<p>1,000</p>复制代码
---模板代码:
<p th:text="${#numbers.formatInteger('1000',2,'WHITESPACE')}"></p>复制代码
结果页面:
<p>1 000</p>复制代码
---模板代码:
<p th:text="${#numbers.formatInteger('1000',2,'NONE')}"></p>复制代码
结果页面:
<p>1000</p>复制代码
---模板代码:
<p th:text="${#numbers.formatInteger('1000',2,'DEFAULT')}"></p>复制代码
结果页面:
<p>1,000</p>复制代码
精确小数点操做模板代码:
<p th:text="${#numbers.formatDecimal('10.123',3,2)}"></p>复制代码
结果页面:
<p>010.12</p>复制代码
---模板代码:
<p th:text="${#numbers.formatDecimal('1000.123',5,'POINT',2,'COMMA')}"></p>复制代码
结果页面:
<p>01.000,12</p>复制代码
钱显示符号操做
模板代码:
<p th:text="${#numbers.formatCurrency('1000')}"></p>复制代码
结果页面:
<p>¥1,000.00</p>复制代码
百分比操做模板代码:
<p th:text="${#numbers.formatPercent('0.2',2, 4)}"></p>复制代码
结果页面:
<p>20.0000%</p>复制代码
---模板代码:
<p th:text="${#numbers.formatPercent('0.2',3, 2)}"></p>复制代码
结果页面:
<p>020.00%</p>复制代码
生成数组操做
模板代码:
<div th:each="num : ${#numbers.sequence(0,4)}" >
<p th:text="${num}"></p>
</div>复制代码
结果页面:
<div><p>0</p></div>
<div><p>1</p></div>
<div><p>2</p></div>
<div><p>3</p></div>
<div><p>4</p></div>复制代码
---模板代码:
<div th:each="num : ${#numbers.sequence(0,4,1)}" >
<p th:text="${num}"></p>
</div>复制代码
结果页面:
<div><p>0</p></div>
<div><p>1</p></div>
<div><p>2</p></div>
<div><p>3</p></div>
<div><p>4</p></div>复制代码
---模板代码:
<div th:each="num : ${#numbers.sequence(0,10,2)}" >
<p th:text="${num}"></p>
</div>复制代码
结果页面:
<div><p>0</p></div>
<div><p>2</p></div>
<div><p>4</p></div>复制代码
处理String的相关操做,包括:
代码演示:java 代码
@RequestMapping("/strings")
public String strings(Model model){
Object object = "123";
model.addAttribute("object",object);
List<Integer> numList = new ArrayList<Integer>();
numList.add(1);
numList.add(12);
numList.add(13);
model.addAttribute("numList",numList);
}复制代码
Java代码
Object object = "123";复制代码
模板代码:
<p th:text="${object}"></p>复制代码
结果页面:
<p>123</p>复制代码
toString操做
Java代码
Object object = "123";复制代码
模板代码:
<p th:text="${#strings.toString(object)}"></p>复制代码
结果页面:
<p>123</p>复制代码
---Java代码
List<Integer> numList = new ArrayList<Integer>();
numList.add(1);
numList.add(12);
numList.add(13);复制代码
模板代码:
<p th:text="${#strings.toString(numList)}"></p>复制代码
结果页面:
<p>[1, 12, 13]</p>复制代码
isEmpty操做Java代码
String name = null;复制代码
模板代码:
<p th:text="${#strings.isEmpty(name)}"></p>复制代码
结果页面:
<p>true</p>复制代码
---Java代码
List<String> nameList = new ArrayList<String>();
nameList.add("1");
nameList.add(null);复制代码
模板代码:
<p th:text="${#strings.listIsEmpty(nameList)}"></p>复制代码
结果页面:
<p>[false, true]</p>复制代码
---Java代码
Set<String> nameSet = new HashSet<String>();
nameSet.add(null);
nameSet.add("1");复制代码
模板代码:
<p th:text="${#strings.setIsEmpty(nameSet)}"></p>复制代码
结果页面:
<p>[true, false]</p>复制代码
defaultString操做Java代码
String name = null;复制代码
模板代码:
<p th:text="${#strings.defaultString(text,'该值为null')}"></p>复制代码
结果页面:
<p>该值为null</p>复制代码
---Java代码
List<String> nameList = new ArrayList<String>();
nameList.add("1");
nameList.add(null);复制代码
模板代码:
<p th:text="${#strings.listDefaultString(textList,'该值为null')}"></p>复制代码
结果页面:
<p>[abc, 该值为null]</p>复制代码
contains操做模板代码:
<p th:text="${#strings.contains('abcez','ez')}"></p>复制代码
结果页面:
<p>true</p>复制代码
---模板代码:
<p th:text="${#strings.containsIgnoreCase('abcEZ','ez')}"></p>复制代码
结果页面:
<p>true</p>复制代码
startsWith endsWith 操做
模板代码:
<p th:text="${#strings.startsWith('Donabcez','Don')}"></p>复制代码
结果页面:
<p>true</p>复制代码
---模板代码:
<p th:text="${#strings.endsWith('Donabcezn','n')}"></p> 复制代码
结果页面:
<p>true</p>复制代码
indexOf操做模板代码:
<p th:text="${#strings.indexOf('abcefg','e')}"></p> 复制代码
结果页面:
<p>3</p>复制代码
substring操做模板代码:
<p th:text="${#strings.substring('abcefg',3,5)}"></p> 复制代码
结果页面:
<p>ef</p>复制代码
replace操做模板代码:
<p th:text="${#strings.replace('lasabce','las','ler')}"></p>复制代码
结果页面:
<p>lerabce</p>复制代码
prepend操做模板代码:
<p th:text="${#strings.prepend('abc','012')}"></p>复制代码
结果页面:
<p>012abc</p>复制代码
append操做模板代码:
<p th:text="${#strings.append('abc','456')}"></p>复制代码
结果页面:
<p>abc456</p>复制代码
toUpperCase操做模板代码:
<p th:text="${#strings.toUpperCase('abc')}"></p>复制代码
结果页面:
<p>ABC</p>复制代码
toLowerCase操做模板代码:
<p th:text="${#strings.toLowerCase('ABC')}"></p> 复制代码
结果页面:
<p>abc</p>复制代码
length操做模板代码:
<p th:text="${#strings.length('abc')}"></p>复制代码
结果页面:
<p>3</p>复制代码
trim操做模板代码:
<p th:text="${#strings.trim(' abc ')}"></p>复制代码
结果页面:
<p>abc</p>复制代码
abbreviate操做模板代码:
<p th:text="${#strings.abbreviate('12345678910',10)}"></p>复制代码
结果页面:
<p>1234567...</p>复制代码
#objects
处理Object对象的操做 包含obj不为空返回改值若是为空返回默认值(nullSafe)java代码
@RequestMapping("/objects")
public String objects(Model model){
Object obj = null;
model.addAttribute("obj",obj);
}复制代码
模板代码:
<p th:text="${#objects.nullSafe(obj,'该对象为null')}"></p>复制代码
结果页面:
<p>该对象为null</p>复制代码
判断对象是否为ture或者是否为false的操做。
isTrue操做模板代码:
<p th:text="${#bools.isTrue(true)} "></p>复制代码
结果页面:
<p>true</p>复制代码
---模板代码:
<p th:text="${#bools.isTrue(false)} "></p>复制代码
结果页面:
<p>false</p>复制代码
---模板代码:
<p th:text="${#bools.isTrue('on')} "></p>复制代码
结果页面:
<p>true</p>复制代码
---模板代码:
<p th:text="${#bools.isTrue('off')} "></p>复制代码
结果页面:
<p>false</p>复制代码
---模板代码:
<p th:text="${#bools.isTrue('true')} "></p>复制代码
结果页面:
<p>true</p>复制代码
---模板代码:
<p th:text="${#bools.isTrue('false')} "></p>复制代码
结果页面:
<p>false</p>复制代码
模板代码:
<p th:text="${#bools.isTrue(1)} "></p>复制代码
结果页面:
<p>true</p>复制代码
---模板代码:
<p th:text="${#bools.isTrue(0)} "></p>复制代码
结果页面:
<p>false</p>复制代码
处理数组的相关操做的内置对象,包含:
其中 toStringArray 等操做接受的是Object对象,containsAll 接受一批元素支持数组和集合的参数。
toStringArray操做java代码
@RequestMapping("/arrays")
public String arrays(Model model){
List<String> object = new ArrayList<String>();
object.add("1");
object.add("2");
model.addAttribute("object",object);
}复制代码
模板代码:
<p th:text="${#arrays.toStringArray(object)} "></p>复制代码
结果页面:
<p>[Ljava.lang.String;@3cca655d</p>复制代码
length操做java代码
Integer[] array = {1,2,3};复制代码
模板代码:
<p th:text="${#arrays.length(array)} "></p>复制代码
结果页面:
<p>3</p>复制代码
isEmpty操做java代码
Integer[] array = {1,2,3};复制代码
模板代码:
<p th:text="${#arrays.isEmpty(array)} "></p>复制代码
结果页面:
<p>false</p>复制代码
contains操做java代码
Integer[] array = {1,2,3};复制代码
模板代码:
<p th:text="${#arrays.contains(array,1)} "></p>复制代码
结果页面:
<p>true</p>复制代码
containsAll操做java代码
Integer[] array = {1,2,3};
Integer[] array2 = {1,3};复制代码
模板代码:
<p th:text="${#arrays.containsAll(array,array2)} "></p>复制代码
结果页面:
<p>true</p>复制代码
处理 list 相关操做的内置对象,包括:
java代码
@RequestMapping("/lists")
public String lists(Model model){
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(3);
list.add(2);
model.addAttribute("list",list);
}复制代码
模板代码:
<p th:text="${#lists.size(list)} "></p>复制代码
结果页面:
<p>3</p>复制代码
---java代码:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(3);
list.add(2);复制代码
模板代码:
<p th:text="${#lists.isEmpty(list)} "></p>复制代码
结果页面:
<p>false</p>
复制代码
---java代码:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(3);
list.add(2);复制代码
模板代码:
<p th:text="${#lists.contains(list, 1)}"></p>复制代码
结果页面:
<p>true</p>复制代码
---java代码:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(3);
list.add(2);
List<Integer> list2 = new ArrayList<Integer>();
list2.add(1);
list2.add(2);复制代码
模板代码:
<!-- elements 能够是数组 集合 list -->
<p th:text="${#lists.containsAll(list,list2)}"></p>复制代码
结果页面:
<p>true</p>复制代码
---java代码:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(3);
list.add(2);复制代码
模板代码:
<p th:text="${#lists.sort(list)}"></p>复制代码
结果页面:
<p>[1, 2, 3]</p>复制代码
处理 set 相关操做的内置对象,包括:
size操做
java代码
@RequestMapping("/sets")
public String sets(Model model){
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
model.addAttribute("set",set);
}复制代码
模板代码:
<p th:text="${#sets.size(set)} "></p>复制代码
结果页面:
<p>3</p>
复制代码
isEmpty 操做
java代码:
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);复制代码
模板代码:
<p th:text="${#sets.isEmpty(set)} "></p>复制代码
结果页面:
<p>false</p>
复制代码
contains操做
java代码:
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);复制代码
模板代码:
<p th:text="${#sets.contains(set, 1)}"></p>复制代码
结果页面:
<p>true</p>
复制代码
containsAll操做
java代码
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
Integer[] elements = {1,2};
model.addAttribute("elements",elements);复制代码
模板代码:
<p th:text="${#sets.containsAll(set, elements)}"></p>复制代码
结果页面:
<p>true</p>
复制代码
sort操做
java代码:
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);复制代码
模板代码:
<p th:text="${#lists.sort(list)}"></p>复制代码
结果页面:
<p>[1, 2, 3]</p>
复制代码
处理 map相关操做的内置对象,包括:
java代码:
@RequestMapping("/maps")
public String maps(Model model){
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("1",1);
map.put("2",2);
map.put("3",3);
model.addAttribute("map",map);
}复制代码
模板代码:
<p th:text="${#maps.size(map)} "></p>复制代码
结果页面:
<p>3</p>复制代码
---java代码:
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("1",1);
map.put("2",2);
map.put("3",3);复制代码
模板代码:
<p th:text="${#maps.isEmpty(map)} "></p>复制代码
结果页面:
<p>false</p>复制代码
java代码:
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("1",1);
map.put("2",2);
map.put("3",3);复制代码
模板代码:
<p th:text="${#maps.containsKey(map, '1')}"></p>复制代码
结果页面:
<p>true</p>复制代码
java代码:
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("1",1);
map.put("2",2);
map.put("3",3);
String[] keys = {"1","2"};
model.addAttribute("keys",keys);复制代码
模板代码:
<!-- keys 能够是数组能够是集合 -->
<p th:text="${#maps.containsAllKeys(map, keys)}"></p>复制代码
结果页面:
<p>true</p>复制代码
---java代码:
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("1",1);
map.put("2",2);
map.put("3",3);复制代码
模板代码:
<p th:text="${#maps.containsValue(map, 2)}"></p>复制代码
结果页面:
<p>true</p>复制代码
java代码:
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("1",1);
map.put("2",2);
map.put("3",3);
Integer[] values = {1,2};
model.addAttribute("values",values);复制代码
模板代码:
<!-- values 能够是数组能够是集合 -->
<p th:text="${#maps.containsAllValues(map, values)}"></p>复制代码
结果页面:
<p>true</p>复制代码
用户处理集合或者数组的一些统计操做,包括:
求和操做
java代码:
@RequestMapping("/aggregates")
public String aggregates(Model model){
Integer[] array = {1,2,3,4};
model.addAttribute("array",array);
return "/course/aggregates";
}复制代码
模板代码:
<p th:text="${#aggregates.sum(array)} "></p>复制代码
结果页面:
<p>10</p>复制代码
java代码:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);复制代码
模板代码:
<p th:text="${#aggregates.sum(list)} "></p>复制代码
结果页面:
<p>10</p>复制代码
求平均值操做
java代码:
Integer[] array = {1,2,3,4};复制代码
模板代码:
<p th:text="${#aggregates.avg(array)} "></p>复制代码
结果页面:
<p>2.5</p>复制代码
---
java代码:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);复制代码
模板代码:
<p th:text="${#aggregates.avg(list)} "></p>复制代码
结果页面:
<p>2.5</p>复制代码
本文主要介绍 Thymeleaf 的基础用法、内联、模板布局、预约义的工具对象。总体来看Thymeleaf 使用语法仍是很强大的,可是我这里不会强烈安利你使用 Thymeleaf,正如 Thymeleaf 官方所说:“不管如何,比较技术的最好方法是本身使用它们,并感受哪一个最适合你!” 你一样能够选择使用 Velocity 或 FreeMarker。
具体代码示例请查看个人GitHub 仓库 springbootexamples 中的 spring-boot-2.x-thymeleaf 下的 course 包下查看。
GitHub:https://github.com/zhuoqianmingyue/springbootexamples
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
https://blog.csdn.net/liubin5620/article/details/80470619