0

哪个 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 的结果的大部分好处。如果缓存确实发生了,如果没有办法使缓存的副本无效,这种方法甚至可能不起作用。

仍在寻求更好的方法。

4

2 回答 2

2

我认为Sitemesh会按照您的要求进行操作...

您可以根据需要定义任意数量的“布局”,但它们不会相互继承。各个页面将其内容插入到您为其选择的布局中。

如果您需要正确继承模板(包括抽象模板),那么您需要查看Tiles。Tiles 更强大但也更复杂,并且在长期恕我直言中更难维护。

于 2012-08-13T00:36:28.013 回答
1

我已经成功地复制了 Jinj2,就像使用 JSP 和 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" %>

主.jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html lang="en">
<head>
<title><c:out value="${pageTitle}" /></title>
...

这似乎或多或少正是我想要的。

于 2012-08-13T10:32:07.320 回答