Như skaffman đã đề xuất , Tệp thẻ JSP 2.0 là đầu gối của con ong.
Hãy lấy ví dụ đơn giản của bạn.
Đặt những thứ sau vào WEB-INF/tags/wrapper.tag
<%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
<html><body>
<jsp:doBody/>
</body></html>
Bây giờ trong example.jsp
trang của bạn :
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<t:wrapper>
<h1>Welcome</h1>
</t:wrapper>
Điều đó làm chính xác những gì bạn nghĩ nó làm.
Vì vậy, hãy mở rộng điều đó thành một cái gì đó tổng quát hơn một chút.
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>
Để sử dụng điều này:
<%@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>
Cái đó mua gì cho bạn? Thực sự rất nhiều, nhưng nó thậm chí còn tốt hơn ...
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>
Để sử dụng điều này: (giả sử chúng tôi có một biến người dùng trong yêu cầu)
<%@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>
Nhưng nó biến bạn muốn sử dụng khối chi tiết người dùng đó ở những nơi khác. Vì vậy, chúng tôi sẽ cấu trúc lại nó.
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/>
Bây giờ ví dụ trước trở thành:
<%@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>
Cái hay của các tệp Thẻ JSP là về cơ bản cho phép bạn gắn thẻ đánh dấu chung và sau đó cấu trúc lại nó theo nội dung trái tim của bạn.
JSP Tag Files
có khá nhiều thứ chiếm đoạt như Tiles
vv, ít nhất là đối với tôi. Tôi thấy chúng dễ sử dụng hơn nhiều vì cấu trúc duy nhất là những gì bạn cung cấp cho nó, không có gì có trước. Ngoài ra, bạn có thể sử dụng các tệp thẻ JSP cho những thứ khác (như đoạn chi tiết người dùng ở trên).
Đây là một ví dụ tương tự như DisplayTag mà tôi đã thực hiện, nhưng tất cả đều được thực hiện với Tệp thẻ (và Stripes
khung, đó là s: tags ..). Điều này dẫn đến một bảng các hàng, màu sắc xen kẽ, điều hướng trang, v.v .:
<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>
Tất nhiên các thẻ làm việc với JSTL tags
(như c:if
, v.v.). Điều duy nhất bạn không thể làm trong phần thân của thẻ tệp thẻ là thêm mã scriptlet Java, nhưng điều này không quá giới hạn như bạn nghĩ. Nếu tôi cần công cụ scriptlet, tôi chỉ cần đặt logic vào một thẻ và thả thẻ vào. Dễ dàng.
Vì vậy, các tệp thẻ có thể là khá nhiều bất cứ điều gì bạn muốn chúng là. Ở cấp độ cơ bản nhất, đó là tái cấu trúc cắt và dán đơn giản. Lấy một đoạn bố cục, cắt nó ra, thực hiện một số tham số đơn giản và thay thế nó bằng một lệnh gọi thẻ.
Ở cấp độ cao hơn, bạn có thể thực hiện những điều tinh vi như thẻ bảng này tôi có ở đây.