例如,用户将在我的整个应用程序中呈现为
<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是具有id
,name
和avatarUrl
属性的java bean。
如果我添加
<%@attribute name="user" %>
到标记文件,然后我得到一个异常
Property 'id' not found on type java.lang.String
答案 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函数。
谢谢,