【问题标题】:JSP template inheritanceJSP模板继承
【发布时间】:2010-10-04 04:09:57
【问题描述】:

来自 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>

【问题讨论】:

    标签: java django jsp templates


    【解决方案1】:

    您可以使用 JSP 标记文件做类似的事情。创建您自己的包含页面结构的page.tag。然后使用&lt;jsp:body/&gt; 标签插入内容。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 第一个 应答器中存在语法错误,而不是 head
    【解决方案3】:

    您可能想查看Tiles

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

    【讨论】:

    • 我从未尝试过瓷砖,只是浏览了文档,但我很好奇我的看法是否正确:似乎有很多设置(配置文件 + 需要编写 java 类)? Django 模板的伟大之处在于它们几乎可以工作,继承等仅使用父模板文件和子模板文件就可以非常容易地完成,无需额外配置。
    • 你真的应该试试 Rythm (rythmengine.com),它使用简单,功能强大。在下面查看我的答案或去网站尝尝
    • 我有同样的问题,即找到一个合适的模板框架,允许模板继承,就像你描述的那样。 Tiles 确实有这个功能,但是你上面所说的基本内容的“文件”是在一个 xml 文件中定义的,在我看来这很麻烦。我宁愿有一个单独的文件 basiccontent.jsp 而不是 xml 文件中的“视图定义”。
    【解决方案4】:

    其他值得探索的选项包括 Sitemesh,它基于页面装饰器的思想,以及 Java Server Faces (JSF),它采用基于 Web 的 UI 组件。当我们谈论在 Java 平台上使用 Web 框架进行快速开发时,我鼓励您查看Grails。它与 Django 具有相同的使命;即,基于约定优于配置的快速 Web 应用开发。

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

    【讨论】:

      【解决方案5】:

      我最喜欢的 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>
      

      【讨论】:

      • 是否可以在不使用 JSF 的情况下使用 Facelets?
      【解决方案6】:

      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 的纯节奏引擎。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 2013-12-13
        • 2011-04-08
        • 2016-01-19
        • 2016-11-14
        • 2011-02-27
        • 2014-10-21
        • 1970-01-01
        相关资源
        最近更新 更多