Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Thymeleaf3Óï·¨Ïê½âºÍʵս
 
  2536  次浏览      27
 2019-10-10
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚcnblogs£¬±¾ÎÄÖ÷Òª´ÓThymeleafµÄ³£ÓÃthÊôÐÔÒÔ¼°±ê×¼±í´ïʽÓï·¨£¬ÔÚSpringBootÓ¦ÓÃThymeleafÈý·½Ãæ½éÉÜÁËThymeleafµÄÓï·¨ £¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£

Thymeleaf3Óï·¨Ïê½â

ThymeleafÊÇSpring bootÍÆ¼öʹÓõÄÄ£°æÒýÇæ£¬³ý´ËÖ®Íâ³£¼ûµÄ»¹ÓÐFreemarkerºÍJsp¡£JspÓ¦¸ÃÊÇÎÒÃÇ×îÔç½Ó´¥µÄÄ£°æÒýÇæ¡£¶øFreemarker¹¤×÷ÖÐÒ²ºÜ³£¼û£¨Freemarker½Ì³Ì£©¡£½ñÌìÎÒÃÇ´ÓÈý¸ö·½ÃæÑ§Ï°ThymeleafµÄÓï·¨£ºÓг£¼ûµÄTHÊôÐÔ£¬ËÄÖÖ±ê×¼±í´ïʽÓ÷¨£¬ÔÚSpringBootÖеÄÓ¦Ó᣻¹ÔÚµÈʲô£¬Ò»ÆðÀ´Ñ§°É£¡

¼¼Êõ£ºThymeleaf£¬SpringBoot

˵Ã÷£ºÎªÍ»³öThymeleaf3µÄÓ﷨֪ʶ£¬ÎÄÕÂÖ»Ìá³öÓëThymeleafÓйصĴúÂ룬ÍêÕû´úÂëÇëÒì²½github£¬Ï²»¶µÄÅóÓÑ¿ÉÒÔµã¸östar£¬Ð·Ð·£¡

Ô´Âë

ÎÄÕÂĿ¼½á¹¹£º

Ò»¡¢thÊôÐÔ

³£ÓÃthÊôÐÔ½â¶Á

htmlÓеÄÊôÐÔ£¬Thymeleaf»ù±¾¶¼ÓУ¬¶ø³£ÓõÄÊôÐÔ´ó¸ÅÓÐÆß°Ë¸ö¡£ÆäÖÐthÊôÐÔÖ´ÐеÄÓÅÏȼ¶´Ó1~8£¬Êý×ÖÔ½µÍÓÅÏȼ¶Ô½¸ß¡£

Ò»¡¢th:text £ºÉèÖõ±Ç°ÔªËصÄÎı¾ÄÚÈÝ£¬Ïàͬ¹¦ÄܵϹÓÐth:utext£¬Á½ÕßµÄÇø±ðÔÚÓÚǰÕß²»»áתÒåhtml±êÇ©£¬ºóÕ߻ᡣÓÅÏȼ¶²»¸ß£ºorder=7

¶þ¡¢th:value£ºÉèÖõ±Ç°ÔªËصÄvalueÖµ£¬ÀàËÆÐÞ¸ÄÖ¸¶¨ÊôÐԵϹÓÐth:src£¬th:href¡£ÓÅÏȼ¶²»¸ß£ºorder=6

Èý¡¢th:each£º±éÀúÑ­»·ÔªËØ£¬ºÍth:text»òth:valueÒ»ÆðʹÓá£×¢Òâ¸ÃÊôÐÔÐÞÊεıêǩλÖã¬ÏêϸÍùºó¿´¡£ÓÅÏȼ¶ºÜ¸ß£ºorder=2

ËÄ¡¢th:if£ºÌõ¼þÅжϣ¬ÀàËÆµÄ»¹ÓÐth:unless£¬th:switch£¬th:case¡£ÓÅÏȼ¶½Ï¸ß£ºorder=3

Îå¡¢th:insert£º´úÂë¿éÒýÈ룬ÀàËÆµÄ»¹ÓÐth:replace£¬th:include£¬ÈýÕßµÄÇø±ð½Ï´ó£¬ÈôʹÓò»Ç¡µ±»áÆÆ»µhtml½á¹¹£¬³£ÓÃÓÚ¹«¹²´úÂë¿éÌáÈ¡µÄ³¡¾°¡£ÓÅÏȼ¶×î¸ß£ºorder=1

Áù¡¢th:fragment£º¶¨Òå´úÂë¿é£¬·½±ã±»th:insertÒýÓá£ÓÅÏȼ¶×îµÍ£ºorder=8

Æß¡¢th:object£ºÉùÃ÷±äÁ¿£¬Ò»°ãºÍ*{}Ò»ÆðÅäºÏʹÓ㬴ﵽ͵ÀÁµÄЧ¹û¡£ÓÅÏȼ¶Ò»°ã£ºorder=4

