±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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">
© 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>
© 2011 The Good Thymes Virtual Grocery
</footer>
</div>
<!--th:replaceÊǽ«´úÂë¿é´úÌæµ±Ç°div£¬Æähtml½á¹¹ºÍ֮ǰһÖÂ-->
<footer>
© 2011 The Good Thymes Virtual Grocery
</footer>
<!--th:includeÊǽ«´úÂë¿éfooterµÄÄÚÈݲåÈëµ½divÖУ¬¼´ÉÙÁËÒ»²ãfooter-->
<div>
© 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">×</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 |