如何在JSP中重用代码?

时间:2011-05-20 12:02:54

标签: java jsp

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

<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

5 个答案:

答案 0 :(得分:6)

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

http://fforw.de/post/creating-jsp-layouts-with-page-tags/显示了如何将此类标记文件用作常规布局解决方案。使用它们作为组件应该更容易。

答案 1 :(得分: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 --%>

如果失败,您可以使用include指令:<%@include file="/WEB-INF/jspf/fragment.jspf" %>

请注意,规范说明了标签:

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指令。

答案 2 :(得分:1)

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

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

要小心遵守干燥原则......不要重复自己!

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

谢谢,