哪个Spring MVC兼容的模板引擎可以让我实现Python的Jinja2模板?
示例:
所有视图都以自己的内容扩展的模板文件
main.jinja2:
<html>
<head>
<title>{% block title %}{% endblock %}</title>
...
每个视图只需要自定义一些模板定义的块
a_view.jinja2:
{% extends "main.jinja2" %}
{% block title %}A View Page Title{% endblock %}
我不需要语法兼容性,只需要扩展基本模板的概念。
一种可能的解决方案是反转JSP模板方法。
创建一个main.jsp,所有控制器都会为其视图呈现main.jsp:
<html>
<head>
<title><jsp:include page="titles/${title_inc}.jsp" /></title>
...
来自控制器:
@RequestMapping("/")
public String welcome( ModelMap args ) {
args.addAttribute("title_inc", "home");
args.addAttribute("body_inc", "home");
args.addAttribute("message", "A Message!");
return "main";
}
我希望能够改进这种方法,我更倾向于从某个会话属性推断出标题/正文包含的正确名称,而不是在每个控制器的模型映射中指定它们。
我对性能有所保留。我不知道main.jsp是否被缓存(出于性能原因),但这种方法有效地否定了缓存渲染main.jsp结果的大部分好处。如果确实发生了缓存,则如果无法使缓存的副本无效,则此方法甚至可能无效。
仍在寻求更好的方法。
答案 0 :(得分:2)
我认为Sitemesh会做你要求的......
您可以根据需要定义任意数量的“布局”,但它们不会相互继承。单个页面将其内容插入您为其选择的布局中。
如果您需要正确继承模板(包括抽象模板),那么您需要查看Tiles。瓷砖更强大但也更复杂,并且长期来看更难以维护。
答案 1 :(得分:0)
我已经设法像JSP和amp;一样复制Jinj2。 JSTL。
每个控制器都会引用预期的相应视图(这是我上面第一次尝试的改进):
a_view.jsp:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="pageTitle" scope="request">My Title</c:set>
<%@ include file="/WEB-INF/views/main.jsp" %>
main.jsp中:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html lang="en">
<head>
<title><c:out value="${pageTitle}" /></title>
...
这似乎或多或少正是我所寻找的。 p>