簡體   English   中英

如何在JSP中重用代碼?

[英]How can I reuse code in 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

從JSP 2.0開始,還有另一種標簽:標簽文件。 標記文件是作為JSP模板本身編寫的JSP自定義標記,這似乎是您想要的。

http://fforw.de/post/creating-jsp-layouts-with-page-tags/顯示了如何使用這樣的標記文件作為一般布局解決方案。 使用它們作為組件應該更容易。

您應該能夠在標記文件中使用標記文件; 這適用於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指令。

對於您給出的示例,聽起來需要一些模板框架,以在每個屏幕上顯示用戶徽章。 在最簡單的層面上,這可能只是一個jsp:include,它總是包含你的“UserBadge.jsp”。

如果您在Web框架上運行,例如JSF,您可以使用Facelet模板或為此編寫自定義組件。 所以答案取決於你擁有的框架。 將其分解為JSP和JSTL - 包含的JSP或javax.servlet.jsp.tagext.Tag肯定會減少重復。

要小心遵循干燥原則......不要重復自己!

我覺得有時創建一個.tag文件是過度的(特別是如果它只用於一頁),而且我想要你多年來所描述的內容,所以我編寫了我自己的簡單解決方案。 請參見此處: https//stackoverflow.com/a/25575120/1607642

為什么不使用自定義標記或jsp函數。

謝謝,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM