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

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

30 голосов
/ 29 января 2009

Исходя из фона в 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>

Ответы [ 6 ]

18 голосов
/ 05 августа 2009

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

12 голосов
/ 21 июля 2010

Вы можете использовать quick-framework для наследования шаблонов 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 / багажник / быстродействующего рамки / SRC / rapid_framework_common / сп / орг / rapid_framework / веб / теги /

10 голосов
/ 29 января 2009

Возможно, вы захотите посмотреть Tiles .

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

4 голосов
/ 29 января 2009

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

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

3 голосов
/ 18 ноября 2009

Моя любимая технология веб-интерфейса Java - Facelets. Он поддерживает большинство шаблонов, похожих на 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>
1 голос
/ 03 сентября 2012

Механизм шаблонов 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, большая часть контента также применяется к движку с чистым ритмом без Play! Framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...