【问题标题】:How can I reuse code in JSP?如何在 JSP 中重用代码?
【发布时间】:2011-08-29 14:53:59
【问题描述】:

例如,一个用户将在我的整个应用程序中呈现为

<div class="user">
  <p class="username">${user.name}</p>
  <p class="karma">${user.karma}</p>
  <img src="/users/${user.id}"/>
</div>

我怎样才能重用这个代码块?

注意 - 我的代码在标签内运行,所以我不能为此(或任何 JSP)使用标签,否则我会收到 Scripting elements are disallowed here 错误。

编辑

我正在尝试使用标记文件,但出现 PropertyNotFoundException。

这是我的标签文件'user.tag':

<%@tag description="User" pageEncoding="UTF-8" %>

<a href="../user/showUser.do?userId=${user.id}">
    <p>${user.name}</p>
    <img class='avatar' src='${user.avatarUrl}' alt=""/>
</a>

以及在jsp中的用法:

其中 job.poster 是具有 idnameavatarUrl 属性的 java bean。 如果我添加

<%@attribute name="user" %>

到标签文件,然后我得到一个异常

Property 'id' not found on type java.lang.String

【问题讨论】:

    标签: java jsp


    【解决方案1】:

    从 JSP 2.0 开始,还有另一种标签:标签文件。标记文件是 JSP 自定义标记,编写为 JSP 模板本身,这似乎是您想要的。

    http://fforw.de/post/creating-jsp-layouts-with-page-tags/ 展示了如何使用这样的标签文件作为通用布局解决方案。将它们用作组件应该更容易。

    【讨论】:

    【解决方案2】:

    您应该能够在标签文件中使用标签文件;这在 JSP 2.2 容器中对我有用:

    <%-- mytag.tag --%>
    <%@tag description="demo code" pageEncoding="UTF-8"%>
    <%@taglib prefix="cust" tagdir="/WEB-INF/tags" %>
    <%@attribute name="message"%>
    <cust:mytag2 message="${message}" /><%-- uses mytag2.tag --%>
    

    如果失败,您可以使用包含指令:&lt;%@include file="/WEB-INF/jspf/fragment.jspf" %&gt;

    请注意,规范中提到了标签:

    Directive Available? Interpretation/Restrictions
    ======================================================================
    page      no         A tag file is not a page. The tag directive must
                         be used instead. If this directive is used in a
                         tag file, a translation error must result.
    

    因此,fragment.jspf 不得包含标签中不支持的任何元素,包括 page 指令。

    【讨论】:

      【解决方案3】:

      对于您给出的示例,听起来需要一些模板框架来在每个屏幕上显示用户徽章。在最简单的层面上,这可能只是一个 jsp:include,它总是包含您的“UserBadge.jsp”。

      如果您在 Web 框架上运行,例如JSF,您可以使用 Facelet 模板或为此编写自定义组件。所以答案取决于你有什么框架。将其分解为 JSP 和 JSTL - 包含的 JSP 或 javax.servlet.jsp.tagext.Tag 肯定会减少重复。

      始终小心遵循 DRY 原则...不要重复自己!

      【讨论】:

      • 我想为此使用一个标签,但不确定如何定义它。你能指出我的代码示例吗?
      【解决方案4】:

      我觉得有时创建一个 .tag 文件是多余的(特别是如果它只用于一页),而且我多年来一直想要您描述的内容,所以我编写了自己的简单解决方案。看这里: https://stackoverflow.com/a/25575120/1607642

      【讨论】:

        【解决方案5】:

        为什么不使用自定义标签或jsp函数。

        谢谢,

        【讨论】:

        • 你的意思是:你为什么不用自定义标签或者jsp函数?对吧?
        • 更新了我的问题以解释原因。
        • 而且,由于很挑剔,我认为标题应该是 JSTL 而不是 JSLT。
        • @ripper234 标签也可以包含 jsp。将该标记主体设为 JSP。它应该可以工作。
        • “将标签主体设为 JSP”是什么意思?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-05
        • 2010-10-12
        • 2011-07-06
        • 2017-09-15
        相关资源
        最近更新 更多