°Ë¡¢th:attr£ºÐÞ¸ÄÈÎÒâÊôÐÔ£¬Êµ¼Ê¿ª·¢ÖÐÓõĽÏÉÙ£¬ÒòΪÓзḻµÄÆäËûthÊôÐÔ°ïæ£¬ÀàËÆµÄ»¹ÓÐth:attrappend£¬th:attrprepend¡£ÓÅÏȼ¶Ò»°ã£ºorder=5

³£ÓÃthÊôÐÔʹÓÃ

ʹÓÃThymeleafÊôÐÔÐèҪעÒâµãÒÔÏÂÎåµã£º

Ò»¡¢ÈôҪʹÓÃThymeleafÓï·¨£¬Ê×ÏÈÒªÉùÃ÷Ãû³Æ¿Õ¼ä£º xmlns:th="http://www.thymeleaf.org"

¶þ¡¢ÉèÖÃÎı¾ÄÚÈÝ th:text£¬ÉèÖÃinputµÄÖµ th:value£¬Ñ­»·Êä³ö th:each£¬Ìõ¼þÅÐ¶Ï th:if£¬²åÈë´úÂë¿é th:insert£¬¶¨Òå´úÂë¿é th:fragment£¬ÉùÃ÷±äÁ¿ th:object

Èý¡¢th:each µÄÓ÷¨ÐèÒª¸ñÍâ×¢Ò⣬´ò¸ö±È·½£ºÈç¹ûÄãҪѭ»·Ò»¸ödivÖеÄp±êÇ©£¬Ôòth:eachÊôÐÔ±ØÐë·ÅÔÚp±êÇ©ÉÏ¡£ÈôÄ㽫th:eachÊôÐÔ·ÅÔÚdivÉÏ£¬ÔòÑ­»·µÄÊǽ«Õû¸ödiv¡£

ËÄ¡¢±äÁ¿±í´ïʽÖÐÌṩÁ˺ܶàµÄÄÚÖ÷½·¨£¬¸ÃÄÚÖ÷½·¨ÊÇÓÃ#¿ªÍ·£¬Çë²»ÒªÓë#{}ÏûÏ¢±í´ïʽŪ»ì¡£

Îå¡¢th:insert£¬th:replace£¬th:include ÈýÖÖ²åÈë´úÂë¿éµÄЧ¹ûÏàËÆ£¬µ«Çø±ðºÜ´ó¡£

<!DOCTYPE html>
<!--Ãû³Æ¿Õ¼ä-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Thymeleaf Óï·¨</title>
</head>
<body>
<h2>ITDragon Thymeleaf Óï·¨</h2>
<!--th:text ÉèÖõ±Ç°ÔªËصÄÎı¾ÄÚÈÝ£¬³£Óã¬ÓÅÏȼ¶²»¸ß-->
<p th:text="${thText}" />
<p th:utext="${thUText}" />

<!--th:value ÉèÖõ±Ç°ÔªËصÄvalueÖµ£¬³£Óã¬ÓÅÏȼ¶½ö±Èth:text¸ß-->
<input type="text" th:value="${thValue}" />

<!--th:each ±éÀúÁÐ±í£¬³£Óã¬ÓÅÏȼ¶ºÜ¸ß£¬½ö´ËÓÚ´úÂë¿éµÄ²åÈë-->
<!--th:each ÐÞÊÎÔÚdivÉÏ£¬Ôòdiv²ãÖØ¸´³öÏÖ£¬ÈôÖ»Ïëp±êÇ©±éÀú£¬ÔòÐÞÊÎÔÚp±êÇ©ÉÏ-->
<div th:each="message : ${thEach}"> <!-- ±éÀúÕû¸ödiv-p£¬²»ÍƼö-->
<p th:text="${message}" />
</div>
<div> <!--Ö»±éÀúp£¬ÍƼöʹÓÃ-->
<p th:text="${message}" th:each="message : ${thEach}" />
</div>

<!--th:if Ìõ¼þÅжϣ¬ÀàËÆµÄÓÐth:switch£¬th:case£¬ÓÅÏȼ¶½ö´ÎÓÚth:each, ÆäÖÐ#stringsÊDZäÁ¿±í´ïʽµÄÄÚÖ÷½·¨-->
<p th:text="${thIf}" th:if="${not #strings.isEmpty(thIf)}"></p>

<!--th:insert °Ñ´úÂë¿é²åÈ뵱ǰdivÖУ¬ÓÅÏȼ¶×î¸ß£¬ÀàËÆµÄÓÐth:replace£¬th:include£¬~{} £º´úÂë¿é±í´ïʽ -->
<div th:insert="~{grammar/common::thCommon}"></div>

