一尘不染

推荐的模板引擎,以减少动态内容的冗余(Spring Boot)

jsp

我要重新编写一个Web平台,并且正在使用Spring Boot / Spring
MVC。该平台的主要部分是网站。我正在努力决定要使用哪个模板引擎。推荐使用Thymeleaf,但不建议使用JSP。我不确定我的要求是否异常,至少在我看来这些要求听起来不像是:

  • 我不想在不同的模板中重复说明,它们都应显示在“主模板/布局”中
  • 主模板/布局将具有导航和页脚,它们具有动态内容(例如,不仅主要内容是动态的)

1)从Thymeleaf的角度出发,据我所知,推荐使用Layouts(仅?)方法。但是,在我看来,所有动态内容仍会在每个模板中生成(使用layout:fragment属性流入布局中)。这听起来不太理想,因为这意味着我仍然必须在每个模板中生成布局的动态部分。没有办法在Thymeleaf布局中包含动态内容,其中内容(菜单,页脚,twitter-
feed等)是与实际内容模板分开生成的吗?

2)JSP似乎能够使用布局的自定义标签轻松解决此问题,该标签具有<jsp:include>用于动态内容的-
tags和<jsp:doBody>用于实际内容模板的-tag。但是,通过阅读Spring
Boot文档,我以某种方式得到的印象是,鼓励使用与JSP不同的模板引擎。以上描述的方法但将让我限定header.jspnavigation.jspfooter.jsptwitterFeed.jsp其生成动态内容(基于数据库的内容,登录的用户等),而实际内容模板纯粹的重点内容,以显示。在Thymeleaf和JSP之间进行比较时,我缺少什么,为什么我不选择JSP作为项目的模板引擎?

3)使用2)中所述的方法,我是否仅限于将我的所有Java逻辑放入主布局中的模板(页眉,导航,页脚,Twitter提要)的JSP中,还是有更好的方法用控制器类支持这些存根?

4)是否有其他模板引擎可以很好地与Spring MVC / Spring Boot集成在一起,这将是上述任何一种更好的选择?


阅读 256

收藏
2020-06-10

共1个答案

一尘不染

Use可以使用Thymeleaf Ultraq Layout创建一个基本模板,该模板将充当其他模板的装饰器,如下所示:

base-template.html:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>

  <title layout:title-pattern="$CONTENT_TITLE - $LAYOUT_TITLE">Sample</title>
  <meta name="description" content=""/>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <!-- all CSS links here -->
</head>


<body>
<div class="container">
  <div class="content">
    <div layout:fragment="page_content">
      <!-- Content from other pages which decorate using this template -->
    </div>
  </div>
</div>

<!-- /.container -->
<!-- All script tags here -->

<th:block layout:fragment="scripts">
  <!-- If you have any page specific scripts -->
</th:block>
</body>
</html>

然后其他页面将使用上面的模板作为装饰器,如下所示:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{base-template}">

<head>
  <title>This page title</title>
</head>

<div layout:fragment="page_content">
  <!-- content for this page -->
</div>

<th:block layout:fragment="scripts">
  <!-- add any scripts related to this page -->
</th:block>
</html>

语法从~{base-template}Thymeleaf 3开始使用。

您可以继续上述方法,而不必在其他页面上重复导航,页眉和页脚。

2020-06-10