没有合适的资源?快使用搜索试试~ 我知道了~
首页Thymeleaf 3.0教程:优雅Java模板引擎详解
Thymeleaf 3.0教程:优雅Java模板引擎详解
1星 需积分: 46 17 下载量 201 浏览量
更新于2024-07-19
2
收藏 949KB PDF 举报
Thymeleaf 3.0中文翻译文档是一份详细的教程,介绍了如何使用Thymeleaf这个功能强大的Java模板引擎。该教程发布于2016年11月19日,适用于Thymeleaf 3.0.2.RELEASE版本。Thymeleaf的主要目标是通过自然模板注入的方式提高Web和独立环境中模板的优雅性和可维护性,减少设计与开发之间的沟通障碍,特别强调了对HTML5标准的支持,使得模板设计易于验证。 教程中提到,Thymeleaf支持六种模板模式: 1. HTML模板模式:接受包括HTML5、HTML4和XHTML在内的各种HTML输入,不进行验证或良好性检查,但会确保模板的代码结构符合规范,输出尽可能清晰。 2. XML模板模式:专为XML输入设计,期望代码具有良好的格式,例如,标签完整闭合、属性使用引号等。如果代码不符合XML良好性规则,解析器会抛出异常,但不进行验证或模式匹配。 3. TEXT模板模式:用于处理非标记性文本,如电子邮件模板,提供了一套特殊的语法。 4. JAVASCRIPT模板模式:用于处理JavaScript代码,允许在模板中嵌入动态逻辑。 5. CSS模板模式:支持CSS编写,方便样式与内容分离。 6. RAW模板模式:无操作模式,通常用于包含纯文本内容,不做任何处理直接输出。 这份文档提供了丰富的教程内容,适合想要学习和使用Thymeleaf 3.0的开发人员参考,无论是初次接触还是进阶者,都能从中找到所需的信息和指导。通过阅读和实践,开发者可以更好地理解和掌握如何利用Thymeleaf构建高效、灵活的Web应用模板。
资源详情
资源推荐
2016/12/15 教程:使用Thymeleaf
file:///C:/Users/msipc/Desktop/%E6%95%99%E7%A8%8B%EF %BC%9A%E4%BD%BF%E7%94%A8Thymeleaf.html 15/91
4.1信息
我们已经知道, #{...} 消息表达式允许我们链接此:
<p th:utext="#{home.welcome}">Welcome to our grocery store!</p>
......这样的:
home.welcome=¡Bienvenido a nuestra tienda de comestibles!
但是有我们还没有想到的一个方面:如果消息文本不完全静态的会发生什么?如果,例如,我们的应用程序就知道是谁访问的网站在
任何时刻的用户,我们希望通过名字来迎接他们?
<p>¡Bienvenido a nuestra tienda de comestibles, John Apricot!</p>
这意味着我们需要一个参数添加到我们的信息。像这样:
home.welcome=¡Bienvenido a nuestra tienda de comestibles, {0}!
参数按规定的 java.text.MessageFormat 标准语法,这意味着在这些类的API文档指定可以格式化数字和日期。
为了给指定称为HTTP会话属性,我们的参数的值,并且 user ,我们将有:
<p th:utext="#{home.welcome(${session.user.name})}">
Welcome to our grocery store, Sebastian Pepper!
</p>
一些参数可以指定用逗号分隔。事实上,该消息密钥本身可能来自一个变量:
<p th:utext="#{${welcomeMsgKey}(${session.user.name})}">
Welcome to our grocery store, Sebastian Pepper!
</p>
4.2变量
我们已经提到 ${...} 的表达式实际上包含在上下文变量在地图上执行OGNL(对象图形导航语言)表达式。
有关OGNL语法和功能的详细信息,你应该阅读OGNL语言指南
在Spring MVC启用OGNL将被替换应用SpringEL,但它的语法非常类似于OGNL(实际上,正是同为最常见的情况)的。
从OGNL的语法,我们知道,在表达:
<p>Today is: <span th:text="${today}">13 february 2011</span>.</p>
......其实等价于:
ctx.getVariable("today");
2016/12/15 教程:使用Thymeleaf
file:///C:/Users/msipc/Desktop/%E6%95%99%E7%A8%8B%EF %BC%9A%E4%BD%BF%E7%94%A8Thymeleaf.html 16/91
但OGNL允许我们创建相当更强大的表现,这是如何:
<p th:utext="#{home.welcome(${session.user.name})}">
Welcome to our grocery store, Sebastian Pepper!
</p>
......通过执行获得用户名:
((User) ctx.getVariable("session").get("user")).getName();
但getter方法导航只是OGNL的特点之一。让我们来看看一些:
/*
* Access to properties using the point (.). Equivalent to calling property getters.
*/
${person.father.name}
/*
* Access to properties can also be made by using brackets ([]) and writing
* the name of the property as a variable or between single quotes.
*/
${person['father']['name']}
/*
* If the object is a map, both dot and bracket syntax will be equivalent to
* executing a call on its get(...) method.
*/
${countriesByCode.ES}
${personsByName['Stephen Zucchini'].age}
/*
* Indexed access to arrays or collections is also performed with brackets,
* writing the index without quotes.
*/
${personsArray[0].name}
/*
* Methods can be called, even with arguments.
*/
${person.createCompleteName()}
${person.createCompleteNameWithSeparator('-')}
表达基本对象
当在上下文变量评估OGNL表达式,某些对象提供给表达式更高的灵活性。这些对象(每个OGNL标准)开始的引用 # 符号:
#ctx :上下文对象。
#vars: 上下文变量。
#locale :上下文的语言环境。
#request (仅在web上下文)的 HttpServletRequest 对象。
#response (仅在web上下文)的 HttpServletResponse 对象。
#session (仅在web上下文)的 HttpSession 对象。
#servletContext (仅在web上下文)的 ServletContext 对象。
因此,我们可以这样做:
Established locale country: <span th:text="${#locale.country}">US</span>.
你可以阅读这些对象的完整参考附录A。
2016/12/15 教程:使用Thymeleaf
file:///C:/Users/msipc/Desktop/%E6%95%99%E7%A8%8B%EF %BC%9A%E4%BD%BF%E7%94%A8Thymeleaf.html 17/91
表达工具对象
除了这些基本对象,Thymeleaf会为我们提供了一套实用的对象,这将有助于我们在表达式执行常见任务。
#execInfo :正在处理有关模板的信息。
#messages :用于获得外部化消息内部变量的表达式,以同样的方式,因为他们将用#{...}语法来获得的方法。
#uris :方法逃避的URL / URI的部分
#conversions :用于执行所述配置的方法转换服务(如果有的话)。
#dates :方法 java.util.Date 对象:格式化,成分提取等。
#calendars :类似于 #dates ,但对于 java.util.Calendar 对象。
#numbers :方法格式化数值对象。
#strings :所用方法 String 对象:包含,startsWith,预谋/附加等。
#objects :对一般对象的方法。
#bools :布尔评价方法。
#arrays :数组的方法。
#lists :对列表的方法。
#sets :为集的方法。
#maps :对地图的方法。
#aggregates :用于创建对数组或集合聚集方法。
#ids :方法与可能被重复的id属性处理(例如,作为迭代的结果)。
您可以检查每个在这些工具的对象提供哪些功能附录B。
在我们的主页重新格式化日期
现在我们知道这些实用物品,我们可以用它们来改变我们显示了我们的主页日期的方式。代替在我们这样做 HomeController :
SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy");
Calendar cal = Calendar.getInstance();
WebContext ctx = new WebContext(request, servletContext, request.getLocale());
ctx.setVariable("today", dateFormat.format(cal.getTime()));
templateEngine.process("home", ctx, response.getWriter());
......我们能做的只是这一点:
WebContext ctx =
new WebContext(request, response, servletContext, request.getLocale());
ctx.setVariable("today", Calendar.getInstance());
templateEngine.process("home", ctx, response.getWriter());
...然后在视图层本身执行日期格式:
<p>
Today is: <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 May 2011</span>
</p>
4.3表达式的选择(星号语法)
不仅可变量表达式写为 ${...} ,也可作为 *{...} 。
还有,虽然一个重要的区别:星号语法上求表达式选定的对象,而不是对整个背景。也就是说,只要是没有选择的对象,美元和星号
语法做同样的。
2016/12/15 教程:使用Thymeleaf
file:///C:/Users/msipc/Desktop/%E6%95%99%E7%A8%8B%EF %BC%9A%E4%BD%BF%E7%94%A8Thymeleaf.html 18/91
什么是一个选择的对象?使用表达式的结果 th:object 属性。让我们用一个我们的用户配置文件( userprofile.html )页:
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
这是完全等价于:
<div>
<p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p>
</div>
当然,美元和星号语法可以混:
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
当对象的选择是在地方,所选择的对象也将提供给元表达式作为 #object 表达变量:
<div th:object="${session.user}">
<p>Name: <span th:text="${#object.firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
至于说,如果没有对象选择已经被执行,美元和星号语法是等价的。
<div>
<p>Name: <span th:text="*{session.user.name}">Sebastian</span>.</p>
<p>Surname: <span th:text="*{session.user.surname}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{session.user.nationality}">Saturn</span>.</p>
</div>
4.4链接的网址
由于其重要性,URL是Web应用程序模板一等公民,而Thymeleaf标准方言有他们特殊的语法,该 @ 语法: @{...}
有不同类型的网址:
绝对网址: http://www.thymeleaf.org
相对URL,它可以是:
页面相对: user/login.html
上下文相关: /itemdetails?id=3 (服务器将自动添加上下文名称)
相对于服务器的: ~/billing/processInvoice (允许在同一台服务器的另一个上下文(=应用程序)调用的URL。
相关协议的URL: //code.jquery.com/jquery-2.0.3.min.js
这些表达式的实处理和它们转化成网址,就可以输出由的实现做 org.thymeleaf.linkbuilder.ILinkBuilder 被登记到该接口
ITemplateEngine 被使用的对象。
2016/12/15 教程:使用Thymeleaf
file:///C:/Users/msipc/Desktop/%E6%95%99%E7%A8%8B%EF %BC%9A%E4%BD%BF%E7%94%A8Thymeleaf.html 19/91
缺省情况下,一个单一的实施这一接口的注册的类的 org.thymeleaf.linkbuilder.StandardLinkBuilder ,这是足以为离线(非网
络),并且还幅场景基于Servlet API。其他情况下(如非ServletAPI Web框架集成)可能需要链接Builder界面的具体实现。
让我们用这个新的语法。满足 th:href 属性:
<!-- Will produce 'http://localhost:8080/gtvg/order/details?orderId=3' (plus rewriting) -->
<a href="details.html"
th:href="@{http://localhost:8080/gtvg/order/details(orderId=${o.id})}">view</a>
<!-- Will produce '/gtvg/order/details?orderId=3' (plus rewriting) -->
<a href="details.html" th:href="@{/order/details(orderId=${o.id})}">view</a>
<!-- Will produce '/gtvg/order/3/details' (plus rewriting) -->
<a href="details.html" th:href="@{/order/{orderId}/details(orderId=${o.id})}">view</a>
有些东西这里要注意:
th:href 是一个修改属性:一次处理,将计算出要使用的链接URL并将该值设定为 href 所述的属性 <a> 标记。
我们被允许使用的URL参数表达式(正如你可以看到 orderId=${o.id} )。的URL参数编码所需的操作也将被自动执行。
如果需要几个参数,这些都将用逗号分隔: @{/order/process(execId=${execId},execType='FAST')}
可变模板也允许URL路径: @{/order/{orderId}/details(orderId=${orderId})}
首先是相对URL / (如: /order/details )将应用程序上下文名称自动前缀。
如果Cookie未启用或本还不知道,一个 ";jsessionid=..." 后缀可能被添加到相对URL,从而使会话被保留。这就是所谓的URL
重写和Thymeleaf允许你在你自己改写的过滤器通过使用插件 response.encodeURL(...) 机制和Servlet API为每个URL。
该 th:href 属性可以让我们(可选)有一个静态的工作 href 在我们的模板属性,所以,当为原型的目的直接打开我们的模板链
接仍然通过浏览器通航。
这一点与该消息的语法(壳体 #{...} ),网址碱也可以是评价另一个表达式的结果:
<a th:href="@{${url}(orderId=${o.id})}">view</a>
<a th:href="@{'/details/'+${user.login}(orderId=${o.id})}">view</a>
一种我们的主页菜单
现在我们知道了如何创建链接的URL,关于我们的主页增加一个小菜单,有的在网站其他页面的什么?
<p>Please select an option</p>
<ol>
<li><a href="product/list.html" th:href="@{/product/list}">Product List</a></li>
<li><a href="order/list.html" th:href="@{/order/list}">Order List</a></li>
<li><a href="subscribe.html" th:href="@{/subscribe}">Subscribe to our Newsletter</a></li>
<li><a href="userprofile.html" th:href="@{/userprofile}">See User Profile</a></li>
</ol>
服务器的根目录相对 URL
另外一个语法可以使用,才能在同一台服务器链接到不同的上下文中创建服务器根目录相对(而不是上下文根目录相对)的URL。这
些URL会像被指定 @{~/path/to/something}
4.5片段
片段表达式来表示标记片段和移动它们周围模板的简便方法。这使我们能够复制它们,将它们传递到其他模板作为参数,等等。
最常见的用途使用是片段的插入 th:insert 或 th:replace (更多关于这些在后面的章节):
<div th:insert="~{commons :: main}">...</div>
剩余90页未读,继续阅读
石奈子
- 粉丝: 520
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- OptiX传输试题与SDH基础知识
- C++Builder函数详解与应用
- Linux shell (bash) 文件与字符串比较运算符详解
- Adam Gawne-Cain解读英文版WKT格式与常见投影标准
- dos命令详解:基础操作与网络测试必备
- Windows 蓝屏代码解析与处理指南
- PSoC CY8C24533在电动自行车控制器设计中的应用
- PHP整合FCKeditor网页编辑器教程
- Java Swing计算器源码示例:初学者入门教程
- Eclipse平台上的可视化开发:使用VEP与SWT
- 软件工程CASE工具实践指南
- AIX LVM详解:网络存储架构与管理
- 递归算法解析:文件系统、XML与树图
- 使用Struts2与MySQL构建Web登录验证教程
- PHP5 CLI模式:用PHP编写Shell脚本教程
- MyBatis与Spring完美整合:1.0.0-RC3详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功