<!--th:object ÉùÃ÷±äÁ¿£¬ºÍ*{} Ò»ÆðʹÓÃ-->
<div th:object="${thObject}">
<p>ID: <span th:text="*{id}" /></p><!--th:text="${thObject.id}"-->
<p>TH: <span th:text="*{thName}" /></p><!--${thObject.thName}-->
<p>DE: <span th:text="*{desc}" /></p><!--${thObject.desc}-->
</div>

</body>
</html>

ºǫ́¸ø¸ºÔð¸ø±äÁ¿¸³Öµ£¬ºÍÌø×ªÒ³Ãæ¡£

import com.itdragon.entities.ThObject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Controller
public class ThymeleafController {

@RequestMapping("thymeleaf")
public String thymeleaf(ModelMap map) {
map.put("thText", "th:text ÉèÖÃÎı¾ÄÚÈÝ <b>¼Ó´Ö</b>");
map.put("thUText", "th:utext ÉèÖÃÎı¾ÄÚÈÝ <b>¼Ó´Ö</b>");
map.put("thValue", "thValue ÉèÖõ±Ç°ÔªËصÄvalueÖµ");
map.put("thEach", Arrays.asList("th:each", "±éÀúÁбí"));
map.put("thIf", "msg is not null");
map.put("thObject", new ThObject(1L, "th:object", "ÓÃÀ´ÍµÀÁµÄthÊôÐÔ"));
return "grammar/thymeleaf";
}
}

¶þ¡¢±ê×¼±í´ïʽÓï·¨

${...} ±äÁ¿±í´ïʽ£¬Variable Expressions

@{...} Á´½Ó±í´ïʽ£¬Link URL Expressions

#{...} ÏûÏ¢±í´ïʽ£¬Message Expressions

~{...} ´úÂë¿é±í´ïʽ£¬Fragment Expressions

*{...} Ñ¡Ôñ±äÁ¿±í´ïʽ£¬Selection Variable Expressions

±äÁ¿±í´ïʽʹÓÃÆµÂÊ×î¸ß£¬Æä¹¦ÄÜÒ²ÊǷdz£µÄ·á¸»¡£ËùÒÔÎÒÃÇÏÈ´Ó¼òµ¥µÄ´úÂë¿é±í´ïʽ¿ªÊ¼£¬È»ºóÊÇÏûÏ¢±í´ïʽ£¬ÔÙÊÇÁ´½Ó±í´ïʽ£¬×îºóÊDZäÁ¿±í´ïʽ£¬Ëæ´ø½éÉÜÑ¡Ôñ±äÁ¿±í´ïʽ¡£

~{...} ´úÂë¿é±í´ïʽ

Ö§³ÖÁ½ÖÖÓï·¨½á¹¹

ÍÆ¼ö£º~{templatename::fragmentname}

