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

时间:2017-11-05 12:29:58

标签: java jsp spring-mvc spring-boot thymeleaf

我即将重新编写一个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逻辑放在主要布局中包含的模板的JSP中(标题,导航,页脚,twitter-feed),或者是否存在用类似控制器的类来支持这些存根的更好方法是什么?

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

1 个答案:

答案 0 :(得分:3)

使用可以使用Thymeleaf Ultraq Layout创建一个基本模板,作为其他模板的装饰器,如下所示:

基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一起使用。

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