0

Python の Jinja2 のようなテンプレートを実現できる Spring MVC 互換のテンプレート エンジンはどれですか?

例:

すべてのビューが独自のコンテンツで拡張されるテンプレート ファイル

main.jinja2:

<html>
<head>
  <title>{% block title %}{% endblock %}</title>
...

各ビューは、テンプレートの定義済みブロックの一部のみをカスタマイズする必要があります

a_view.jinja2:

{% extends "main.jinja2" %}
{% block title %}A View Page Title{% endblock %}

構文の互換性は必要ありません。基本テンプレートを拡張するというこの概念のみが必要です。

考えられる解決策の 1 つは、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を確認する必要があります。タイルはより強力ですが、複雑でもあり、長期的に維持するのは困難です。

于 2012-08-13T00:36:28.013 に答える
1

JSP と JSTL を使用してテンプレートのように Jinj2 を複製することができました。

各コントローラーは、予想されるように適切なビューを参照します (これは、上記の最初の試みの改善です)。

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

これは、多かれ少なかれ私が探していたものとまったく同じようです。

于 2012-08-13T10:32:07.320 に答える