Thymeleaf中⽂⽂档
⽂章⽬录
1 引⼊Thymeleaf
1.1 Thymeleaf是什么?
Thymeleaf是⼀个现代的服务器端Java模板引擎的web和独⽴的环境,能够处理HTML, XML, JavaScript, CSS,甚⾄纯⽂本。
Thymeleaf的主要⽬标是提供⼀种优雅的和⾼度可维护的⽅式来创建模板。为了实现这⼀点,它构建在⾃然模板的概念上,以不影响模板作为设计原型使⽤的⽅式将其逻辑注⼊模板⽂件。这改进了设计的交流,并在设计和开发团队之间架起了桥梁。
Thymeleaf的设计从⼀开始就考虑了Web标准——尤其是HTML5——允许你创建完全验证模板,如果你需要的话。
1.2 Thymeleaf可以处理什么样的模板?
开箱即⽤,Thymeleaf允许您处理六种模板,其中每⼀种被称为模板模式:
HTML
XML
TEXT
JAVASCRIPT
CSS
RAW
有两种标记模板模式(HTML和XML)、三种⽂本模板模式(⽂本、JAVASCRIPT和CSS)和⼀种⽆操作模板模式(RAW)。
HTML模板模式将允许任何类型的HTML输⼊,包括HTML5、HTML 4和XHTML。将不执⾏任何验证或格式良好性检查,并且将在输出中尽可能尊重模板代码/结构。
XML模板模式将允许XML输⼊。在这种情况下,代码应该是格式良好的—没有未关闭的标记,没有未引⽤的属性,等等—如果发现格式良好性违规,解析器将抛出异常。注意,将不执⾏任何验证(针对DTD或XML模式)。
⽂本模板模式将允许对⾮标记性质的模板使⽤特殊语法。此类模板的⽰例可能是⽂本电⼦邮件或模板化⽂档。注意,HTML或XML模板也可以作为⽂本处理,在这种情况下,它们不会被解析为标记,⽽每个标记、DOCTYPE、注释等都将被视为纯⽂本。
JAVASCRIPT模板模式将允许在Thymeleaf应⽤程序中处理JAVASCRIPT⽂件。这意味着能够像在HTML⽂件中⼀样在JavaScript⽂件中使⽤模型数据,但是要使⽤特定于JavaScript的集成,⽐如专门的转义或⾃然脚本。JAVASCRIPT模板模式被认为是⽂本模式,因此使⽤与⽂本模板模式相同的特殊语法。
CSS模板模式将允许处理Thymeleaf应⽤程序中涉及的CSS⽂件。与JAVASCRIPT模式类似,CSS模板模式也是⼀种⽂本模式,并使⽤来⾃⽂本模板模式的特殊处理语法。
原始模板模式根本不会处理模板。它⽤于将未触及的资源(⽂件、URL响应等)插⼊正在处理的模板中。例如,可以将HTML格式的外部⾮控制资源包含到应⽤程序模板中,但要确保这些资源可能包含的任何Thymeleaf代码都不会被执⾏。
1.3 ⽅⾔:标准⽅⾔
Thymeleaf是⼀个⾮常可扩展的模板引擎(事实上它可以被称为模板引擎框架),它允许你定义和⾃定义的⽅式,你的模板将被处理到⼀个精细的细节级别。
将⼀些逻辑应⽤到标记⼯件(标记、⼀些⽂本、注释,如果模板不是标记,则仅仅是占位符)的对象称为处理程序,这些处理程序的集合—加上⼀些额外的⼯件—通常是⽅⾔的组成部分。Thymeleaf的核⼼库提供了⼀种称为标准⽅⾔的⽅⾔,这对⼤多数⽤户来说应该⾜够了。
注意,⽅⾔实际上可能没有处理器,并且完全由其他类型的⼯件组成,但是处理器绝对是最常见的⽤例。
本教程介绍标准⽅⾔。在下⾯的页⾯中,您将了解到的每个属性和语法特性都是由这种⽅⾔定义的,即使没有明确提到。
当然,如果希望在利⽤库的⾼级特性的同时定义⾃⼰的处理逻辑,⽤户可以创建⾃⼰的⽅⾔(甚⾄扩展标准的⽅⾔)。Thymeleaf也可以配置成同时使⽤⼏种⽅⾔。
官⽅thymeleaf-spring3和thymeleaf-spring4集成包都定义⼀个⽅⾔称为“SpringStandard⽅⾔”,⼤部分是⼀样的标准⽅⾔,但⼩适应更好地利⽤Spring框架的⼀些特性(例如,通过使⽤Spring表达式语⾔或图像代替OGNL展⽰出)。因此,如果您是Spring MVC⽤户,您就不会浪费时间,因为您在这⾥学到的⼏乎所有东西都将在您的Spring应⽤程序中使⽤。
标准⽅⾔的⼤多数处理器都是属性处理器。这允许浏览器在处理之前正确显⽰HTML模板⽂件,因为
它们将直接忽略额外的属性。例如,⼀个使⽤标记库的JSP可能包含⼀段不能被浏览器直接显⽰的代码,⽐如:
<inputText name="userName"value="${user.name}"/>
Thymeleaf标准⽅⾔将允许我们实现相同的功能与:
<input type="text"name="userName"value="James Carrot"value="${user.name}"/>
这不仅可以被浏览器正确显⽰,但这也让我们(可选)指定⼀个值属性(“James Carrot”,在这种情况下),将显⽰静态原型时在浏览器中打开,
在处理模板期间,将取代 ${user.name}。
这有助于设计⼈员和开发⼈员处理相同的模板⽂件,并减少将静态原型转换为⼯作模板⽂件所需的⼯作。这样做的能⼒称为⾃然模板。
2 ⼀个很棒的虚拟杂货店设计
本⽂所⽰⽰例的源代码,以及本指南的后续章节,可以在 Good Thymes Virtual Grocery GitHub repository.
2.1 ⼀个杂货店的⽹站
为了更好地解释使⽤Thymeleaf处理模板所涉及的概念,本教程将使⽤⼀个演⽰应⽤程序,您可以从项⽬的⽹站下载。
这个应⽤程序是⼀个虚拟杂货店的web站点,它将为我们提供许多场景来展⽰Thymeleaf的许多特性。
⾸先,我们的应⽤程序需要⼀组简单的模型实体:通过创建订单向客户销售的产品。我们还将管理这些产品的评论:
[外链图⽚转存失败,源站可能有防盗链机制,建议将图⽚保存下来直接上传(img-YTE0bKsU-1607314011237)
(C:\Users\songyazhou\Desktop\62i7e9b7.bmp)]
我们的应⽤程序还将有⼀个⾮常简单的服务层,由包含以下⽅法的服务对象组成:
public class ProductService {
...
public List<Product>findAll(){
Instance().findAll();
}
public Product findById(Integer id){
Instance().findById(id);
}
}
在web层,我们的应⽤程序将有⼀个过滤器,根据请求URL将执⾏委托给thymeleaf启⽤的命令:
private boolean process(HttpServletRequest request, HttpServletResponse response) throws ServletException {
try{
// This prevents triggering engine executions for resource URLs
RequestURI().startsWith("/css")||
return false;
}
/*
* Query controller/URL mapping and obtain the controller
thyme* that will process the request. If no controller is available,
* return false and let other filters/servlets process the request.
*/
IGTVGController controller =solveControllerForRequest(request);
if(controller == null){
return false;
}
/*
* Obtain the TemplateEngine instance.
*/
ITemplateEngine templateEngine =TemplateEngine();
/*
* Write the response headers
*/
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
/*
* Execute the controller and process view template,
* writing the results to the response writer.
*/
controller.process(
request, response,this.servletContext, templateEngine);
return true;
}catch(Exception e){
try{
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}catch(final IOException ignored){
// Just ignore this
}
throw new ServletException(e);
}
}
这是我们的IGTVGController接⼝:
public interface IGTVGController {
public void process(
HttpServletRequest request, HttpServletResponse response,
ServletContext servletContext, ITemplateEngine templateEngine);
}
我们现在要做的就是创建IGTVGController接⼝的实现,从服务中检索数据,并使⽤ITemplateEngine对象处理模板。
最后,它看起来是这样的:
但⾸先让我们看看模板引擎是如何初始化的。
2.2 创建和配置模板引擎
我们的过滤器中的process(…)⽅法包含这⼀⾏:
ITemplateEngine templateEngine =TemplateEngine();
这意味着GTVGApplication类负责创建和配置Thymeleaf应⽤程序中最重要的对象之⼀:TemplateEngine实例(ITemplateEngine接⼝的实现)。
我们的org.thymeleaf.TemplateEngine对象初始化如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论