来自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>
答案 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>
源代码
答案 2 :(得分:10)
答案 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的纯粹节奏引擎。