Ö§³Ö£º~{templatename::#id}

templatename£ºÄ£°æÃû£¬Thymeleaf»á¸ù¾ÝÄ£°æÃû½âÎöÍêÕû·¾¶£º/resources/templates/templatename.html£¬Òª×¢ÒâÎļþµÄ·¾¶¡£

fragmentname£ºÆ¬¶ÎÃû£¬Thymeleafͨ¹ýth:fragmentÉùÃ÷¶¨Òå´úÂë¿é£¬¼´£ºth:fragment="fragmentname"

id£ºHTMLµÄidÑ¡ÔñÆ÷£¬Ê¹ÓÃʱҪÔÚÇ°Ãæ¼ÓÉÏ#ºÅ£¬²»Ö§³ÖclassÑ¡ÔñÆ÷¡£

´úÂë¿é±í´ïʽµÄʹÓÃ

´úÂë¿é±í´ïʽÐèÒªÅäºÏthÊôÐÔ£¨th:insert£¬th:replace£¬th:include£©Ò»ÆðʹÓá£

th:insert£º½«´úÂë¿éƬ¶ÎÕû¸ö²åÈ뵽ʹÓÃÁËth:insertµÄHTML±êÇ©ÖУ¬

th:replace£º½«´úÂë¿éƬ¶ÎÕû¸öÌæ»»Ê¹ÓÃÁËth:replaceµÄHTML±êÇ©ÖУ¬

th:include£º½«´úÂë¿éƬ¶Î°üº¬µÄÄÚÈݲåÈ뵽ʹÓÃÁËth:includeµÄHTML±êÇ©ÖУ¬

ÓÃÒ»¸ö¹Ù·½Àý×ÓÀ´Çø·ÖÈýÕߵIJ»Í¬£¬µÚÈý²¿·Ö»áͨ¹ýʵսÔÙ´ÎÓõ½¸Ã֪ʶ¡£

<!--th:fragment¶¨Òå´úÂë¿é±êʶ-->
<footer th:fragment="copy">
&copy; 2011 The Good Thymes Virtual Grocery
</footer>

<!--ÈýÖÖ²»Í¬µÄÒýÈ뷽ʽ-->
<div th:insert="footer :: copy"></div>
<div th:replace="footer :: copy"></div>
<div th:include="footer :: copy"></div>

<!--th:insertÊÇÔÚdivÖвåÈë´úÂë¿é£¬¼´¶àÁËÒ»²ãdiv-->
<div>
<footer>
&copy; 2011 The Good Thymes Virtual Grocery
</footer>
</div>
<!--th:replaceÊǽ«´úÂë¿é´úÌæµ±Ç°div£¬Æähtml½á¹¹ºÍ֮ǰһÖÂ-->
<footer>
&copy; 2011 The Good Thymes Virtual Grocery
</footer>
<!--th:includeÊǽ«´úÂë¿éfooterµÄÄÚÈݲåÈëµ½divÖУ¬¼´ÉÙÁËÒ»²ãfooter-->
<div>
&copy; 2011 The Good Thymes Virtual Grocery
</div>

#{...} ÏûÏ¢±í´ïʽ

ÏûÏ¢±í´ïʽһ°ãÓÃÓÚ¹ú¼Ê»¯µÄ³¡¾°¡£½á¹¹£ºth:text="#{msg}" ¡£»áÔÚµÚÈý²¿·ÖµÄʵսÏêϸ½éÉÜ¡£

@{...} Á´½Ó±í´ïʽ

Á´½Ó±í´ïʽºÃ´¦

²»¹ÜÊǾ²Ì¬×ÊÔ´µÄÒýÓã¬form±íµ¥µÄÇëÇ󣬷²ÊÇÁ´½Ó¶¼¿ÉÒÔÓÃ@{...} ¡£ÕâÑù¿ÉÒÔ¶¯Ì¬»ñÈ¡ÏîĿ·¾¶£¬¼´±ãÏîÄ¿Ãû±äÁË£¬ÒÀÈ»¿ÉÒÔÕý³£·ÃÎÊ

#ÐÞ¸ÄÏîÄ¿Ãû£¬Á´½Ó±í´ïʽ»á×Ô¶¯Ð޸ķ¾¶£¬±ÜÃâ×ÊÔ´ÎļþÕÒ²»µ½
server.context-path=/itdragon

Á´½Ó±í´ïʽ½á¹¹

Î޲Σº@{/xxx}

ÓвΣº@{/xxx(k1=v1,k2=v2)} ¶ÔÓ¦url½á¹¹£ºxxx?k1=v1&k2=v2

ÒýÈë±¾µØ×ÊÔ´£º@{/ÏîÄ¿±¾µØµÄ×ÊԴ·¾¶}

ÒýÈëÍⲿ×ÊÔ´£º@{/webjars/×ÊÔ´ÔÚjar°üÖеÄ·¾¶}

Áо٣ºµÚÈý²¿·ÖµÄʵսÒýÓûáÏêϸʹÓøñí´ïʽ

<link th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.css}" rel="stylesheet">
<link th:href="@{/main/css/itdragon.css}" rel="stylesheet">
<form class="form-login" th:action="@{/user/login}" th:method="post" >
<a class="btn btn-sm" th:href="@{/login.html(l='zh_CN')}">ÖÐÎÄ</a>
<a class="btn btn-sm" th:href="@{/login.html(l='en_US')}">English</a>

${...}±äÁ¿±í´ïʽ

±äÁ¿±í´ïʽÓзḻµÄÄÚÖ÷½·¨£¬Ê¹Æä¸üÇ¿´ó£¬¸ü·½±ã¡£

±äÁ¿±í´ïʽ¹¦ÄÜ

Ò»¡¢¿ÉÒÔ»ñÈ¡¶ÔÏóµÄÊôÐԺͷ½·¨

¶þ¡¢¿ÉÒÔʹÓÃctx£¬vars£¬locale£¬request£¬response£¬session£¬servletContextÄÚÖöÔÏó

Èý¡¢¿ÉÒÔʹÓÃdates£¬numbers£¬strings£¬objects£¬arrays£¬lists£¬sets£¬mapsµÈÄÚÖ÷½·¨£¨Öصã½éÉÜ£©

³£ÓõÄÄÚÖöÔÏó

Ò»¡¢ctx £ºÉÏÏÂÎĶÔÏó¡£

¶þ¡¢vars £ºÉÏÏÂÎıäÁ¿¡£

Èý¡¢locale£ºÉÏÏÂÎĵÄÓïÑÔ»·¾³¡£

ËÄ¡¢request£º£¨½öÔÚwebÉÏÏÂÎÄ£©µÄ HttpServletRequest ¶ÔÏó¡£

Îå¡¢response£º£¨½öÔÚwebÉÏÏÂÎÄ£©µÄ HttpServletResponse ¶ÔÏó¡£

Áù¡¢session£º£¨½öÔÚwebÉÏÏÂÎÄ£©µÄ HttpSession ¶ÔÏó¡£

