2.5 选择视图模板库
2.5 选择视图模板库
在大多数情况下,视图模板库的选择完全取决于个人喜好。Spring非常灵活,能够支持很多常见的模板方案。除了个别情况之外,你所选择的模板库本身甚至不知道它在与Spring协作[^1]。
表2.2列出Spring Boot自动配置功能所支持的模板方案。
表2.2 支持的模板方案
通常来讲,你只需要选择想要的视图模板库,将其作为依赖项添加到构建文件中,然后就可以在“/templates”目录下(在基于Maven或Gradle构建的项目中,它会在“src/main/resources
”目录下)编写模板了。Spring Boot会探测到你所选择的模板库,并自动配置为Spring MVC控制器生成视图所需的各种组件。
在Taco Cloud
应用中,我们已经按照这种方式使用了Thymeleaf
模板库。在第1章中,在初始化项目的时候,我们选择了Thymeleaf
复选框。这样会自动将SpringBoot
的Thymeleaf starter
依赖添加到pom.xml
文件中。当应用启动的时候,Spring Boot
的自动配置功能会探测到存在Thymeleaf
并自动为我们配置Thymeleaf bean
。我们所需要做的就是在“/templates
”中开始编写模板。
如果你想要使用不同的模板库,只需要在项目初始化的时候选择它或者编辑已有的项目构建文件,将新选择的模板库添加进来即可。
例如,我们想要使用Mustache来替换Thymeleaf,没有问题!只需要找到pom.xml文件,并将如下的代码
1 | <dependency> |
替换为:
1 | <dependency> |
当然,我们还需要确保按照Mustache语法来编写模板,而不是再使用Thymeleaf标签。Mustache的特定用法(以及其他备选模板语言)超出了本书的范围,但是我在这里给你一个直观的印象,让你明白大致会是什么样子。如下代码是Mustache模板的一个片段,它能够渲染taco设计表单中的某个配料组:
Designate your wrap:
{{#wrap}}{{name}}{{/wrap}}
这是2.1.3小节中Thymeleaf代码片段的Mustache等价实现。{{#wrap}}
代码块(结尾对应使用{{/wrap}}
)会遍历请求中key为wrap的属性并为每个条目渲染嵌入式HTML。{{id}}
和{{name}}
标签分别会引用每个条目(应该是一个Ingredient)的id和name属性。
你可能已经注意到了,在表2.2中,JSP并不需要在构建文件中添加任何特殊的依赖。这是因为Servlet容器本身(默认是Tomcat)会实现JSP,因此不需要额外的依赖。但是,如果你选择使用JSP,会有另外一个问题。事实上,Java Servlet容器包括嵌入式的Tomcat和Jetty容器,通常会在“/WEB-INF”目录下寻找JSP。如果我们将应用构建成一个可执行的JAR文件,就无法满足这种需求了。因此,只有在将应用构建为WAR文件并部署到传统的Servlet容器中时,才能选择JSP方案。如果你想要构建可执行的JAR文件,那么必须选择Thymeleaf、FreeMarker或表2.2中的其他方案。
缓存模板
默认情况下,模板只有在第一次使用的时候解析一次,解析的结果会被后续的请求所使用。对于生产环境来说,这是一个很棒的特性,它能防止每次请求时多余的模板解析过程,因此有助于提升性能。
但是,在开发期,这个特性就不太友好了。假设我们启动完应用之后访问taco的设计页面,然后决定对它做一些修改,但是当我们刷新Web浏览器的时候显示的依然是原始的版本。要想看到变更效果,就必须重新启动应用,这当然是非常不方便的。
幸运的是,有一种方法可以禁用缓存。我们所需要做的就是将相关的缓存属性设置为false。表2.3列出每种模板库所对应的缓存属性。
表2.3 启用/禁用模板缓存的属性
默认情况下,这些属性都设置成了true,以便于启用缓存。我们可以将缓存属性设置为false,从而禁用所选模板引擎的缓存。例如,要禁用Thymeleaf缓存,我们只需要在application.properties中添加如下这行代码:
1 | spring.thymeleaf.cache=false |
唯一需要注意的是,在将应用部署到生产环境之前,一定要删除这一行代码(或者将其设置为true)。有一种方法是将该属性设置到profile中(我们将会在第5章讨论profile)。另外一种更简单的方式是使用Spring Boot的DevTools,就像我们在第1章中的做法一样。DevTools提供了很多非常有用的开发期特性,其中有一项功能就是禁用所有模板库的缓存,但是在应用部署的时候DevTools会将自身禁用掉(从而能够重新启用模板缓存)。
[^1]: 其中一个这样的例外情况就是Thymeleaf的Spring Security方言,我们将会在第4章进行讨论。