Наследование шаблона JSP

Исходя из опыта работы с Django, я часто использую «наследование шаблонов», когда несколько шаблонов наследуются от общей базы. Есть ли простой способ сделать это в JSP? Если нет, есть ли альтернатива JSP, которая делает это (помимо Django на Jython, который есть :)

базовый шаблон

<html>
  <body>
    {% block content %}
    {% endblock %}
  </body>
<html>

основное содержание

{% extends "base template" %}
{% block content %}
<h1>{{ content.title }} <-- Fills in a variable</h1>
{{ content.body }} <-- Fills in another variable
{% endblock %}

Будет отображаться следующим образом (при условии, что conten.title имеет значение «Вставить заголовок здесь», а content.body - «Вставить текст сюда»)

<html>
  <body>
    <h1>Insert title Here <-- Fills in a variable</h1>
    Insert Body Here <-- Fills in another variable
  </body>
<html>

person Ryan    schedule 29.01.2009    source источник


Ответы (6)


Возможно, вы захотите изучить плитки.

РЕДАКТИРОВАТЬ: В связи с примечанием к плиткам вы можете изучить Struts. Это не то, что вы ищете (это плитки), но это полезно для тех, кто работает с Django.

person geowa4    schedule 29.01.2009
comment
Я никогда не пробовал плитки и просто просматривал документацию, но мне любопытно, правильно ли мое восприятие: кажется, что есть много настроек (файлы конфигурации + необходимость писать классы java)? Самое замечательное в шаблонах Django заключается в том, что они в значительной степени просто работают, наследование и тому подобное очень легко сделать с помощью только родительского файла шаблона и дочернего файла шаблона, не требуя дополнительной настройки. - person Roy Tang; 09.09.2010
comment
Вам действительно стоит попробовать Rythm (rythmengine.com), он прост в использовании и обладает мощными функциями. Проверьте мой ответ ниже или перейдите на сайт, чтобы попробовать - person Gelin Luo; 14.12.2012
comment
У меня та же проблема, то есть найти подходящую структуру шаблонов, которая позволяет наследование шаблонов, как вы его описываете. Tiles действительно имеет эту функциональность, но файл, который вы называете базовым содержимым выше, определен в файле xml, что, на мой взгляд, доставляет много хлопот. Я бы предпочел иметь отдельный файл basiccontent.jsp, а не определение представления в файле xml. - person Emil G; 13.03.2013

Вы можете делать аналогичные вещи, используя файлы тегов JSP. Создайте свой собственный page.tag, содержащий структуру страницы. Затем используйте тег <jsp:body/> для вставки содержимого.

person Ben Lings    schedule 04.08.2009
comment
связанные: Уловки JSP для упрощения создания шаблонов? (краткое руководство по файлам тегов) - person f4lco; 23.02.2011

Вы можете использовать быстрый фреймворк для наследования шаблонов JSP

base.jsp

%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>  
<html>  
    <head>
        <rapid:block name="head">
            base_head_content
        </rapid:block>
    </head>  
    <body>  
        <br />  
        <rapid:block name="content">
            base_body_content
        </rapid:block>  
    </body>  
</html>

child.jsp

<%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>  
<rapid:override name="content">  
     <div>
        <h2>Entry one</h2>
        <p>This is my first entry.</p>
    </div>
</rapid:override>  

<!-- extends from base.jsp or <jsp:include page="base.jsp"> -->  
<%@ include file="base.jsp" %> 

вывод

<html>
<head>  
 base_head_content
</head>  
<body>  
    <br />  
    <div>
        <h2>Entry one</h2>
        <p>This is my first entry.</p>
    </div>
</body>  
</html>

исходный код

http://rapid-framework.googlecode.com/svn/trunk/rapid-framework/src/rapid_framework_common/cn/org/rapid_framework/web/tags/

person badqiu    schedule 21.07.2010
comment
есть синтаксическая ошибка в вашем первом «head› balise», которое вы получили вместо головы - person Luc DUZAN; 09.05.2014

Другие варианты, которые стоит изучить, включают Sitemesh, который основан на идее декораторов страниц, и Java Server Faces (JSF), в котором используются веб-компоненты пользовательского интерфейса. И пока мы говорим о быстрой разработке с использованием веб-фреймворков на платформе Java, я рекомендую вам попробовать Grails. У него та же миссия, что и у Django; а именно, быстрая разработка веб-приложений, основанная на соглашении, а не конфигурации.

Надеюсь, предложений для одного поста не так уж и много. : o)

person yawmark    schedule 29.01.2009

Моя любимая технология веб-интерфейса Java - Facelets. Он поддерживает самые Django-подобные шаблоны, которые я когда-либо видел. Он не такой чистый, как Django, но вы получаете те же преимущества наследования.

Вместо Django:

Супер:

{% block content %}{% endblock %}

Sub:

{% block content %}inheriting template's content here{% endblock %}

Синтаксис Facelet выглядит следующим образом:

Супер:

<ui:insert name="content"></ui:insert>

Sub:

<ui:define name="content">inheriting template's content here</ui:define>
person jaketrent    schedule 17.11.2009
comment
Можно ли использовать Facelets без JSF? - person Dan Passaro; 28.06.2015

Механизм шаблонов Rythm реализовал элегантный подход к наследованию шаблонов.

Итак, предположим, что ваш шаблон макета (родительский шаблон) называется main.html:

<h1>@get("title", "default main page")</h1>
<div id="left-panel">@render("leftPanel")<div>
<div id="right-panel">@render("rightPanel")</div>
<div id="main-content">@render()</div>
<div id="footer">
@render("footer"){
   @**
    * the content here is supplied if the child template failed 
    * to provide it's own footer implementation
    *@
   <div class="footer">copyright 2012 ...</div>
}
</div>

А вот и ваш целевой шаблон:

@extends(main)
@set(title: "My Cool Page")
@section("leftPanel") {
<ul class="menu">
...
</ul>
}

@section("rightPanel") {
<div class="news">
...
</div>
}

@*** note no "footer" section supplied so the default content will be used **@

@*** the rest is for the main content **@
...

Проверьте реальную демонстрацию на http://rythmengine.com/demo/testdefaultlayoutcontent

Подробный документ можно найти по адресу http://www.playframework.org/modules/rythm. Хотя он нацелен на Play! Framework, большая часть контента также применима к чистому движку rythm без Play! Framework.

person Gelin Luo    schedule 02.09.2012