Æß¡¢servletContext£º£¨½öÔÚwebÉÏÏÂÎÄ£©µÄ ServletContext ¶ÔÏó

ÕâÀïÒÔ³£ÓõÄSession¾ÙÀý£¬Óû§¿¯µÇ³É¹¦ºó£¬»á°ÑÓû§ÐÅÏ¢·ÅÔÚSessionÖУ¬Thymeleafͨ¹ýÄÚÖöÔÏó½«Öµ´ÓsessionÖлñÈ¡¡£

// java ´úÂ뽫Óû§Ãû·ÅÔÚsessionÖÐ
session.setAttribute("userinfo",username);
// Thymeleafͨ¹ýÄÚÖöÔÏóÖ±½Ó»ñÈ¡
th:text="${session.userinfo}"

³£ÓõÄÄÚÖ÷½·¨

Ò»¡¢strings£º×Ö·û´®¸ñʽ»¯·½·¨£¬³£ÓõÄJava·½·¨Ëü¶¼ÓС£±ÈÈ磺equals£¬equalsIgnoreCase£¬length£¬trim£¬toUpperCase£¬toLowerCase£¬indexOf£¬substring£¬replace£¬startsWith£¬endsWith£¬contains£¬containsIgnoreCaseµÈ

¶þ¡¢numbers£ºÊýÖµ¸ñʽ»¯·½·¨£¬³£Óõķ½·¨ÓУºformatDecimalµÈ

Èý¡¢bools£º²¼¶û·½·¨£¬³£Óõķ½·¨ÓУºisTrue£¬isFalseµÈ

ËÄ¡¢arrays£ºÊý×é·½·¨£¬³£Óõķ½·¨ÓУºtoArray£¬length£¬isEmpty£¬contains£¬containsAllµÈ

Îå¡¢lists£¬sets£º¼¯ºÏ·½·¨£¬³£Óõķ½·¨ÓУºtoList£¬size£¬isEmpty£¬contains£¬containsAll£¬sortµÈ

Áù¡¢maps£º¶ÔÏó·½·¨£¬³£Óõķ½·¨ÓУºsize£¬isEmpty£¬containsKey£¬containsValueµÈ

Æß¡¢dates£ºÈÕÆÚ·½·¨£¬³£Óõķ½·¨ÓУºformat£¬year£¬month£¬hour£¬createNowµÈ

ÎÄÕµײ¿ÌṩÁ˶ÔÓ¦µÄ¹ÙÍøÁ´½Ó

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>ITDragon Thymeleaf ÄÚÖ÷½·¨</title>
</head>
<body>
<h2>ITDragon Thymeleaf ÄÚÖ÷½·¨</h2>
<h3>#strings </h3>
<div th:if="${not #strings.isEmpty(itdragonStr)}" >
<p>Old Str : <span th:text="${itdragonStr}"/></p>
<p>toUpperCase : <span th:text="${#strings.toUpperCase(itdragonStr)}"/></p>
<p>toLowerCase : <span th:text="${#strings.toLowerCase(itdragonStr)}"/></p>
<p>equals : <span th:text="${#strings.equals(itdragonStr, 'itdragonblog')}"/></p>
<p>equalsIgnoreCase : <span th:text="${#strings.equalsIgnoreCase(itdragonStr, 'itdragonblog')}"/></p>
<p>indexOf : <span th:text="${#strings.indexOf(itdragonStr, 'r')}"/></p>
<p>substring : <span th:text="${#strings.substring(itdragonStr, 2, 8)}"/></p>
<p>replace : <span th:text="${#strings.replace(itdragonStr, 'it', 'IT')}"/></p>
<p>startsWith : <span th:text="${#strings.startsWith(itdragonStr, 'it')}"/></p>
<p>contains : <span th:text="${#strings.contains(itdragonStr, 'IT')}"/></p>
</div>

<h3>#numbers </h3>
<div>
<p>formatDecimal ÕûÊý²¿·ÖËæÒ⣬СÊýµãºó±£ÁôÁ½Î»£¬ËÄÉáÎåÈë: <span th:text="${#numbers.formatDecimal(itdragonNum, 0, 2)}"/></p>
<p>formatDecimal ÕûÊý²¿·Ö±£ÁôÎåλÊý£¬Ð¡Êýµãºó±£ÁôÁ½Î»£¬ËÄÉáÎåÈë: <span th:text="${#numbers.formatDecimal(itdragonNum, 5, 2)}"/></p>
</div>

<h3>#bools </h3>
<div th:if="${#bools.isTrue(itdragonBool)}">
<p th:text="${itdragonBool}"></p>
</div>

