為何需要自定義標籤?
- 替代醜陋的 Scriptlet (
<% ... %>),分離業務邏輯與視圖。
- 降低維護成本,美工可直接編寫類 HTML 標籤參與開發。
- 封裝複雜功能於簡單標簽,提升團隊協作效率。
JSP 2.0 簡化開發步驟
- 開發標籤處理類 → 繼承
SimpleTagSupport。
- 建立
.tld 檔案描述標籤庫。
- JSP 頁面引用標籤庫前綴使用。
標籤處理類規範
- 屬性對應 getter/setter。
- 覆寫
doTag() 產生頁面內容。
- 透過
getJspContext().getOut() 取得輸出流。
最簡範例:HelloWorld 標籤
public class HelloWorldTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
getJspContext().getOut().write("Hello World");
}
}
TLD 定義 (hello.tld)
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="https://java.sun.com/xml/ns/javaee" version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>hello</short-name>
<uri>https://example.com/tags/hello</uri>
<tag>
<name>hello</name>
<tag-class>com.example.tags.HelloWorldTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
JSP 使用
<%@ taglib prefix="my" uri="https://example.com/tags/hello" %>
<my:hello /> <!-- 輸出 Hello World -->
進階:帶屬性與主體內容的標籤
public class GreetingTag extends SimpleTagSupport {
private String name;
public void setName(String name) { this.name = name; }
@Override
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
String body = (getJspBody() != null) ?
(new java.io.StringWriter() {{ getJspBody().invoke(this); }}).toString() : "";
out.write("Hello, " + name + "! " + body + "
");
}
}
<my:greeting name="Alice">
歡迎來到我們的網站!
</my:greeting>
標籤庫在框架中的地位
- Struts 2、Spring MVC、JSF 皆內建豐富標籤庫 (
<s:form>, <form:input>, <h:inputText>)。
- 掌握自定義標籤開發,是邁向框架開發者/架構師的關鍵技能。