正如skaffman所建议的那样,JSP 2.0标签文件是蜜蜂的膝盖。
让我们举个简单的例子。
将以下内容放入WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
现在在您的页面中:example.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
这完全符合您的想象。
因此,让我们将其扩展到更通用的东西。WEB-INF/tags/genericpage.tag
<%@tag description="Overall Page template" pageEncoding="UTF-8"%>
<%@attribute name="header" fragment="true" %>
<%@attribute name="footer" fragment="true" %>
<html>
<body>
<div id="pageheader">
<jsp:invoke fragment="header"/>
</div>
<div id="body">
<jsp:doBody/>
</div>
<div id="pagefooter">
<jsp:invoke fragment="footer"/>
</div>
</body>
</html>
要使用它,
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:genericpage>
<jsp:attribute name="header">
<h1>Welcome</h1>
</jsp:attribute>
<jsp:attribute name="footer">
<p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
</jsp:attribute>
<jsp:body>
<p>Hi I'm the heart of the message</p>
</jsp:body>
</t:genericpage>
这能给你带来什么?真的很多,但它变得更好了...
WEB-INF/tags/userpage.tag
<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@attribute name="userName" required="true"%>
<t:genericpage>
<jsp:attribute name="header">
<h1>Welcome ${userName}</h1>
</jsp:attribute>
<jsp:attribute name="footer">
<p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
</jsp:attribute>
<jsp:body>
<jsp:doBody/>
</jsp:body>
</t:genericpage>
要使用这个:(假设我们在请求中有一个用户变量)
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:userpage userName="${user.fullName}">
<p>
First Name: ${user.firstName} <br/>
Last Name: ${user.lastName} <br/>
Phone: ${user.phone}<br/>
</p>
</t:userpage>
但是,它会使您喜欢在其他地方使用该用户详细信息块。因此,我们将重构它。WEB-INF/tags/userdetail.tag
<%@tag description="User Page template" pageEncoding="UTF-8"%>
<%@tag import="com.example.User" %>
<%@attribute name="user" required="true" type="com.example.User"%>
First Name: ${user.firstName} <br/>
Last Name: ${user.lastName} <br/>
Phone: ${user.phone}<br/>
现在,前面的示例变为:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:userpage userName="${user.fullName}">
<p>
<t:userdetail user="${user}"/>
</p>
</t:userpage>
JSP 标记文件的美妙之处在于,它基本上允许您标记通用标记,然后将其重构为核心内容。
JSP Tag Files
几乎篡夺了诸如此类的东西,至少对我来说是这样。我发现它们更容易使用,因为唯一的结构是你给它的东西,没有什么先入为主的。另外,您可以将 JSP 标记文件用于其他用途(如上面的用户详细信息片段)。Tiles
下面是一个类似于我完成的 DisplayTag 的示例,但这一切都是使用 Tag Files(以及框架,即 s: tags..) 完成的。这将产生一个包含行、交替颜色、页面导航等的表格:Stripes
<t:table items="${actionBean.customerList}" var="obj" css_class="display">
<t:col css_class="checkboxcol">
<s:checkbox name="customerIds" value="${obj.customerId}"
onclick="handleCheckboxRangeSelection(this, event);"/>
</t:col>
<t:col name="customerId" title="ID"/>
<t:col name="firstName" title="First Name"/>
<t:col name="lastName" title="Last Name"/>
<t:col>
<s:link href="/Customer.action" event="preEdit">
Edit
<s:param name="customer.customerId" value="${obj.customerId}"/>
<s:param name="page" value="${actionBean.page}"/>
</s:link>
</t:col>
</t:table>
当然,标签与(如 等)一起使用。在标签文件标签的正文中,您唯一不能做的就是添加Java scriptlet代码,但这并不像您想象的那么大。如果我需要 scriptlet 的东西,我只需将逻辑放入一个标签中,然后把标签放进去。容易。JSTL tags
c:if
因此,标签文件几乎可以是您想要的任何内容。在最基本的层面上,它是简单的剪切和粘贴重构。抓取一大块布局,将其剪切掉,执行一些简单的参数化,然后将其替换为标记调用。
在更高的层次上,你可以做复杂的事情,比如我在这里的这个表标签。