<h3>#arrays </h3>
<div th:if="${not #arrays.isEmpty(itdragonArray)}">
<p>length : <span th:text="${#arrays.length(itdragonArray)}"/></p>
<p>contains : <span th:text="${#arrays.contains(itdragonArray, 5)}"/></p>
<p>containsAll : <span th:text="${#arrays.containsAll(itdragonArray, itdragonArray)}"/></p>
</div>
<h3>#lists </h3>
<div th:if="${not #lists.isEmpty(itdragonList)}">
<p>size : <span th:text="${#lists.size(itdragonList)}"/></p>
<p>contains : <span th:text="${#lists.contains(itdragonList, 0)}"/></p>
<p>sort : <span th:text="${#lists.sort(itdragonList)}"/></p>
</div>
<h3>#maps </h3>
<div th:if="${not #maps.isEmpty(itdragonMap)}">
<p>size : <span th:text="${#maps.size(itdragonMap)}"/></p>
<p>containsKey : <span th:text="${#maps.containsKey(itdragonMap, 'thName')}"/></p>
<p>containsValue : <span th:text="${#maps.containsValue(itdragonMap, '#maps')}"/></p>
</div>
<h3>#dates </h3>
<div>
<p>format : <span th:text="${#dates.format(itdragonDate)}"/></p>
<p>custom format : <span th:text="${#dates.format(itdragonDate, 'yyyy-MM-dd HH:mm:ss')}"/></p>
<p>day : <span th:text="${#dates.day(itdragonDate)}"/></p>
<p>month : <span th:text="${#dates.month(itdragonDate)}"/></p>
<p>monthName : <span th:text="${#dates.monthName(itdragonDate)}"/></p>
<p>year : <span th:text="${#dates.year(itdragonDate)}"/></p>
<p>dayOfWeekName : <span th:text="${#dates.dayOfWeekName(itdragonDate)}"/></p>
<p>hour : <span th:text="${#dates.hour(itdragonDate)}"/></p>
<p>minute : <span th:text="${#dates.minute(itdragonDate)}"/></p>
<p>second : <span th:text="${#dates.second(itdragonDate)}"/></p>
<p>createNow : <span th:text="${#dates.createNow()}"/></p>
</div>
</body>
</html>

ºǫ́¸ø¸ºÔð¸ø±äÁ¿¸³Öµ£¬ºÍÌø×ªÒ³Ãæ¡£

@RequestMapping("varexpressions")
public String varexpressions(ModelMap map) {
map.put("itdragonStr", "itdragonBlog");
map.put("itdragonBool", true);
map.put("itdragonArray", new Integer[]{1,2,3,4});
map.put("itdragonList", Arrays.asList(1,3,2,4,0));
Map itdragonMap = new HashMap();
itdragonMap.put("thName", "${#...}");
itdragonMap.put("desc", "±äÁ¿±í´ïʽÄÚÖ÷½·¨");
map.put("itdragonMap", itdragonMap);
map.put("itdragonDate", new Date());
map.put("itdragonNum", 888.888D);
return "grammar/varexpressions";
}

Èý¡¢ThymeleafÔÚSpringBootÓ¦ÓÃ

ThymeleafÊÇSpring Boot ¹Ù·½ÍƼöʹÓõÄÄ£°æÒýÇæ£¬ÕâÒ²Òâζ×ÅÓÃThymeleaf±ÈÆäËûÄ£°æÒýÇæ¸ü¼òµ¥¡£

¿ª·¢²½Ö裺

µÚÒ»²½£ºÒýÈëThymeleafÒÀÀµ¡£

µÚ¶þ²½£º ÌáÈ¡¹«¹²Ò³Ã棬Ìá¸ß´úÂëµÄÖØÓÃÐÔ£¬Í³Ò»Ò³Ãæ·ç¸ñ¡£

µÚÈý²½£ºÒ³ÃæÏÔʾºÍ¹ú¼Ê»¯¹¦ÄÜ

ÒýÈëThymeleaf

pom.xml ÒýÈëThymeleafµÄÒÀÀµ£¬²¢È·¶¨Æä°æ±¾

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<dependency> <!--ÒýÈëÄ£°æÒýÇæthymeleaf-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>

ÌáÈ¡¹«¹²Ò³Ãæ

ΪÁËÍ³Ò»Ò³Ãæ·ç¸ñ£¬Ìá¸ßÒ³ÃæµÄ¸´ÓÃÂÊ£¬ÎÒÃÇÒ»°ã¶¼»áÌáÈ¡¹«¹²Ò³Ã档֮ǰÔÚÎÄÕÂÖнéÉÜÁËSiteMeshµÄʹÓ㬽ñÌìÓÃThymeleafÀ´ÊµÏÖ¡£

ͳһ¹æ·¶ÒýÈëµÄ×ÊÔ´Îļþ

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head th:fragment="common-head">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="initial-scale=1.0, width=device-width, user-scalable=no" />
<title>ITDragonϵͳ</title>
<link type="image/x-icon" href="images/favicon.ico" rel="shortcut icon">
<link th:href="@{/sb-admin-1.0.4/css/bootstrap.min.css}" rel="stylesheet">
<link th:href="@{/sb-admin-1.0.4/css/sb-admin.css}" rel="stylesheet">
<link th:href="@{/sb-admin-1.0.4/css/plugins/morris.css}" rel="stylesheet">
<link th:href="@{/sb-admin-1.0.4/font-awesome/css/font-awesome.min.css}" rel="stylesheet">
<script th:src="@{/sb-admin-1.0.4/js/jquery.js}"></script>
<script th:src="@{/sb-admin-1.0.4/js/bootstrap.min.js}"></script>
<script th:src="@{/sb-admin-1.0.4/js/plugins/morris/raphael.min.js}"></script>
<script th:src="@{/sb-admin-1.0.4/js/plugins/morris/morris.min.js}"></script>
<script th:src="@{/sb-admin-1.0.4/js/plugins/morris/morris-data.js}"></script>
</head>
</html>

ͳһ×ó²à²Ëµ¥À¸

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
</head>
<body>
<header id="header" th:fragment="common-header">
<!-- Navigation -->
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/dashboard">ITDragon sb-admin-1.0.4</a>
</div>
<!--ºÍ֪ʶµãû¹ØÏµµÄ´úÂ룬ÕâÀï¾Í²¹Ìù³öÀ´ÁË£¬ÍêÕû´úÂëÇëÒì²½github-->
<!-- Sidebar Menu Items - These collapse to the responsive navigation menu on small screens -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav side-nav itdragon-nav">
<li th:class="${activeUrl=='dashboard'?'nav-link active':'nav-link'}">
<a th:href="@{/dashboard}"><i class="fa fa-fw fa-dashboard"></i> Dashboard</a>
</li>
<li th:class="${activeUrl=='employees'?'nav-link active':'nav-link'}">
<a th:href="@{/employees}"><i class="fa fa-fw fa-bar-chart-o"></i> Employees</a>
</li>
</ul>
</div>
<!-- /.navbar-collapse -->
</nav>
</header>
</body>
</html>

ÒÔÉÏ´úÂëÓõ½ÁËÈý¸ö֪ʶµã£º

Ò»¡¢Ê¹ÓÃÁ´½Ó±í´ïʽÒýÈë±¾µØµÄ×ÊÔ´Îļþ£¬ÈôÒýÈëµÚÈý·½Íⲿ×ÊÔ´Îļþ£¬¿ÉÒÔͨ¹ýwebjars£¨½«×ÊÔ´Îļþ´ò³Éjar°ü·ÅÔÚÏîÄ¿ÖУ©·½Ê½ÒýÈë¡£

¶þ¡¢Ê¹ÓÃth:fragment±êʶÐèÒª±»ÒýÓõĴúÂë¿é£¬Ò²¿ÉÒÔÓÃidÑ¡ÔñÆ÷µ«²»ÍƼö¡£

Èý¡¢activeUrl±äÁ¿ÊÇͨ¹ý´úÂë¿é±í´ïʽÔÚÆäËûÒ³Ãæ´«ÈëµÄ±äÁ¿£¬ÕâÒ²ÊÇ´úÂë¿é±í´ïʽǿ´óµÄÒ»¸ö¹¦ÄÜ¡£

Ò³ÃæÏÔʾºÍ¹ú¼Ê»¯

Spring Boot ʵÏÖ¹ú¼Ê»¯²½Ö裺

µÚÒ»²½£º×¼±¸ºÃ¹ú¼Ê»¯Îļþ£¬ÖÁÉÙÈý·Ö£¨ÏµÍ³Ä¬ÈÏ£¬ÖÐÎÄ£¬Ó¢ÎÄ£©

µÚ¶þ²½£ºÔÚSpring BootÈ«¾ÖÅäÖÃÎļþÖУ¬Ö¸¶¨¹ú¼Ê»¯Îļþ·¾¶£¬

µÚÈý²½£º×Ô¶¨ÒåLocale Resolver

µÚËIJ½£ºÔÚÒ³ÃæÉÏʹÓÃÏûÏ¢±í´ïʽÊä³ö¹ú¼Ê»¯ÄÚÈÝ

