Jinja2喜欢Spring MVC的View Templating方法吗?

时间:2012-08-12 15:58:59

标签: spring-mvc

哪个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结果的大部分好处。如果确实发生了缓存,则如果无法使缓存的副本无效,则此方法甚至可能无效。

仍在寻求更好的方法。

2 个答案:

答案 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>
...

这似乎或多或少正是我所寻找的。