JSP模板继承

时间:2009-01-29 03:29:47

标签: java django jsp templates

来自Django的背景,我经常使用“模板继承”,其中多个模板从公共基础继承。在JSP中有一种简单的方法吗?如果没有,是否有一个替代JSP来做到这一点(除了Jython上的Django:)

基本模板

<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是“Insert Title Here”,而content.body是“Insert Body Here”)

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

6 个答案:

答案 0 :(得分:18)

您可以使用JSP标记文件执行类似的操作。创建包含页面结构的自己的page.tag。然后使用<jsp:body/>标记插入内容。

答案 1 :(得分:12)

您可以使用快速框架进行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/

答案 2 :(得分:10)

您可能希望查看Tiles

编辑:在瓷砖的相关说明中,您可能需要查看Struts。这不是你想要的东西(那是瓷砖),但它对来自Django的人很有用。

答案 3 :(得分:4)

值得探索的其他选项包括基于页面装饰器构思的Sitemesh和使用基于Web的UI组件的Java Server Faces(JSF)。虽然我们正在讨论Java平台上的Web框架的快速开发,但我建议您查看Grails。 Django也有同样的使命;即基于约定优于配置的快速Web应用程序开发。

希望对一篇文章的建议不是太多。 :O)

答案 4 :(得分:3)

我最喜欢的Java Web前端技术是Facelets。它支持我见过的最像Django的模板。它不像Django那样干净,但你可以获得相同的继承效益。

而不是Django:

超级:

{% block content %}{% endblock %}

子:

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

Facelet的语法是这样的:

超级:

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

子:

<ui:define name="content">inheriting template's content here</ui:define>

答案 5 :(得分:1)

Rythm Template engine已经实现了一种优雅的模板继承方法。

假设您的布局模板(父模板)名为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的纯粹节奏引擎。