ÕâÀïÖ»Ìù³öµÚËIJ½µÄ´úÂ룬ǰÈý²½ÒÔ¼°ÍêÕû´úÂëÇëÒì²½github

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{commons/default::common-head}">
<meta name="viewport" content="initial-scale=1.0, width=device-width, user-scalable=no" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<title>Ô±¹¤Áбí</title>
</head>
<body>
<div id="wrapper">
<header th:replace="~{commons/header::common-header(activeUrl='employees')}"></header>
<div id="page-wrapper">
<div class="container-fluid">
<!-- Page Heading -->
<div class="row">
<div class="col-lg-12">
<h1 class="page-header" th:text="#{employees}"></h1>
<ol class="breadcrumb">
<li><i class="fa fa-dashboard"></i> <a th:href="@{/dashboard}" th:text="#{dashboard}"></a>
</li>
<li class="active"><i class="fa fa-table"></i> <span th:text="#{employees}"></span></li>
</ol>
</div>
</div>
<div class="row" th:if="${not #strings.isEmpty(message)}">
<div class="col-lg-12">
<div class="alert alert-info alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<i class="fa fa-info-circle"></i> <strong th:text="${message}"></strong>
</div>
</div>
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-12">
<h2 th:text="#{employees}"></h2>
<div class="table-responsive">
<a class="pull-right btn" th:href="@{/employee}" th:text="#{add.employees}"></a>
<table class="table table-striped table-sm">
<thead>
<tr>
<th th:text="#{id}"></th>
<th th:text="#{last.name}"></th>
<th th:text="#{email}"></th>
<th th:text="#{gender}"></th>
<th th:text="#{department}"></th>
<th th:text="#{position}"></th>
<th th:text="#{birth}"></th>
<th th:text="#{operation}"></th>
</tr>
</thead>
<tbody>
<tr th:each="emp:${employees}">
<td th:text="${emp.id}"></td>
<td>[[${emp.lastName}]]</td>
<td th:text="${emp.email}"></td>
<td th:text="${emp.gender}==0?#{female}:#{male}"></td>
<td th:text="${emp.department.departmentName}"></td>
<td th:text="${emp.department.position}"></td>
<td th:text="${#dates.format(emp.birth, 'yyyy-MM-dd HH:mm')}"></td>
<td>
<a class="btn btn-sm btn-success" th:href="@{/employee/}+${emp.id}" th:text="#{edit}"></a>
<a class="btn btn-sm btn-danger deleteBtn" th:href="@{/employee/}+${emp.id}" th:text="#{delete}"></a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- /.row -->
</div>
</div>
</div>
</body>
</html>

ÒÔÉÏ´úÂëÓõ½ÁË֪ʶµã£º

Ò»¡¢Ò³ÃæÍ¨¹ý´úÂë¿é±í´ïʽÒýÈ빫¹²´úÂë¿é£¬²¢´«Èë²ÎÊý¸ø¹«¹²´úÂë¿éÎļþ¡£

¶þ¡¢Ò³ÃæÊ¹ÓÃÏûÏ¢±í´ïʽÊä³ö¹ú¼Ê»¯ÄÚÈÝ¡£

Èý¡¢Ê¹ÓÃth:ifÊôÐÔÌõ¼þÅжϣ¬Ê¹ÓÃÄÚÖ÷½·¨#strings.isEmpty ÅжϲÎÊýÊÇ·ñΪ¿Õ£¬Ê¹ÓÃÄÚÖ÷½·¨#dates.format ¸ñʽ»¯²ÎÊý

ËÄ¡¢Ê¹ÓÃth:eachÊôÐÔÑ­»·±éÀú£¬×¢Òâ¸ÃÊôÐÔÐÞ¸ÄÔÚtr±êÇ©ÉÏ¡£²¢Ê¹ÓÃth:textÊôÐÔ¸øtd±êÇ©¸³Öµ

ËÄ¡¢×ܽá

Ò»¡¢Thymeleaf ÊÇSpring Boot ¹Ù·½ÍƼöµÄJavaÄ£°æÒýÇæ¿ò¼Ü£¬ÆäÎļþÀ©Õ¹ÃûΪ.html

¶þ¡¢Thymeleaf ¼¸ºõÖ§³ÖËùÓеÄhtmlÊôÐÔ£¬ÓÃÓÚ¸³ÖµµÄth:textºÍth:value£¬ÓÃÓÚÑ­»·±éÀúµÄth:each£¬ÓÃÓÚÌõ¼þÅжϵÄth:if

Èý¡¢Thymeleaf ÌṩËÄÖÖ±ê×¼µÄ±í´ïʽ£¬ÓзḻÄÚÖ÷½·¨µÄ${}£¬ÓÃÓÚ¹ú¼Ê»¯µÄ#{}£¬ÓÃÓÚ´úÂë²åÈëµÄ~{}£¬ÓÃÓÚ´¦ÀíÁ´½ÓµÄ@{}

ËÄ¡¢Ò»¶¨Òª×¢ÒâÑ­»·±éÀúµÄth:eachºÍ´úÂë²åÈëµÄth:insertÓ÷¨£¬¾¡Á¿±ÜÃâÆÆ»µhtml½á¹¹µÄϸ½ÚÎÊÌâ

²Î¿¼ÎÄÏ×£º

Appendix A: Expression Basic Objects

Appendix B: Expression Utility Objects

 
   
2536 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö